(Action)Listener auslagern?

Status
Nicht offen für weitere Antworten.

0001001

Bekanntes Mitglied
Hi,

würde mein Programm gerne von Anfang an sauber aufbauen. D.h. keine 1000-Zeilen-Klassen und keine ActionListener als intere Klassen.

Hier mal ein simples Beispiel und verschiedene Implementierungsmöglichkeiten;

1. Möglichkeit
Code:
public class FileMenu extends JMenu implements ActionListener{
	private JMenuItem exit;
	
	public FileMenu(){
		this.setText("File"); 		
		exit = new JMenuItem("Exit");
		exit.setActionCommand("exit");
		exit.addActionListener(this);
		this.add(exit);
	}
	
	public void actionPerformed(java.awt.event.ActionEvent e){
		if(e.getActionCommand().equalsIgnoreCase("exit")){
			System.exit(0);
		}
	}
}

2. Möglichkeit
Code:
public class FileMenu extends JMenu{
	private JMenuItem exit;
	
	public FileMenu(){
		this.setText("File"); 		
		exit = new JMenuItem("Exit");
		exit.setActionCommand("exit");
		exit.addActionListener(new ActionListener(){
			public void actionPerformed(java.awt.event.ActionEvent e){
				if(e.getActionCommand().equalsIgnoreCase("exit")){
					System.exit(0);
				}
			}
		});
		this.add(exit);
	}
}

3. Möglichkeit

Code:
public class FileMenu extends JMenu{
	private JMenuItem exit;
	
	public FileMenu(){
		this.setText("File"); 		
		exit = new JMenuItem("Exit");
		exit.setActionCommand("exit");
		exit.addActionListener(new MyActionListener());
		this.add(exit);
	}
}

class MyActionListener implements ActionListener{
	public void actionPerformed(java.awt.event.ActionEvent e){
		if(e.getActionCommand().equalsIgnoreCase("exit")){
			System.exit(0);
		}
	}
}



Was stellt ihr mit den (Action)Listenern an? Auslagern in eine extra Datei und aufufende Datei per Konstruktor übergeben?
 

L-ectron-X

Gesperrter Benutzer
Du kannst auch mit Actions arbeiten.
Dazu schreibst du dir eine Klasse, die von AbstractAction erbt, überschreibst darin die actionPerformed()-Methode und übergibst dann die Action deinem JButton, JMenuItem etc.
 

Marco13

Top Contributor
Alles subjektiv:

Viel entscheidender, als die Frage, wo er steht, ist IMHO die Frage, was er macht. Ich finde es nicht so schön, das ActionCommand abfragen zu müssen. D.h. man sollte IMHO insbesondere NICHT 20 verschiedene Buttons haben, und dort EINEN ActionListener dranhängen, der dann entscheidet, was zu tun ist.

Ich finde es "schön", wenn ActionListener (oder auch andere Listener, die nicht über sowas wie eine "Action" abgebildet werden können) nichts anderes machen, als NUR eine (private) Methode aufzurufen. Dann kann man mit einem anonymen Listener (also mit der 2. Möglichkeit) die Verbinung zwischen dem Erstellen des Buttons und dem, was der button macht ganz elegant und praktisch herstellen (Ähnlich wie bei den "Slots" in QT, falls du das kennst).

Die 1. Möglichkeit gefällt mir nicht, weil das dazu verleitet, eine 1000-Zeilen-Mega-ActionPerformed zu schreiben.
Die 3. Möglichkeit gefällt mir nicht, weil man für jeden Scheiß (also z.B. diese kleine, billige Verbindung zwischen "button" und "System.exit") eine eigene Klasse erstellen muss.
Die 2. Möglichkeit finde ich (richtig angewendet) am einfachsten, elegantesten und flexibelsten.
 

L-ectron-X

Gesperrter Benutzer
0001001 hat gesagt.:
Das wäre eine Möglichkeit, danke!
Welche Vorteile hat es, mit Actions zu arbeiten?
Du kannst für verschiedene Komponenten, die Actions unterstützen, einfach an beliebigen Stellen die gleiche Aktion abarbeiten lassen.
Wenn du z.B. ein JMenuItem und in einen JButton in einer JToolBar hast, die die gleiche Funktion anbieten, kannst du durch Übergabe einer vorher erstellten Action die gleiche Aktion ausführen lassen. Das kannst du so weit treiben, dass du auf beiden Komponenten die gleiche Aufschift und das gleiche Icon zu sehen bekommst.
Außerdem bleibt dein Code übesichtlich und ist daher auch recht gut zu warten.
 

