2013-01-26, 21:53
  #1
Medlem
Softmuppens avatar
Programmet ska fungera så att när jag trycker på en JButton så ska den ändra sin ikon. Jag har problemet att jag inte kan välja vilken knapp jag ska ändra. När jag trycker på vilken knapp som helst så anropas changeIcon för den sista knappen.

Mitt fel är att när changeIcon anropas så ändras den sista knappen i min GridLayout på grund av att det är den som är referensen till instansvariabeln button. Men jag vet inte hur jag ska ska lösa mitt problem :/

Kod:
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.Image;
import javax.swing.ImageIcon; 
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Action;
import java.util.ArrayList;

public class Editor {
    private ImageIcon buttonIcon = new ImageIcon(this.getClass().getResource("images/tiles/wood_floor.png"));
    private ImageIcon activeIcon = new ImageIcon(this.getClass().getResource("images/tiles/stone_brick.png"));

    private static int row = 5;
    private static int col = 5;
    
    private JFrame frame;
    private Action changeIcon;
    private JButton button;  
    
    public Editor(){
        makeFrame();
    }

    public void makeFrame() {
        JFrame frame = new JFrame("Game Map-Editor");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridLayout(col, row));
        
        for(int i = 0; i<(row*col); i++){
            button = new JButton(buttonIcon);
            
            button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {changeIcon(button);}
            });
            
            frame.add(button);
        }
        
        frame.setResizable(false);
        frame.pack();
        frame.setVisible(true);
    }
    public static void main(String[] args) {
    	new Editor();
    }
    public void changeIcon(JButton button){
        button.setIcon(activeIcon);
    }
}


Tack på förhand // Softmuppen
Citera
2013-01-26, 22:33
  #2
Medlem
Du använder hela tiden samma referens, vilket du nog insett vid det här laget. Det är därför den sista knappen alltid ändras eftersom du använder samma referens (button) när du sätter samtliga action-listeners. Du måste med andra ord få en referens till det objektet där händelsen faktiskt ägde rum, vilket du kan få från ActionEvent-objektet.

Med andra ord kan du direkt i actionPerformed() skriva:

Kod:
((JButton)e.getSource()).setIcon(bla);

ActionEvent-objektet e innehåller en metod för att hämta referens till det objektet som triggade händelsen. Det är ett generellt objekt av typen Object, så du måste först casta den till JButton för att komma åt metoden setIcon().

Hoppas du förstod. Återkom gärna med frågor annars.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in