ActionListener zusammenfassen?

Status
Nicht offen für weitere Antworten.
P

Pflaumbaum

Gast
Hallo,

ich habe ein GUI mit vielen verschiedenen Schaltflächen. Um if/else-Anfragen zu vermeiden, habe ich für jede Schaltfläche einen eignen ActionListener hinzugefügt:

Code:
private void handleProfiles(){ 
        	    	
    	panelProfile.getLoad1().addActionListener(new java.awt.event.ActionListener() {
    		public void actionPerformed(java.awt.event.ActionEvent e) {
				System.out.println("load1");
			}
    	});
    	
    	panelProfile.getLoad2().addActionListener(new java.awt.event.ActionListener() {
    		public void actionPerformed(java.awt.event.ActionEvent e) {
				System.out.println("load2");
			}
    	});
    	
    	panelProfile.getLoad3().addActionListener(new java.awt.event.ActionListener() {
    		public void actionPerformed(java.awt.event.ActionEvent e) {
				System.out.println("load3");
			}
    	});
    	
    	panelProfile.getLoad4().addActionListener(new java.awt.event.ActionListener() {
    		public void actionPerformed(java.awt.event.ActionEvent e) {
				System.out.println("load4");
			}
    	});
}

Jedoch gefällt mir nicht, dass ich soviel Code durch die einzelnen ActionListerner erhalte.
Ist es möglich den ActionListener in einer separeten Funktion zu extrahieren oder sonstwie zu verkürzen? Der Teil
Code:
"addActionListener(new java.awt.event.ActionListener() {
    		public void actionPerformed(java.awt.event.ActionEvent e) "
widerholt sich ja eigentlich immer nur. Da müsste es doch möglich sein, dass in eine Funktion zu bringen, oder?
Ist mein Code in der jetzigen Form überhaupt sinnvoll?

Vielen Dank im Voraus für Eure Antworten!
 

HoaX

Top Contributor
Du kannst allen den selben Actionlistener zuweisen und dort dann ActionEvent#getActionCommand verwenden um zu unterscheiden was du machen willst. Und nicht vergessen das ActionCommand vorher auch noch am Button passend zu setzen.
 

Marco13

Top Contributor
Das mit dem ActionCommand ist aber IMHO noch unschöner - unflexibler, weil Änderungen aufwändiger und die Behandlung der Events so ... "zentralistisch" ist. Wenn die Funktionen, die die Buttons erfüllen, "ähnlich" sind, könnte man sich da vielleicht eine elegante Methode ausdenken (grob im Sinne von http://www.java-forum.org/de/viewtopic.php?p=310844 ).

Ansonsten stimme ich dir zu, dass diese Wiederholung des Blocks
addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) {}}
nicht so schön ist, aber recht flexibel und doch kompakt genug, dass man damit leben kann. Die Alternative (jetzt erwähnt bestimmt gleich wieder jemand "Scala" und Closures und so :wink: ) wäre sowas wie
button.setMethodToCall({ someMethod("bla"); });
aber ... das wäre erstmal nur syntaktischer Zucker. Ein Mittelding wäre, mit reflection sowas zu machen wie
button.addActionListener(new GeneralActionListener(this, "load"));
aber :? hm... man muss es nicht übertreiben.
 
G

Guest

Gast
Danke Marko für deine schnelle Antwort und den Link. Hab da jetzt mal ein bißchen rumgespielt.
Was haltet Ihr von dieser Lösung mit einem Array? Gut oder eher nicht so?

Code:
JToggleButton [] button = new JToggleButton[4];
    	button[0] = panelProfile.getLoad1();
    	button[1] = panelProfile.getLoad2();
    	button[2] = panelProfile.getLoad3();
    	button[3] = panelProfile.getLoad4();
    	
    	for (int i=0; i<4; i++){
           final int number = i;
            button[i].addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent e){
                    System.out.println(number);
                  
                }
            });
          
        }
 
S

SlaterB

Gast
schon recht ordentlich

denkbar wäre auch, die Buttons in einer List zu speichern
und in der actionPerformed,

int number = list.indexOf(e.getSource());
zu bestimmen,

aber diese Nummer wird sich gewiss nicht ändern im Laufe des Programmes,
da ist so eine finale Variable nicht verkehrt
 
G

Guest

Gast
Mmh mit "List" hab ich ja noch gaaaaaaarnix gemacht. Hab jetzt mal ein bißchen rumgespielte und das ist mein Ergebnis:

Code:
private ArrayList<JToggleButton> list1 = new ArrayList<JToggleButton>();
        list1.add(0, panelProfile.getLoad1()); 
    	list1.add(1, panelProfile.getLoad2());
    	list1.add(2, panelProfile.getLoad3());
    	list1.add(3, panelProfile.getLoad4());

    	
    	for (int i=0; i<4; i++){
    		list1.get(i).addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent e){
                    System.out.println(list1.indexOf(e.getSource()));
              }
        });
          
        }
Ist zumindest nicht schwerer als meine Array-Lösung und funktioniert auch recht gut. Was sind die Vorteile der List-Lösung?
 
S

SlaterB