0001001

Bekanntes Mitglied
Vielen Dank!

Eine Frage noch: Wenn ich die 2. Möglichkeit verwende, dann möchte ich, so wie du sagst, nur eine Methode aufrufen, in der dann alles geregelt wird. Was aber, wenn die Methode beispielsweise einen Text in einem Textfeld ändern soll. Übergibst du dann das Textfeld der privaten Methode?
 

Marco13

Top Contributor
Da gibt's eigentlich nur 2 Alternativen: Entweder, man übergibt das TextField, oder das TextField liegt als Field in der Klasse - was man macht, kommt wohl auf den jeweiligen Fall an...
 

0001001

Bekanntes Mitglied
Prima, genau das wollte ich wissen! Danke!

Ist es eigentlich generell besser, GUI Elemente als Klassenvariablen zu definieren, also so:

Code:
public class Test{
   private JLable label;
   public Test(){
      label = new JLabel("foo");
   } 
}

oder hängt das von der Situation ab?
 

Marco13

Top Contributor
Naja... Der einzige Grund, wesegen man eni Label als Klassenvariable speichern sollte, ist, dass man später noch den Text ändern will - z.B. nach einem ActionEvent oder so :wink:

Aber es gibt immer viele Möglichkeiten, WIE man sowas schreiben kann. Nochmal zu der Frage mit dem Textfield: Wenn in der ActionPerformed-Methode z.B. NUR der Text gesetzt werden soll, dann kann das ja auf verschiedene Arten passieren...

Das TextField wird an eine Methode übergeben, und dort gefüllt
Code:
class Foo
{
    void bar()
    {
        JTextField textField = new JTextField();
        ...
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                 setTheText(textField);
            }
        });
    }

    void setTheText(JTextField textField)
    {
         String text = ...
         textField.setText(text);
    }
}
Meistens gibt es geschicktere Lösungen für sowas, aber sowas KÖNNTE sinnvoll sein, wenn man z.B. noch an vielen anderen Stellen den gleichen Text in ANDERE TextFields setzen muss - dann ruft man eben überall die setTheText-Methode mir dem jeweiligen TextField auf.

Eine andere Möglichkeit wäre (entgegen meiner Empfehlung, in der actionPerformed NUR eine Methode aufzurufen :wink: ) das TextField final machen und den Text direkt zu setzen...
Code:
class Foo
{
    void bar()
    {
        final JTextField textField = new JTextField();
        ...
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                 textField.setText(computeTheText());
            }
        });
    }

    private String computeTheText()
    {
         String text = ...
         return text;
    }
}
Das wäre sinnvoll (und etwas allgemeiner anwendbar als das erste) wenn man den Text an mehreren Stellen braucht, z.B. ihn ins Textfeld UND in eine Datei schreiben will.

Und natürlich könnte man es auch so machen, wie angedeutet
Code:
class Foo
{
    private JTextField theTextField = new JTextField();


    void bar()
    {
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                 setTheText();
            }
        });
    }

    void setTheText()
    {
         String text = ...
         theTextField .setText(text);
    }

}
Das wäre wohl sinnvoll, wenn in "setTheText" noch mehr gemacht wird (z.B. 5 TextFields und 4 Labels geändert - die sollte man ja nicht alle als Parameter übergeben...). Natürlich könnten von dort aus dann wieder setTheText(theTextField) oder computeTheText() aus dem 1. bzw. 2. Beispiel aufgerufen werden ... Hm.
Die Freiheiten, die einem die Gödelnummerierungen über dem UNICODE-Zeichensatz bieten, sind beschränkt durch die Frage, was gültige Java-Syntax ist und was die gewünschte Aufgabe erfüllt - aber dann bleibt immernoch verdammt viel übrig... :wink:
 

L-ectron-X

