java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Java Basics - Anfänger-Themen

Java Basics - Anfänger-Themen Fragen ausschließlich zu Java-Grundlagen von Ein- und Umsteigern

Thema geschlossen    
Themen-Optionen Thema durchsuchen Ansicht
Alt 13.02.2009, 09:24   #1 (permalink)
Pflaumbaum
Nicht angemeldet
 
Fachbeiträge: n/a
Standard ActionListener zusammenfassen?

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!
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 13.02.2009, 09:41   #2 (permalink)
Stammbenutzer
Viertel Gigabyte
 
Registriert seit: 18.01.2007
Fachbeiträge: 2.871
Blog-Einträge: 1
Abgegebene Danke: 0
Erhielt 142 Danke für 140 Beiträge
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.
__________________
Satzzeichen sind keine Rudeltiere, verdammt nochmal!!!
HoaX ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 13.02.2009, 11:44   #3 (permalink)
Java-Forum Team
Moderator
 
Registriert seit: 06.01.2007
Fachbeiträge: 16.761
Abgegebene Danke: 0
Erhielt 1.640 Danke für 1.485 Beiträge
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 ) 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.
Marco13 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 13.02.2009, 14:20   #4 (permalink)
Nicht angemeldet
 
Fachbeiträge: n/a
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);
                  
                }
            });
          
        }
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 13.02.2009, 14:24   #5 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.675
Abgegebene Danke: 0
Erhielt 2.570 Danke für 2.531 Beiträge
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
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 13.02.2009, 15:30   #6 (permalink)
Nicht angemeldet
 
Fachbeiträge: n/a
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?
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 13.02.2009, 15:38   #7 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.675
Abgegebene Danke: 0
Erhielt 2.570 Danke für 2.531 Beiträge
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[i] 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
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 13.02.2009, 16:00   #8 (permalink)
Pflaumbaum
Nicht angemeldet
 
Fachbeiträge: n/a
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!
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 13.02.2009, 16:08   #9 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.675
Abgegebene Danke: 0
Erhielt 2.570 Danke für 2.531 Beiträge
'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
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Thema geschlossen    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Codeabschnitte zusammenfassen HakBak Allgemeine Java-Themen 9 04.07.2008 08:50
Werte zusammenfassen! Allgemeine Java-Themen 3 13.12.2007 12:50
Vektor zusammenfassen miguelgalaxy Allgemeine Java-Themen 3 21.06.2006 14:36
Textfelder zusammenfassen Tukuan Allgemeine Java-Themen 4 10.04.2006 11:26
Gruppe zusammenfassen AWT, Swing, JavaFX & SWT 3 16.04.2005 16:31


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de