Java: Eventlistener für Buttons - Schreibweise

Gast #5987194
Bei der Einarbeitung in das Thema GUI mit Swing muss man ja für einen 
Button auch einen Event-Listener programmieren. Inzwischen habe ich zwar 
die Syntax notgedrungenwerweise akzeptiert (so dass ich sie nutzen 
kann), aber nicht wirklich begriffen. Beispiel:
1
myButton.addActionListener(new ActionListener()
2
{
3
  public void actionPerformed(ActionEvent e)
4
  {
5
     myLabel.setText("Button gedrückt!");
6
  }
7
});

Ich finde die Struktur und die Syyntax etwas "strange".

- das Objekt myButton verfügt über die Methode "addActionListener"

- als Argument übergebe ich einen Konstruktor "ActionListener" (und 
damit im Ergebnis ein Objekt) ohne Parameter, dafür aber mit direkt 
angehängtem Code einer Methode "actionPerformed"

Gibt es dafür auch eine weniger "schräge", quasi "traditionellere" 
Schreibweise?

Kann man das z.B. mit einer eigenen Klasse nach dem Muster "myListener 
extends ActionListener", die dann "actionPerformed" ganz konventionell 
erbt, machen?
Gast #5987208
Ich habe mal nocht etwas herumprobiert, zumindest bis dahin ist eine 
"Entflechtung" machbar:
1
ActionListener myListener1 = new ActionListener()
2
{
3
  public void actionPerformed(ActionEvent e)
4
  {
5
    myLabel.setText("Button 1 gedrückt!");
6
  }
7
};
8
    
9
myButton1.addActionListener(myListener1);

 ... und: Mit "ActionListener" kann man keine Klasse erweitern, ist 
anscheinend keine Klasse bzw. eine "finale" Klasse?
#5987696
JavaNeuling schrieb:
> Gibt es dafür auch eine weniger "schräge", quasi "traditionellere"
> Schreibweise?

Ja, aber die knallt beim 2. Button:

Das aurufende Objekt implementiert ActionListener  Interface, und damit 
liesse sich das als
1
myButton.addActionListener(this);

schreiben.

Hat aber wie gesagt den Nachteil dass man den 2. Button so nicht mehr 
eingebaut bekommt.

JavaNeuling schrieb:
> aber das kann auch von einer
> eigenen Klasse nicht implementiert werden, wird "nicht aufgelöst"

Dann machste was flasch - actionPerformed() Methode vergessen?
Gast #5991258
Historiker schrieb:
> Jetzt tu nicht so als wäre das super-modern.
>
> Das Lambda-Kalkül, an das diese Schreibweise angelehnt ist, stammt aus
> dem Jahr 1936!

So isses, in Java gibts Lambdas jetzt aber "erst" seit etwa 5 Jahren.

Egal, jedenfalls lang genug um hier mal eine Lanze dafür zu brechen und 
von diesem grausamen Rumgeeiere mit den anonymen Klassen wegzukommen.

Das "klassische" Beispiel aus dem Oribble Tutorial ist auch ganz toll - 
wenn man nur einen Button hat, sprich, das kann man mal bei nem modalen 
Dialog so machen.

Bei komplexeren GUIs will man das eher nicht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.