mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: JavaNeuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
myButton.addActionListener(new ActionListener()
{
  public void actionPerformed(ActionEvent e)
  {
     myLabel.setText("Button gedrückt!");
  }
});

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?

Autor: JavaNeuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal nocht etwas herumprobiert, zumindest bis dahin ist eine 
"Entflechtung" machbar:
ActionListener myListener1 = new ActionListener()
{
  public void actionPerformed(ActionEvent e)
  {
    myLabel.setText("Button 1 gedrückt!");
  }
};
    
myButton1.addActionListener(myListener1);

 ... und: Mit "ActionListener" kann man keine Klasse erweitern, ist 
anscheinend keine Klasse bzw. eine "finale" Klasse?

Autor: JavaNeuling (Gast)
Datum:

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

Autor: TestX (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
public class MyClass implements ActionListener{

}

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht 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
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?

Autor: foo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wir haben 2019!

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

Autor: Historiker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: foo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.