Forum: PC-Programmierung Java: Eventlistener für Buttons - Schreibweise


von JavaNeuling (Gast)


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?

von JavaNeuling (Gast)


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?

von JavaNeuling (Gast)


Lesenswert?

ok, "ActionListener" ist ein Interface, aber das kann auch von einer 
eigenen Klasse nicht implementiert werden, wird "nicht aufgelöst" :-(

von TestX (Gast)


Lesenswert?

dein beispiel oben ist der "müll code" der in neueren java versionen 
unterstützt wird um interfaces mit lambda funktionen 
zusammenzuführen...kann man mögen muss man aber nicht

klassich:

https://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html
1
public class MyClass implements ActionListener{
2
3
}

von Jim M. (turboj)


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?

von foo (Gast)


Lesenswert?

Wir haben 2019!

myButton.addActionListener(e -> myLabel.setText("Button 1 gedrückt!"));

von Historiker (Gast)


Lesenswert?

foo schrieb:
> Wir haben 2019!

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!

von foo (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.