Java: Eventlistener für Buttons - Schreibweise

Gast #5987194
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren