# (GUI) JButton Farbe bei druck ändern



## kamm12 (15. Apr 2015)

Ahoihoi Leute,

ich versuche gerade etwas in das Java GUI mit Swing und AWT hereinzukommen, bin aber auf ein Problem mit ActionListenern und JButtons.

Kurz: Ich habe ein JButtonArray und möchte, dass ein gedrückter Button permanent die Farbe ändert wenn er gedrückt wird. 
Wie finde ich heraus welcher Button das ActionEvent ausgelöst hat? Wüsste ich dies könnte ich ihn ja direk ansprechen, oder? Oder gibt es gar eine viel bessere Möglichkeit das Problem zu lösen als ActionListener?

Hintergrund: Ich möchte eine Feld aus JButtons haben, in dem ich durch anklicken der Buttons "zeichnen" kann. Das ganze möchte ich dann später als IntegerArray ausgeben, aber das ist für mein Problem ja noch nicht wichtig.
Einen spezifischen Button bei einem Klick auf irgendeinen der Jbuttons bekomme ich verfärbt, aber das ist ja nicht was ich will.
Im Internet finde ich nur Anleitungen wie man EINEN SPEZIFISCHEN JButton ändert, aber nicht wie dynamisch einer aus einem Array ausgewählt wird!

Vielen Dank im vorraus!

Die Klasse für den Frame:


```
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

@SuppressWarnings("serial")
public class RetroFrameTest extends JFrame {

	Container meinContainer;
	private int cols;
	private int rows;
	JButton[] pixel;

	public RetroFrameTest(int _cols, int _rows) {
		cols = _cols;
		rows = _rows;
		meinContainer = getContentPane();
		meinContainer.setLayout(new GridLayout(rows, cols));
		initialisiereAusgabe();

	}

	ActionListener klickListener = new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			pixel[45].setBackground(Color.ORANGE);	//Setzt den Button pixel[45] orange, ich möchte aber den Button, der gedrückt wurde in der Farbe ändern!
			//Wie finde ich heraus, welcher Button dieses ActionEvent erzeugt hat, bzw welcher Listener es aufgenommen hat?
		};

	};

	private void initialisiereAusgabe() {
		pixel = new JButton[(cols * rows)];
		for (int i = 0; i < (cols * rows); i++) {
			pixel[i] = new JButton();
			meinContainer.add(pixel[i]);
			pixel[i].setBackground(Color.GRAY);
			pixel[i].setOpaque(true);
			pixel[i].addActionListener(klickListener);
		}
	}

	public void ausgabeFigur(int[] figur) {
		for (int i = 0; i < figur.length; i++) {
			if (figur[i] == 1) {
				pixel[i].setBackground(Color.ORANGE);
			}
		}
	}
	
}
```

Die Main Methode:


```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

@SuppressWarnings("serial")
public class MeinFrame extends JFrame {
	public static void main(String[] args) {

		RetroFrameTest screen = new RetroFrameTest(20, 15, figur);
		screen.setTitle("RetroScreen");
		screen.setSize(400, 300);
		screen.setLocation(200, 200);
		screen.setVisible(true);
		screen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}
```


----------



## Java20134 (15. Apr 2015)

Du bekommst den geklichten Button mit:

```
JButton button; 
public void actionPerformed(ActionEvent arg0){
    if(arg0.getSource() == button){
         //TODO
    }
}
```
und damit kannst du in der if Schleife etwas einsetzen was gemacht werden soll. 
In deinem Fall also eine while Schleife, wo du immer wieder die Farbe mit folgender Methode änderst: 

```
JButton button; 
button.setBackground(new Color(Math.random()*256, Math.random()*256, Math.random()*256));
```

Eine andere Möglichkeit ist mir aber nicht bekannt!


----------



## Diabolus (15. Apr 2015)

Du kannst in der actionPerformed Methode mittels _e.getSource_ den Auslöser abfragen.
Also dann in einer Schleife wie etwa so:

```
public void actionPerformed(ActionEvent e) {
     for(int i = 0; i < pixel.length(); i++) {
          if (e.getSource() == pixel[i]) {
			pixel[i].setBackground(Color.ORANGE);
          }
     }
};
```

Ich hoffe ich konnte deine Frage beantworten


----------



## kamm12 (15. Apr 2015)

Vielen Dank eich beiden!

Das war die Lösung für mein Problem!


----------

