Event-Handling Ohne Event-Handling (deutsch: Ereignisbehandlung) nutzt das Programm wenig. Man kann zwar die Buttons anklicken doch es geschieht nichts. Und auch wenn das Fenster geschlossen wird, läuft das Programm noch weiter. Der Mechanismus zur Ereignisbehandlung im Zusammenhang mit den Grapphical User Interfaces beruht auf dem Listener-Prinzip. Ein Listener horcht nach eingehenden Nachrichten (zum Beispiel einem Klick) von Buttons oder JButtons (denen er zugewiesen wurde) und stellt Methoden zur Verfügung, die beim Eintreffen einer bestimmten Nachricht ausgeführt werden. In der zweiten Version wird daher dem linken JButton ein Listener listener der Klasse GUIListener zugeordnet ( ...addActionListener(listener)). Dieser Listener kann man als eine Art Unterklasse der Klasse ActionListener der Java-Bibliothek java.awt.event.* mit der Methode actionPerformed(ActionEvent...). (Strenggenommen ist ein ActionListener ein Interface und man sagt, der GUIListener implementiert das Interface.) Wenn ein JButton angeklickt wird, erzeugt und schickt er ein ActionEvent an seinen Listener. Der Listener wird horchen, ob der JButton angeklickt wird und gegebenenfalls seine Methode actionPerformed(...) ausführen. (Natürlich muss dazu das Objekt listener der Klasse GUIListener vor der Zuweisung zu der Schaltfläche erzeugt werden.) Bei der Methode actionPerformed(ActionEvent ae) wird in ae automatisch gespeichert, welches Event aufgetreten ist. Dies hat Vorteile um auf unterschiedliche Ereignisse unterschiedlich reagieren zu können. Mit Hilfe der Funktion ae.getSource()kann abgefragt werden, von welchem Objekt das Ereignis ausgelöst wurde. Um diese Information wie gewünscht verarbeiten zu können muss die entsprechende Klasse (hier: GUIListener) in einer Kennt- oder Hat-Beziehung zu den in Frage kommenden Objekte stehen. Eoinfacher geht es mit der Funktion ae.getActionCommand(). Die Funktion ae.getActionCommand()gibt an, welche Aufschrift das Objekt trägt, das die Nachricht gesendet hat. In der 4.Version wurde dem Fenster ein WindowListener zugeordnet, der bewirkt, dass das Programm beendet wird, wenn das Fenster geschlossen wird. Da es recht mühselig ist, alle Methoden des WindowListeners zu überschreiben, kann man hier einen Adapter benutzen. WindowAdapter stehen wie die Listener in der Bibliothek java.awt.event.* zur Verfügung. Ein WindowAdapter implementiert einen WindowListener und überschreibt automatisch alle Methoden so, dass sie leer sind. Dies bietet den Vorteil, dass nur die Methoden, die wirklich etwas bewirken sollen, überschrieben werden müssen. (vgl. FensterListener der 4.Version) Adapter sind im Gegensatz zu Listenern Klassen. (Daher beginnt die Klassendefinition dann mit class …. extends WindowAdapter.) Insgesamt sind also folgende Schritte nötig: 1. Listener implementieren (d.h. entsprechende Klassen schreiben) (insbes. beim ActionListener ggf. an nötige Kennt-Beziehungen zu den entsprechenden GUIs denken) 2. Listener erzeugen und den entsprechenden GUIs zuordnen (3. Hoffen, dass alles klappt und testen)