Gast
die Reihenfolge der Liste kann geändert werden und der ActionListener wird immer den richtigen Index zurückgeben,

die andere Lösung suggerierte, dass 'final int number' etwas mit der Position von button im button[]-Array zu tun hat,
dies muss aber gar nicht so sein, wenn das Array danach noch beliebig durchmischt wird

edit:

außerdem kann man bei der List-Variante ganz auf i verzichten, sofern man Java 1.5 verwendet:

for (JButton b : list1){
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
System.out.println(list1.indexOf(e.getSource()));
}
});

noch wichtiger:
außerdem könnte ein und derselbe ActionListener allen Buttons zugewiesen werden, es muss nicht jeweils ein neuer Listener sein
 
P

Pflaumbaum

Gast
Hey nicht schlecht. Das ist so ziemlich genau das was ich gesucht hatte. Ich glaub "List" wird meine neue Lieblingsfunktion ;-). Aber das mit dem Index-weglassen hab ich noch nicht so ganz kapiert. Wenn ich die Reihenfolge meiner "list1.add" ändere, geht das nämlich nicht mehr...

Also z.B. bei
Code:
list1.add(0, panelProfile.getLoad1());
list1.add(3, panelProfile.getLoad4()); 
list1.add(2, panelProfile.getLoad3());
list1.add(1, panelProfile.getLoad2());

Oder muss die Listreihenfolge vom vorherein richtig definiert werden?

Jedenfalls vielen Dank für Deine Hilfe. Hat mir echt geholfen!
 
S

SlaterB

Gast
'Index-weglassen ' meinte ich bei der for i-Schleife, siehe meinen Code,

bei list.add braucht man generell keinen Index,
list1.add(panelProfile.getLoad1());
list1.add(panelProfile.getLoad4());
list1.add(panelProfile.getLoad3());
list1.add(panelProfile.getLoad2());
ginge,


list1.add(0, panelProfile.getLoad1());
list1.add(3, panelProfile.getLoad4());