Gesperrter Benutzer
Nur noch mal der Hinweis: Eine Klassenvariable ist immer static. Wovon ihr hier redet, sind Instanzvariablen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
J Action Listener Rückgabewert AWT, Swing, JavaFX & SWT 14
J Java -8 Action Listener für mehrere Buttons AWT, Swing, JavaFX & SWT 9
F In Action Listener TextFields einlesen und prüfen. Abbruch bei falschen Eingaben. Wie mache ich das? AWT, Swing, JavaFX & SWT 2
K Action Listener implementieren über Objekt AWT, Swing, JavaFX & SWT 14
H Problem mit dem Action listener.... AWT, Swing, JavaFX & SWT 2
S Action Listener in innerer Klasse ausführen. AWT, Swing, JavaFX & SWT 8
L Action listener in bestimmter spalte AWT, Swing, JavaFX & SWT 2
J AWT Action Listener etc. AWT, Swing, JavaFX & SWT 7
S Combo Box action listener AWT, Swing, JavaFX & SWT 2
A Action listener von Button AWT, Swing, JavaFX & SWT 5
F Problem mit Action Listener in privater inneren Klasse AWT, Swing, JavaFX & SWT 6
A Action Listener AWT, Swing, JavaFX & SWT 14
G Action Listener erzeugen AWT, Swing, JavaFX & SWT 6
M JavaFX Button action abhängigkeit von Tab AWT, Swing, JavaFX & SWT 1
Z Befehl Action Event Verlassen AWT, Swing, JavaFX & SWT 4
3 JComboBox - Action - Auslesen & Umwandeln AWT, Swing, JavaFX & SWT 9
S Action durchführen beim Programm beenden AWT, Swing, JavaFX & SWT 3
K Swing KeyBinding: Action wird nicht ausgelöst AWT, Swing, JavaFX & SWT 3
K Array von einer Action zur anderen bringen AWT, Swing, JavaFX & SWT 7
T action für Button übergeben - bitte um Segen AWT, Swing, JavaFX & SWT 1
G mehrere Action-Abfolgen erfassen AWT, Swing, JavaFX & SWT 6
I Button Action AWT, Swing, JavaFX & SWT 6
C Swing MenuItem feuert Action nur wenn disabled AWT, Swing, JavaFX & SWT 2
J SWT Rechteck Füllfarbe wird bei Action falsch gefüll AWT, Swing, JavaFX & SWT 2
D Drag-Action: Innerhalb meiner View? AWT, Swing, JavaFX & SWT 3
alex_fairytail Swing Textfeld Action wenn geschrieben wird? AWT, Swing, JavaFX & SWT 6
R innere Action -> auf äußeres this zugreifen AWT, Swing, JavaFX & SWT 3
P Action Event abfangen etwas anders? AWT, Swing, JavaFX & SWT 2
N Swing nach Fensterrand Action ausführen? HILFE AWT, Swing, JavaFX & SWT 7
L ComboBox in Action AWT, Swing, JavaFX & SWT 4
M SWT Jface Action und localised Strings AWT, Swing, JavaFX & SWT 6
I Button Action AWT, Swing, JavaFX & SWT 4
K GUI, Action AWT, Swing, JavaFX & SWT 4
B Frage zu Button-Action AWT, Swing, JavaFX & SWT 3
J Action before actionPerformed! AWT, Swing, JavaFX & SWT 4
K Swing Wie ändere ich die default action für Drag&Drop AWT, Swing, JavaFX & SWT 6
M JButton Action Problem AWT, Swing, JavaFX & SWT 3
K Action.MNEMONIC mit char belegen. AWT, Swing, JavaFX & SWT 2
M Action.DISPLAYED_MNEMONIC_INDEX_KEY geht nicht mehr AWT, Swing, JavaFX & SWT 2
O Action Event auslösen bei unbekanntem JTextField AWT, Swing, JavaFX & SWT 3
G SWT ApplicationActionBarAdvisor Action AWT, Swing, JavaFX & SWT 11
G Action? AWT, Swing, JavaFX & SWT 2
K kleine frage zum Spinner (bezüglich Action) AWT, Swing, JavaFX & SWT 2
S Action Handler JButton AWT, Swing, JavaFX & SWT 15
S Buttons werden nach action grau AWT, Swing, JavaFX & SWT 4
S Action mit 2 verschiednen texten AWT, Swing, JavaFX & SWT 2
A SWT: Action über Hotkey ausführen AWT, Swing, JavaFX & SWT 2
G Action.setCheck(boolean)? AWT, Swing, JavaFX & SWT 6
A Mit der Combobox eine Action auslösen AWT, Swing, JavaFX & SWT 2
X Action aktivieren AWT, Swing, JavaFX & SWT 2
J mehrere Action Buttons mit einer ActionListener Methode AWT, Swing, JavaFX & SWT 7
S JMenuBar mit Action belegen! AWT, Swing, JavaFX & SWT 5
R action performed und IOException AWT, Swing, JavaFX & SWT 4
F Wo kann ich eine Action einsetzen? AWT, Swing, JavaFX & SWT 2
F Action ausführen? AWT, Swing, JavaFX & SWT 3
C tree action AWT, Swing, JavaFX & SWT 8
W Bei hinzufügen der Action verliert Button Text,Tooltip, etc AWT, Swing, JavaFX & SWT 5
B Problem mit Übergabe bei action in andere Klasse AWT, Swing, JavaFX & SWT 4
X Action und Frame AWT, Swing, JavaFX & SWT 3
K Jtree und Action Event AWT, Swing, JavaFX & SWT 6
padde479 MenuItem MouseEvent/-Listener AWT, Swing, JavaFX & SWT 5
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
K Warum genau hat man einen Listener, dann ein Event und was ist ein Adapter AWT, Swing, JavaFX & SWT 2
J Key-Listener in Java AWT, Swing, JavaFX & SWT 37
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
M List Listener AWT, Swing, JavaFX & SWT 37
I AWT Listener während man in anderem Fenster ist AWT, Swing, JavaFX & SWT 4
U Funktionsweise Listener AWT, Swing, JavaFX & SWT 1
L TextField Listener AWT, Swing, JavaFX & SWT 13
K Nullpointer Combobox Listener AWT, Swing, JavaFX & SWT 2
L JavaFX Image im ImageView auf Scroll Listener reagieren AWT, Swing, JavaFX & SWT 5
Salo JTabel Selection listener Bsp. AWT, Swing, JavaFX & SWT 5
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
MaxG. Swing JMenu einen Listener Hinzufügen AWT, Swing, JavaFX & SWT 25
L JavaFX Verbindung zwischen Beschreibung und Listener (Codebehind Klasse) AWT, Swing, JavaFX & SWT 4
T Swing Methode in Listener aufrufen AWT, Swing, JavaFX & SWT 3
S Swing Tabellen - Listener & richtige Row AWT, Swing, JavaFX & SWT 3
S Erste Schritte mit GUI - Fileverarbeitung, Listener,... AWT, Swing, JavaFX & SWT 10
M JButton - Listener AWT, Swing, JavaFX & SWT 1
R Swing Mehrere JTextFields mit einem Document Listener AWT, Swing, JavaFX & SWT 2
K JavaFX Focus Listener für gesamte Scene AWT, Swing, JavaFX & SWT 1
M Key Listener reagiert nicht AWT, Swing, JavaFX & SWT 4
M Listener funktioniert nicht AWT, Swing, JavaFX & SWT 7
S Swing JComboBox mit Listener aktualisieren AWT, Swing, JavaFX & SWT 13
elischa JFrame über mehrere JPanel und Listener AWT, Swing, JavaFX & SWT 17
llabusch Event Handling Listener spielt verrückt AWT, Swing, JavaFX & SWT 8
kaoZ Swing Architektonisches Problem / Listener / MVC AWT, Swing, JavaFX & SWT 14
H org.eclipse.swt.widgets.Scale MouseRelease listener AWT, Swing, JavaFX & SWT 1
MaDDin-94 Swing Listener reagiert nicht immer AWT, Swing, JavaFX & SWT 2
A JLabel im Listener färben AWT, Swing, JavaFX & SWT 11
M Key-,... Listener funktioniert nicht immer AWT, Swing, JavaFX & SWT 2
P Event Handling Listener beim öffnen von einem JPopupMenu AWT, Swing, JavaFX & SWT 3
A Listener für JGTextField AWT, Swing, JavaFX & SWT 2
J Programmierstil: Kommunikation Listener und GUI AWT, Swing, JavaFX & SWT 3
B JTable Renderer / Listener AWT, Swing, JavaFX & SWT 7
M Swing JList Listener AWT, Swing, JavaFX & SWT 20

Ähnliche Java Themen


Oben