# Auf JButton in Arraylist zugreifen



## erazor2106 (12. Jun 2010)

Hallo, und zwar bin ich gerade dabei eine interaktive Oberfläche zu entwerfen und habe ein wenig Probleme mit den Buttons. Undzwar sollen zunächst automatisch eine ganze Reihe von Buttons erzeugt werden (später dann manuell durch den Benutzer). Diese werden der Reihe nach in einer ArrayList abgelegt


```
public ArrayList<JButton> array = new ArrayList<JButton>(); 
public JButton neuerButton;
```

und 


```
for ( int i = 0 ; i < 20 ; i++ )
 { 
     neuerButton = new JButton();   
     neuerButton.setBounds(10, 10+i*30, 50, 20);
     array.add(neuerButton);  
 }
```


mein Problem ist nun der ActionListener. Wie kann ich dann einen beliebigen dieser erzeugten Button anklicken und eine Aktion auslösen, ohne vorher für jeden der Buttons einen extra ActionListener erstellt zu haben?
Ich wollte es mit einem dummyButton probieren, also das man der Reihe nach die gespeicherten Buttons dem dummy zuordnet, also 

```
dummyButton = array.get(i)
```
und dieser dummy besitzt ein ActionPerformed.

habt ihr da vielleicht eine Idee?


----------



## eRaaaa (12. Jun 2010)

Du musst nicht für jeden einen neuen Listener machen!
Wie du schon richtig erkannt hast, reicht einer wenn sie eh alle die selbe Aktion haben, d.h. du erstellst einmal ein Listener:

```
ActionListener listener = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				//todo...
			}
		};
```

und registrierst diesen einfach den Buttons die du in der Schleife erstellst mittels addActionListener(listener)...

Beantwortet das deine Frage?


----------



## erazor2106 (12. Jun 2010)

Also meinst du, direkt an der Stelle der Schleife wo ich den aktuellen Button erzeuge weise ich ihm den Listener zu, also jedem immer den gleichen. 

Und ich brauch dann keinen dummy mehr, sondern bin dann schon fertig damit?

Weil ich halt dachte wenn ich das so mache, überschreibe ich ja den Listener mit dem aktuellen Button. Da wäre es für mich logisch wenn dieser dann nur noch auf den zuletzt erzeugten Button anspricht


----------



## eRaaaa (12. Jun 2010)

Ne den dummy-Button brauchst du nicht. Einem Button kann man mehrere Listener registrieren und ein Listener kann auch an mehreren anderen Buttons registriert werden, das ist kein Problem.Falls du innerhalb der actionPerformed den Button, welcher das Event ausgelöst hat, kennen musst, gibts dafür die Methode getSource --> JButton btn = (JButton) e.getSource();


----------



## erazor2106 (12. Jun 2010)

hey danke, der Tipp mit getSource hat mir sehr weiter geholfen. Hier für alle die es mal interessiert die fertige Version


```
public void neuerButton_ActionPerformed(ActionEvent evt)
    {
       int gefunden = 0;
       
       JButton suchen = (JButton) evt.getSource();
        for (int i = 0; i < array.size(); i++ )
         {
           if ( suchen == array.get(i) )
            {
              gefunden = i;
              break;
            }
         }

       String gefunden1 = String.valueOf(gefunden);
       knotennummer2.setText(gefunden1);
    }
```


----------



## eRaaaa (12. Jun 2010)

Joah, wobei du dir die Schleife auch sparen könntest 
a) Listen haben die Methode indexOf() mit der du den Index erhalten würdest
oder
b) du könntest in deiner anderen Schleife (in der die Buttons erstellst) einen "Action Command" setzen

```
neuerButton.setActionCommand(String.valueOf(i));
```
 und in der actionPerformed einfach darauf zugreifen mit evt.getActionCommand (wäre wohl die schnellste Variante)


----------



## erazor2106 (13. Jun 2010)

Alles klar, danke. Werd ich mal ausprobieren


----------

