Ereignisse werden von Ereignisquellen erzeugt. Ein oder mehrere Listener melden sich an, um über die Ereignisse an einer Quelle informiert zu werden.
die Ereignisbehandlung wird an irgendein Objekt delegiert, das das zum Ereignis passende Interface implementiert.
Zur Ereignisbehandlung brauchen wir folgendes
public class MyEvtHdl implements ActionListener { ...
quitknopf.addActionListener( new MyEvtHdl());
public void actionPerformed( ActionEvent e) { // irgendwie auf das // Ereignis reagieren
Beispiel: Ein piepsender Knopf
Hier ist der ActionListener selbst Besitzer des Knopfes. Das muß natürlich nicht so sein.
import java.applet.*; import java.awt.*; import java.awt.event.*; public class Beeper extends Applet implements ActionListener { Button button; public void init() { setLayout(new BorderLayout()); button = new Button("Click Me"); add("Center", button); button.addActionListener(this); } public void actionPerformed( ActionEvent e) { Toolkit.getDefaultToolkit().beep(); } }
Oft nutzt man die neuen inneren Klassen für die Eventbehandlung:
public class Beeper1 extends Applet { Button button; public void init() { setLayout(new BorderLayout()); button = new Button("Click Me"); add("Center", button); button.addActionListener( new BeepAction()); } class BeepAction implements ActionListener { public void actionPerformed( ActionEvent e) { Toolkit.getDefaultToolkit().beep(); } } }
Wenn nur ein Handler-Objekt benötigt wird: anonyme Klassen :
public class Beeper2 extends Applet { Button button; public void init() { setLayout(new BorderLayout()); button = new Button("Click Me"); add("Center", button); button.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e) { Toolkit.getDefaultToolkit(). beep(); } } ); } }
Nicht objektorientiert. Anwender macht Fallunterscheidung über Event-Typen und Event-Ziele:
public class Beeper3 extends Applet { // JDK 1.0 Event Handling Button button; public void init() { setLayout(new BorderLayout()); button = new Button("Click Me"); add("Center", button); } public boolean action(Event e, Object arg) { if (e.target.equals(button)) Toolkit.getDefaultToolkit().beep(); else return super.action(e,arg); return true; } }
Wenn ein Listener-Interface mehrere Methoden fordert (z.B. MouseListener), man aber nur an einer Art von Event interessiert ist, ist es lästig, alle geforderten Methoden (mit leerem Rumpf) zu implementieren.
Adapterklassen lösen das Problem, indem sie für alle Methoden des Interfaces leere Default-Implementierungen bereitstellen. Man erbt von einer Adapterklasse und überschreibt die benötigte Eventhandling-Methode:
MyClass extends MouseAdapter { .... public void mouseClicked( MouseEvent e) { ... } } ... button.addMouseListener(new MyClass());
Für alle Eventarten mit mehr als einer Behandlungsmethode existiert eine Adapterklasse entsprechenden Namens.
Beispiel: Listener: KeyListener Adapter: KeyAdapter