Event Handling

Hallo zusammen, ich bin neu hier im Forum und bringe mir gerade Java bei.

Ich beschäftige mich seit längerem mit dem Thema „Event-Handling“ in Java.

Nun bin ich der Meinung das ich es Verstanden habe, doch um sicher zu gehen würde es euch gerne erklären und euch darum bitten, das ihr mir das wenn es Richtig ist einfach nur Bestätigt.

Event-Handling bezeichnet den Vorgang, bei dem von einem Benutzer z.B. ein Button gedrückt wird und daraufhin etwas in einem Programm passiert.
Ein Event ist nichts anderes als ein Ereignis.
Ein Event wird von einer Event-Quelle wie z.B. von einem Button ausgelöst.
Die Event-Quelle erzeugt beim Betätigen ein sogenanntes Event-Objekt anhand der Event-Klasse.
Ein Event-Objekt beinhaltet Information über das Event.

Da für ein Programm (Klasse) oft nur bestimmte Events von Relevanz sind, gibt es von jeder Eventklasse einen passenden Listener. Die ActionEvent-Klasse besitzt z.B. den bekannten ActionListener.

Ist nun einen Klasse an einem bestimmten Event interessiert, so muss sie den passenden Listener implementieren. Dabei muss Sie die entsprechenden Methoden des Listeners implementieren.
Beim ActionListener ist es die actionPerformed-Methode.
Weiters muss der Listener bei der Event-Quelle angemeldet werden.
Dies geschieht mit der Methode: „add…Listener()“.

Wird jetzt z.B. ein Button vom Benutzer gedrückt, so erzeugt die Event-Quelle ein Event-Objekt anhand der Event-Klasse. Dieses Event-Objekt wird dann an den Listener weitergegeben. Der Listener ruft nun die actionPerformed-Methode auf und übergibt Ihr nun das Event-Objekt: z.B. „ActionEvent ae“. In der actionPerformed-Methode wird nun auf das Ereignis reagiert und je nach Programmierung etwas ausgeführt.

Ich Hoffe ich habe das so im großen und ganzen richtig erklärt?

MfG

Fast, einen Fehler hast du im Text:

Also, wenn ein User den Button drückt, erzeugt der das Event-Objekt und füttert es mit den nötigen Informationen. Danach sucht der Button in der EventListenerList (eine Java Klasse) nach den angemeldeten ActionListenern. Für jeden gefundenen ActionListener ruft der Button selbst die actionPerformed Methode auf und übergibt dann immer das ActionEvent.

Nur um es noch mal auszusprechen: bis auf die Ungenauigkeit beim Aufruf der actionPerformed()-Methode, die @PositiveDown berichtigt hat, dar das so OK.

bye
TT

OK, Danke!

Dann stellt der ActionListener als nur die “actionPerformed() - Methode” zur verfügung.

Oft lese ich auch im Netz, das der ActionListener die Events abhört.
Das stimmt dann vermutlich nicht.

MfG

[quote=Javaman1991]Oft lese ich auch im Netz, das der ActionListener die Events abhört.
Das stimmt dann vermutlich nicht.[/quote]Technisch nicht.

Aber auch Programmierer sind letztlich nur Menschen, die sich auch mit unscharfen Formulierungen gut verständigen können, solange es in “die richtige Richtung” geht.

Oder anders gesagt: Ich könnte mir gut vorstellen, dass ich diesen “Fehler” in einer Diskussion einfach übergehen würde.

bye
TT

Eines noch.

Wenn der Button die actionPerformed - Methode des ActionListeners aufruft, dann übergibt er ja der Methode
ein Event-Objekt (ActionEvent).

Mit der Methode “getSource();” kann ich ja die Ereignis-Quelle abfragen und so ermitteln, wer der Auslöser des Events war?
Das mache ich z.B. wenn ich 3 Button habe.

Han jetzt nur die Frage gelesen…
Aber um darauf zu antworten:

ja, das kannst du so machen,
du meinst du hast deinen einen einzigen action listener, den du dann allen 3 buttons zuweist, und dann
schaust du welcher 3 buttons es gewesen ist?

klar, das geht so. ist aber nicht unbedingt die schönste möglichkeit.
beziehungsweise es ist stark situationsabhängig.
manchmal ist es besser, jedem gui objekt seinen eigenen listener zu verpassen.

das hängt aber stark davon ab, was und wie du es machst :slight_smile:

Ja, man sollte Listener IMHO einigermaßen lokal und spezifisch halten. Bei solchen Klassen wie

class MySuperCoolGUI extends JFrame implements ActionListener, MouseListener, MouseMotionListener, MouseWheelListener, ChangeListener,  BeanContextMembershipListener, PropertyChangeListener 
{
     ...
    @Override 
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == firstButton) { ... }
        if (e.getSource() == secondButton) { ... }
        ...
        if (e.getSource() == twoThousandThreeHundredFiftyThirdButton) { ... }
    }
}

kann man den Code durch die Tastenfolge „STRG+A, Entf“ schon deutlich verbessern :smiley:

Gerade bei ActionListener ist das delegieren besonders einfach und dank Lambdas auch sehr kompakt möglich, da ActionListener ein SAM-Type (Single Abstract Method Type) ist. In den meisten Fällen soll durch einen Button ja genau EINE Funktion ausgelöst werden. Und es spricht viel dafür, in einem ActionListener bzw. seiner actionPerformed-Methode „nicht zu viel“ zu machen. Deswegen kann man oft ganz konkret an eine (private) Methode delegieren.

Also mit Java <8

JButton startButton = new JButton("Start");
startButton.addActionListener(new ActionListener()
{
    @Override 
    public void actionPerformed(ActionEvent e) 
    {
        startButtonWasPressed();
    }
});

oder mit Java 8 gleich

JButton startButton = new JButton("Start");
startButton.addActionListener(e -> startButtonWasPressed());

In the first chapters of these basics they get general information about the programming language Java . ,