ist schlecht, vor dem zweiten Befehl hat List nur eine Länge von 1, da kannst du nichts an Position 3 einfügen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E ActionListener Java Basics - Anfänger-Themen 4
U Eigenschaft eines JTextfiels per ActionListener ändern... Java Basics - Anfänger-Themen 2
U HILFE! - per ActionListener Felder enablen....... Java Basics - Anfänger-Themen 5
C JButton reagiert nicht auf actionListener Java Basics - Anfänger-Themen 15
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
J Array Actionlistener Java Basics - Anfänger-Themen 9
J ActionListener von JCheckBox im Knoten von JTree funktioniert nicht Java Basics - Anfänger-Themen 2
P Erste Schritte ActionListener Java Basics - Anfänger-Themen 2
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
J Erste Schritte Actionlistener für tbar/ JButton Java Basics - Anfänger-Themen 15
krgewb ActionListener Java Basics - Anfänger-Themen 1
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
T Konsolenscanner startet nicht durch Aufruf von Actionlistener Java Basics - Anfänger-Themen 4
F ActionListener mit Files etc Java Basics - Anfänger-Themen 12
N Probleme mit dem ActionListener Java Basics - Anfänger-Themen 4
CptK Auf ActionListener von anderer Klass aus zugreifen Java Basics - Anfänger-Themen 5
F Mehrere Buttons mit einem ActionListener abdecken Java Basics - Anfänger-Themen 24
U ActionListener mit JMenuItems verknüpfen Java Basics - Anfänger-Themen 1
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
L Problem bei Java-ActionListener Java Basics - Anfänger-Themen 4
J Anfänger: ActionListener und ProcessBuilder machen Probleme Java Basics - Anfänger-Themen 6
D Einen Wert unter einen ActionListener weitergeben Java Basics - Anfänger-Themen 1
T Übernahme einer Variablen im ActionListener/ActionEvent Java Basics - Anfänger-Themen 2
JavaNewbie2.0 ActionListener Java Basics - Anfänger-Themen 11
Voreck Actionlistener problem Java Basics - Anfänger-Themen 1
G Im ActionListener eine "äußere" Variable verändern Java Basics - Anfänger-Themen 13
T Fehler beim ActionListener Java Basics - Anfänger-Themen 2
M public static int in ActionListener Java Basics - Anfänger-Themen 6
S actionlistener timer Java Basics - Anfänger-Themen 9
J Interface ActionListener in eigener Klasse Java Basics - Anfänger-Themen 27
P aus ActionListener auf HauptFrame zugreifen Java Basics - Anfänger-Themen 4
A Klassen Bool Actionlistener Java Basics - Anfänger-Themen 2
K Methoden ActionListener wird übersprungen Java Basics - Anfänger-Themen 3
S actionlistener Java Basics - Anfänger-Themen 29
S ActionListener und Statische Variablen Java Basics - Anfänger-Themen 4
J ActionListener Java Basics - Anfänger-Themen 5
A ActionListener Java Basics - Anfänger-Themen 9
R Problem mit ActionListener für Buttons Java Basics - Anfänger-Themen 5
Z ActionListener wird nicht erkannt? Java Basics - Anfänger-Themen 5
T ActionListener Source vergleichen Java Basics - Anfänger-Themen 8
T Frage zum ActionListener Java Basics - Anfänger-Themen 5
R ActionListener mit for Schleife füllen. Java Basics - Anfänger-Themen 4
K Button's mit versch. Aufgaben/ActionListener Java Basics - Anfänger-Themen 12
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
I ActionListener reagiert nicht Java Basics - Anfänger-Themen 6
N Probleme mit ActionListener und Logischer Abfrage Java Basics - Anfänger-Themen 4
D Erste Schritte Buttons mit actionlistener Problem Java Basics - Anfänger-Themen 3
S JButton mit ActionListener Java Basics - Anfänger-Themen 5
S ActionListener, Methoden und Variablen Java Basics - Anfänger-Themen 4
X Variablen Actionlistener | Variablen-namen Java Basics - Anfänger-Themen 5
G ActionListener implementieren Java Basics - Anfänger-Themen 12
T Erste Schritte Berechnete Variable im ActionListener zurückführen Java Basics - Anfänger-Themen 6
D Panel sichtbar/unsichtbar machen im ActionListener Java Basics - Anfänger-Themen 3
U JFrame durch ActionListener erweitern Java Basics - Anfänger-Themen 4
M Button , actionlistener Java Basics - Anfänger-Themen 11
P Erste Schritte JTable mit Daten aus Acces DB füllen und Actionlistener einsetzen Java Basics - Anfänger-Themen 29
M Actionlistener Java Basics - Anfänger-Themen 9
D Problem mit ausgelagertem Actionlistener Java Basics - Anfänger-Themen 4
D KeyListener und ActionListener Problem Java Basics - Anfänger-Themen 6
M Klassen Durch den ActionListener das GUI einer anderen Klasse verändern Java Basics - Anfänger-Themen 8
T NullPointerException im ActionListener Java Basics - Anfänger-Themen 3
C Erste Schritte GUI - ActionListener - Exception Nullpointer Java Basics - Anfänger-Themen 5
Kenan89 ActionListener in eigene Klasse Java Basics - Anfänger-Themen 8
E JMenu ActionListener reagiert nicht? Java Basics - Anfänger-Themen 6
V ActionListener in einer for-Schleife Java Basics - Anfänger-Themen 2
S Erste Schritte ActionListener auf Buttons einrichten Java Basics - Anfänger-Themen 3
M Variablen Variable lässt sich durch ActionListener nicht ändern Java Basics - Anfänger-Themen 5
P ActionListener Action Event Java Basics - Anfänger-Themen 5
L ActionListener zerschießt AnchorLayout Java Basics - Anfänger-Themen 8
D ActionListener braucht zwei Klicks auf Button??? Java Basics - Anfänger-Themen 2
M Methoden Timer in ActionListener aufrufen Java Basics - Anfänger-Themen 2
Y Actionlistener passt nicht zu Dataset Java Basics - Anfänger-Themen 6
W Problem mit FileWriter / ActionListener Java Basics - Anfänger-Themen 6
F actionListener Java Basics - Anfänger-Themen 3
T ActionListener auslagern Java Basics - Anfänger-Themen 14
S Actionlistener funktionieren nicht in der .jar Java Basics - Anfänger-Themen 9
E ActionListener abwarten lassen? Java Basics - Anfänger-Themen 11
E ActionListener in anderer Klasse erkennen Java Basics - Anfänger-Themen 13
H ActionListener Verbesserung möglich? (This) Java Basics - Anfänger-Themen 3
E ActionListener erkennt instanz nicht Java Basics - Anfänger-Themen 9
V ActionListener bei vielen Modulen Java Basics - Anfänger-Themen 3
J ActionListener Java Basics - Anfänger-Themen 2
T JLabel durch ActionListener ändern Java Basics - Anfänger-Themen 4
S ActionListener Java Basics - Anfänger-Themen 4
U actionListener - eine Kleine Frage Java Basics - Anfänger-Themen 7
K Actionlistener Java Basics - Anfänger-Themen 7
M ActionListener außerhalb des EDT ausführen Java Basics - Anfänger-Themen 2
A ActionListener im JMenu - Problem Java Basics - Anfänger-Themen 2
M ActionListener reagiert nicht Java Basics - Anfänger-Themen 4
N ActionListener + GUI Java Basics - Anfänger-Themen 8
H Bewegtes Bild im ActionListener [Problem] Java Basics - Anfänger-Themen 12
D Liste+ActionListener Java Basics - Anfänger-Themen 6
L wie Jframe an ActionListener übergeben Java Basics - Anfänger-Themen 4
U ActionListener und KeyListener - KeyListener funktioniert nicht Java Basics - Anfänger-Themen 2
A JButton ActionListener nach einmaligem Ausführen zurücksetzen Java Basics - Anfänger-Themen 13
Luk10 Problem mit ActionListener Java Basics - Anfänger-Themen 6
R Viereck zeichnen über TextField-Eingabe /ActionListener Java Basics - Anfänger-Themen 9
C ActionListener problem beim starten von programmen Java Basics - Anfänger-Themen 3
C ActionListener problem Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben