ActionListener implementieren oder Eigenen für jede Komponente?

Status
Nicht offen für weitere Antworten.

GilbertGrape

Bekanntes Mitglied
Hallo Gemeinde,
ich hab mal ne ganz allgemeine Frage.
Mich interessiert, ob es irgendeinen Unterschied macht, ob man einen ActionListener direkt implementiert (wie im ersten Beispiel) oder eben für jeden Button eine eigene Inline-Implementierung macht?
Ich meine, ist das eine schöner als das andere oder performanter oder was? Ich finde, von der Übersichtlichkeit nimmt es sich nicht so viel.
Ich weiß, dass ich im 2. Fall mehr class-Dateien hab.
Ich überleg nämlich jedes Mal wie ich es mache. Das hat dazu geführt, dass ich es nicht konsistent mache, mal so und mal so. Wenn ich das jetzt einheitlich mache, wüsste ich gerne, was besser ist.
Meinungen? :)


[highlight=Java]class Tester implements ActionListener {

public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Bla")) {
btnBlaClicked();
}
}


private void btnBlaClicked() {

}

}[/highlight]

[highlight=Java]class Tester {

private void initButtons(){
btnBla.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) {
btnBlaClicked();

}

});
}

private void btnBlaClicked() {

}

}[/highlight]

Gruß, Gilbert
 

mvitz

Top Contributor
Performancemäßig kann ich dir da nichts zu sagen. Ich persönlich nutze entweder einen ActionListener als eigene Klasse und Datei oder als Anonymen Listener (dein Beispiel 2). Eine Innere Klasse benutze ich eher selten.

Das ganze ist imho in erster Linie immer eine persönliche Entscheidung. Für kurze einmalige Aufrufe finde ich z.B. den Anonymen Listener sehr passend. Ist nicht sonderlich lang, ist direkt am Button zu erstellen. Für wiederkehrende Aktionen benutze ich dann wie gesagt gerne eine eigene Klassen in einer eigenen java Datei.
 

Marco13

Top Contributor
Performance spielt dort keine Rolle. Wenn man mit der Maus auf einen Button klickt, kann der Computer in der Zeit, die der Schall braucht, um von der Maus bis zum Ohr zu kommen, ungefähr 1 Million Zahlen addieren.

Subjektiv finde ich es nicht schön, wenn man einen riiieeesen ActionListener hat, der in seiner ActionPeformed dann so eine
Code:
if (actionCommand.equals("foo")) doFoo();
else if (actionCommand.equals("bar")) doBar();
else if (actionCommand.equals("...")) do...();
...
-Kaskade macht. Das wird besonders häßlich, wenn man die Funktionalitäten neu verteilt oder in andere Klassen veschiebt, und man den ganzen Schmodder dann zerpflücken muss....

Genauso unschön finde ich aber "große" anonyme innere Klassen.

Deswegen bevorzuge ich einen anonymen ActionListener, der in der actionPerformed NICHTS macht, außer EINER Methode aufzurufen. Das ist übersichtlich, man hat die Verbindung zwischen dem Button und dem, was der Button tut auf einen Blick, und das ganze ist ggf. recht schnell und flexibel zu ändern....
 

GilbertGrape

Bekanntes Mitglied
Deswegen bevorzuge ich einen anonymen ActionListener, der in der actionPerformed NICHTS macht, außer EINER Methode aufzurufen. Das ist übersichtlich, man hat die Verbindung zwischen dem Button und dem, was der Button tut auf einen Blick, und das ganze ist ggf. recht schnell und flexibel zu ändern....

Also so wie in meinem 2. Beispiel?
 

Marco13

Top Contributor
Ja, und wenn man nicht mehr als 10 Zeichen pro Antwort eintippen würde, würde dieser Satz nur aus seinem ersten Wort bestehen.
 

Ebenius

Top Contributor
Sun empfiehlt, für Buttons in der Regel am besten auf ActionListener zu verzichten und Actions zu benutzen. Eine Action pro Aktion; die kann dann natürlich auf verschiedenen Buttons oder Menüeinträgen liegen. Außer in Test-Code (oder hier im Forum) halte ich mich strikt daran und habe mich schon mehrfach darüber gefreut, diese Entscheidung getroffen zu haben.

Ebenius
 

mvitz

Top Contributor
Ein kurzes Codebeispiel wäre ganz nett.

Meinst du das so?:
[HIGHLIGHT="Java"] // Create an action
Action action = new AbstractAction("Button Label") {
// This method is called when the button is pressed
public void actionPerformed(ActionEvent evt) {
// Perform action...
}
};

// Create the button
JButton button = new JButton(action);
[/HIGHLIGHT]
http://www.exampledepot.com/egs/javax.swing/button_Button.html

Und hast du evtl einen Link der erklärt, was an Actions besser als an einem ActionListener ist?
 

Ebenius

Top Contributor
Ein kurzes Codebeispiel wäre ganz nett. [...]
Hast recht, hätte ich machen können. :) Aber Deines ist so in Ordnung.

Mehr hier:
Und hast du evtl einen Link der erklärt, was an Actions besser als an einem ActionListener ist?
Ich habe vor Ewigkeiten darüber einen guten Artikel irgendwo bei Sun gefunden. Aber ich finde ihn leider nicht wieder. :(

Actions werden auf exakt die gleiche Weise an vielen Stellen im Swing benutzt. Du kannst die gleichen Actions benutzen in:
  • Menüs
  • Buttons
  • ToolBars
  • Radio Buttons
  • Check Boxes
  • ActionMaps (zusammen mit InputMap)
  • ...
Actions bringen von Haus aus Accelerator-Key-Support mit. Actions trennen die Darstellung eines Buttons (...) von dessen Zustand (enabled, tooltip, name, etc.) was den GUI-Code nicht kürzer aber aufgeräumter macht. Mehr kann ich mir grad nich zusammenlügen. :)

Ebenius
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Sun empfiehlt, für Buttons in der Regel am besten auf ActionListener zu verzichten und Actions zu benutzen.
Hui. Man sollte auch auf Collections verzichten, und stattdessen ArrayLists verwenden :p Aber mal im ernst: Ich weiß, was gemeint ist - Actions bieten bei "komplexeren" Projekten, die auch benutzerfreundlich sein sollen (ggf. mit Hotkeys, Mnemonics, I18N und allem drum und dran) etliche Vorteile. Trotzdem bleibe ich im wesentlichen bei meiner Aussage:
Deswegen bevorzuge ich einen anonymen ActionListener, der in der actionPerformed NICHTS macht, außer EINER Methode aufzurufen.
Dieser ActionListener kann auch eine Action sein (die dann nicht mehr so ganz Anonym ist, aber fast :rolleyes: ). Ich finde, dass diese Action (genau wie im einfacheren Fall der anonyme ActionListener) nur als Verbindungs-Flansch fungieren sollte, zwischen dem Button, und dem, was der Button tut, und nicht irgendwelchen "komplexeren" Code enthalten sollte...
 

Ebenius

Top Contributor
Den größten Teil meiner S/W-Entwicklungszeit verbringe ich entweder in größeren Projekten oder in welchen die dazu werden. :)

