Java Erkennen welcher JButton gedrückt wurde

kiname

Cadet 3rd Year
Registriert
Nov. 2014
Beiträge
56
Hallo,

ich will eine art Mapeditor für ein 2d (Pokemonlike) spiel Programmieren.
Hierzu erstelle ich ein JButton 2D array, dass ich dann jeweils mit dem Image der Kachel ausfüllen will.
Ich erstelle also das JButton array mach die üblichen einstellungen sodass die buttons angezeit werden.

Mit der for schleife in ActionPerformed sollte eigentlich doch jeder Button Durchgelaufen werden und dann der richtige bearbeitet werden
aber es scheitert bereits bei der "if test" anweisung habe ich .equals() falsch verwendet?

if(o.equals(feld[0][0])) <-- Funktioniert nicht


Code:
JButton[][] feld;
...
for(int k=0; k<Frame.buttonPanel.length; k++){
	Frame.buttonPanel[k].setLayout(null);
	for(int i=0; i<sizex; i++){
	     for(int j=0; j<sizey; j++){
		feld[i][j]=new JButton();
		feld[i][j].setBounds(i*w,j*h,w,h);
		feld[i][j].addActionListener(this);
		feld[i][j].setBackground(new Color(0,0,0));
					
		Frame.buttonPanel[k].add(feld[i][j]);
					
		}
	}
	Frame.buttonPanel[k].setPreferredSize(new Dimension((sizex*w),(sizey*h)));
	Frame.buttonPanel[k].setMinimumSize(new Dimension((sizex*w),(sizey*h)));
}
...
//ActionListener
	public void actionPerformed(ActionEvent e) {
		Object o = e.getSource();
		System.out.println("ActionListener test");
		if(o.equals(feld[0][0]))
			System.out.println("feld 0 0");
		for(int i=0; i<sizex; i++){
			for(int j=0; j<sizey; j++){
				if(o.equals(feld[i][j])){
					System.out.println("Button "+i+" "+j);
				}
			}
		}
	}
 
Hi,
du könntest mit ActionCommand arbeiten:

Code:
//in der for-Schleife:
feld[i][j].setActionCommand("foo");

...
//ActionListener
public void actionPerformed(ActionEvent e) {
    String action = e.getActionCommand();
    System.out.println("ActionListener test");
    if(action.equals(feld[0][0].getActionCommand()))
        System.out.println("feld 0 0");
    for(int i=0; i<sizex; i++){
        for(int j=0; j<sizey; j++){
            if(action.equals(feld[i][j].getActionCommand()){
                System.out.println("Button "+i+" "+j);
            }
        }
    }
}

Die Benennung der Actioncommands musst dir dann halt überlegen damit die auch eindeutig sind.

Gruß
 
Zuletzt bearbeitet:
Danke für die Antwort funktioniert!

Jetzt noch ein anderes "kleines" Problem.
Warum wird der Button nicht Umgefärbt?

Code:
                feld[i][j].setActionCommand(""+i+" "+j);

                ...

	public void actionPerformed(ActionEvent e) {
		String s=e.getActionCommand();
		String[] ss = s.split(" ");
		int x1,x2;
		x1=Integer.parseInt(ss[0]);
		x2=Integer.parseInt(ss[1]);
		for(int i=0; i<sizex; i++){
			for(int j=0; j<sizey; j++){
				if(i==x1&&j==x2){
					System.out.println("Button "+i+" "+j);
					feld[i][j].setBackground(new Color(50,50,50));
				}
			}
		}	
	}
 
Warum machst du es dir so kompliziert? :) Schau dir mal die Klasse ActionEvent an. Diese hat eine Methode getSource(), welche dir das Objekt liefert, welches das Event ausgelöst hat.

Einfacher, als deine Button Matrix zu durchlaufen ist also folgendes. Das sollte funktionierten, wenn du den Event Listener nur auf JButtons registrierst (Code ist aber ungetestet):
Code:
public void actionPerformed(ActionEvent e) {
    JButton btnSource = (JButton) e.getSource();
    btnSource.setBackground(Color.red);
    
    //Evtl. ist das hier noch nötig
    btnSource.setContentAreaFilled(false);
    btnSource.setOpaque(true);
}
 
Zuletzt bearbeitet:
Gute Frage. Verwendest du ein bestimmtes LookAndFeel? Funktioniert es denn oben, also wird der Button schwarz bei
Code:
feld[i][j].setBackground(new Color(0,0,0));
?

Du kannst dir übrigens die for-Schleifen sparen - wenn es bei dem bleibt was du im Moment damit machst:
Code:
//actionListener
String s=e.getActionCommand();
String[] ss = s.split(" ");
int x1,x2;
x1=Integer.parseInt(ss[0]);
x2=Integer.parseInt(ss[1]);
System.out.println("Button " + s);
e.getSource().setBackground(new Color(50,50,50));

Farbprobleme siehe @NiThDi, mehr habe ich dazu auch nicht gefunden.
 
Zurück
Oben