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
for(int i =0; i <20; i++){
neuerButton =newJButton();
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
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:
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
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();
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
Code:
neuerButton.setActionCommand(String.valueOf(i));
und in der actionPerformed einfach darauf zugreifen mit evt.getActionCommand (wäre wohl die schnellste Variante)