Ich hab in eine geerbte ~2.000-Klassen-GUI nachträglich I18N-Support einbauen dürfen. Über eine bessere Trennung zwischen Actions und deren Komponenten hätte ich mich wirklich gefreut.

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M ActionListener implementieren AWT, Swing, JavaFX & SWT 10
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
L actionListener für Button AWT, Swing, JavaFX & SWT 97
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
R ActionListener in Actionlistener AWT, Swing, JavaFX & SWT 6
S Swing Variable in Actionlistener aufrufen AWT, Swing, JavaFX & SWT 10
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
coolian ActionListener funktonirt nicht richtig auf JMenuItem AWT, Swing, JavaFX & SWT 4
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
Blender3D einzelner ActionListener vs anonyme ActionListener AWT, Swing, JavaFX & SWT 10
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
J ActionListener bei Buttons AWT, Swing, JavaFX & SWT 14
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
it_is_all Event Handling ActionListener in anderer Klasse klappt nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z ActionListener Variable übergeben AWT, Swing, JavaFX & SWT 12
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
S While Schleife im Actionlistener AWT, Swing, JavaFX & SWT 1
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
T ActionListener nimmt JTextField nicht mehr an. AWT, Swing, JavaFX & SWT 2
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
Liondary GUI - ActionListener AWT, Swing, JavaFX & SWT 7
J ActionListener erkennt Variable nicht AWT, Swing, JavaFX & SWT 6
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
Sin137 ActionListener in MVC AWT, Swing, JavaFX & SWT 7
M ActionListener und mathematische Methoden AWT, Swing, JavaFX & SWT 13
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
Paul15 ActionListener Variablen AWT, Swing, JavaFX & SWT 13
Y ActionListener AWT, Swing, JavaFX & SWT 2
K Ereignisbehandlung, ActionListener, ActionEvent AWT, Swing, JavaFX & SWT 3
A Gui für Vokabeltrainer (ActionListener) AWT, Swing, JavaFX & SWT 14
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
S ActionListener Klasse aufrufen AWT, Swing, JavaFX & SWT 4
R Swing Problem: IOException bei ActionListener AWT, Swing, JavaFX & SWT 1
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
T Einfaches Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
K GUI, Button, ActionListener - ein paar Einsteigerprobleme AWT, Swing, JavaFX & SWT 1
W Verschachtelter ActionListener AWT, Swing, JavaFX & SWT 0
N gewünschte ActionListener bei RadioButton mit isSelected geht nicht AWT, Swing, JavaFX & SWT 2
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
K Swing JMenu und ActionListener AWT, Swing, JavaFX & SWT 4
A Swing ActionListener AWT, Swing, JavaFX & SWT 8
V ActionListener Abhängigkeitenproblem AWT, Swing, JavaFX & SWT 6
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
J ActionListener für Buttons AWT, Swing, JavaFX & SWT 3
M Event Handling ActionListener übergeben ich checks net AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
S Button (ActionListener) funktioniert nicht, wenn y-Koordinate verändert wird AWT, Swing, JavaFX & SWT 5
L Swing ActionListener führt seine Aufgabe nur teilweise aus. AWT, Swing, JavaFX & SWT 7
A Swing ActionListener kann nicht hinzugefügt werden AWT, Swing, JavaFX & SWT 4
P Actionlistener - 3 klassen - kompliziert - auf methoden zugreifen AWT, Swing, JavaFX & SWT 3
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
M ProgressBar in ActionListener AWT, Swing, JavaFX & SWT 4
D AWT eigenem Knopf ActionListener zuweisen AWT, Swing, JavaFX & SWT 24
E Wert aus ActionListener geben AWT, Swing, JavaFX & SWT 4
J ActionListener per Innere Klasse oder e.getActionCommand() if-Abfrage? AWT, Swing, JavaFX & SWT 12
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
P Swing Seltsames ActionListener-Verhalten AWT, Swing, JavaFX & SWT 7
Oliver530 ActionListener von eigener ButtonKlasse AWT, Swing, JavaFX & SWT 16
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 2
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 3
C In der Schleife ActionListener aktivieren AWT, Swing, JavaFX & SWT 3
B Swing Problem beim ActionListener AWT, Swing, JavaFX & SWT 5
P Swing JPanel mit ActionListener mehrfach verwenden AWT, Swing, JavaFX & SWT 8
1 ActionEvent generieren und an ActionListener weiterleiten AWT, Swing, JavaFX & SWT 12
N Swing Klasse erbt von JDialog - Problem mit innerer ActionListener-Klasse AWT, Swing, JavaFX & SWT 6
N JCombobox und Actionlistener Aktion nur ausführen, wenn Useraktion ihn auslöst AWT, Swing, JavaFX & SWT 4
N Componente und Actionlistener AWT, Swing, JavaFX & SWT 5
C ActionListener AWT, Swing, JavaFX & SWT 6
Corben ActionListener Error AWT, Swing, JavaFX & SWT 2
F Wert durch ActionListener an Klasse übergeben AWT, Swing, JavaFX & SWT 3
I Swing Problem mit InputMap bei JButton (ActionListener) AWT, Swing, JavaFX & SWT 3
S Swing JButton mit ActionListener innerhalb einer JTable AWT, Swing, JavaFX & SWT 4
P Variablen in einem ActionListener zurücksetzen AWT, Swing, JavaFX & SWT 6
M AWT Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
A Swing Bug in Swing? Wenn checkbox disabled reagiert ActionListener nicht AWT, Swing, JavaFX & SWT 5
S ActionListener "nach oben weitergeben" AWT, Swing, JavaFX & SWT 10
M Anonymer ActionListener AWT, Swing, JavaFX & SWT 4
L SWT Actionlistener Combobox öffnen AWT, Swing, JavaFX & SWT 4
S MenuBar ActionListener Event ... AWT, Swing, JavaFX & SWT 6
B Swing Formular mit mehreren Elementen - wie die ActionListener-Verarbeitung lösen? AWT, Swing, JavaFX & SWT 2
M getSource() findet Button nicht - ActionListener AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben