addActionListener-Befehle zusammenfassen?

Angiii

Erfahrenes Mitglied
Ich habe ein GUI, dass sich auf mehrere Klassen verteilt und auf dem sich sehr viele verschiedene Schaltflächen/Buttons/Sliders befinden. Um die Schaltflächen in den ActionListener einzubinden, brauche ich für jedes Element den addActionListener-Code in meiner Hauptklasse. Da sieht dort dann zum Beispiel so aus:

Code:
Panel1.Button1.addActionListener(this);
Panel1.Button2.addActionListener(this);
Panel1.Connect.addActionListener(this);
Panel2.Sliderxy.addChangeListener(this);
Panel2.Button3.addChangeListener(this);
Panel3.Button4.addChangeListener(this);
Panel3.Button5.addChangeListener(this);
Panel3.nochEinButton.ChangeListener(this);
// ...
Ist es möglich, alle Grafikelemente einer Klasse auf einmal dem ActionListener zuzuordnen? Ich würde mir wünschen, dass ich meine Schaltflächen mit weniger Code ansteuern könnte, in etwa auf diese Art:
Code:
Panel1.ForAllElements.addActionListener(this);
Panel2.ForAllElements.addActionListener(this);
Panel3.ForAllElements.addActionListener(this);
...

Geht das überhaupt?
Danke für Eure Antworten!
 
Hellas!

Du könntest soetwas machen:

Java:
        Component[] components = testFrame.getComponents();
        for(int i = 0; i < components.length; i++) {
            if(components[i] instanceof JButton) {
                ((JButton) components[i]).addActionListener(this);
            } else if ...
        }

Theoretisch könntest du das ganze in eine Methode packen und rekursiv gestalten.

Beste Grüße,
Billie
 
Aber du musst doch wissen auf welchem Element die Aktion ausgelöst wird. Ich finde es immer extrem unschön einen Listener für alles zu nehmen, um dann später doch wieder zu prüfen um welches Element es sich handelt.

Java:
private void initComponents(){
...
okButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){ okButtonPressed(e);}});
...
}

protected void okButtonPressed(ActionEvent e){
  //react on ok button press
}

So finde ich es immer noch am schönsten. Dann kann man an der Methode ablesen was sie tut. Wenn man das Event weglässt (meist braucht man dies ja nicht), kann man die selbe Aktion durch aufruf der Methode auch unabhängig von dem Button Press aufrufen.
 
@zejaIch versteh glaub ich worauf du hinauswillst. Auf diese Art wird mein Code übersichtlicher bzw. effizienter auch leider eben auch wieder ziemlich umfangreich. Mein Ziel war es eigentlich, den Code zu reduzieren.
 
Wie es eben so ist, wär natürlich beides schön - kurzer Code und bequeme Wartung.
Also wenn ich nach deinem Ansatz gehe, erzeuge ich praktisch für jedes Element einen eigenen Action Listener.

Ich bin jetzt gerade am experimentieren, diesen Ansatz umzusetzen. Ich würde aber doch noch ein paar Elemente mehr in den jeweiligen ActionListener integrieren (z.B. habe ich viele Radiobuttons, die ich je nach Funktionsgruppe in einem eigenen ActionListener haben will.
Wie füge ich ein 2. Element (z. B. quitButton) deinem neu erzeigen ActionListener hinzu?

Ich versuchte es mit folgendem Ansatz, aber irgendwie mag er nicht:
Code:
quitButton.addActionListener( okButtonPressed(e));

Danke nochmals:)
 
Das geht genau so wie es oben bei mir im Codebeispiel in Zeile 3 und 4 steht. ActionListener wird hier direkt anonym (also ohne eine extra Klasse) implementiert.
 
Danke, jetzt gehts. Code gespart hab ich zwar nicht, aber zumindest ist das Chaos jetzt besser verwaltet ;-).
 
Zurück