15.32 Ereignisverarbeitung auf unterster Ebene
 
Der Benutzer erzeugt bei seiner Arbeit mit der Oberfläche Ereignisse. Diese werden entweder von den Peer-Objekten oder von Klassen der Applikation erzeugt. Bevor sie vom eigenen Programm bearbeitet werden, gelangen sie in eine Ereignisschlange (engl. event queue). Jedem Fenster ist eine eigene Event-Queue zugeordnet. Diese Event-Queue ist für Programmierer zugänglich und in einer plattformunabhängigen Klasse EventQueue implementiert. Elemente der Klasse sind Objekte vom Typ AWTEvent. Ein eigener Thread, der AWT-Event-Thread, läuft parallel zur Anwendung und arbeitet die angesammelten Ereignisse dieser Warteschlage ab.
15.32.1 Eigene Ereignisse in die Queue setzen
 
Es ist ohne großen Umweg möglich, eigene Ereignisse zu erzeugen und in der EventQueue zu platzieren. Damit lassen sich beispielsweise Eingaben des Benutzers emulieren. Da alle Ereignisse von Komponenten von AWTElement erben, lässt sich ein ActionEvent erzeugen, welches dann wiederum von einem interessierten Listener entgegengenommen wird. Jetzt fehlt uns nur noch eine Funktion, die Ereignisse in die Schlange setzt. Dazu bietet die Klasse EventQueue die Methode postEvent(). Im Beispiel sehen wir die notwendigen Aufrufe, um beginnend vom Toolkit an die SystemEventQueue zu kommen:
Toolkit.getDefaultToolkit().getSystemEventQueue().
postEvent(
new ActionEvent( /* Object source, int id, String command */ )
);
|
final EventQueue getSystemEventQueue()
Liefert ein Exemplar der EventQueue für eine Applikation oder ein Applet. Eine Security Exception wird ausgeworfen, falls der Security-Manager den Zugriff auf EventQueue verbietet. |
 Hier klicken, um das Bild zu Vergrößern
class java.awt. EventQueue
|
|
void postEvent( AWTEvent theEvent )
Legt ein Ereignis in die EventQueue. Danach werden vorhandene EventQueueListeners und notifyEventQueueListeners aufgerufen. |
Alternativen
Ein anderer Weg wäre, die Listener-Funktion auf einem bekannten Listener selbst aufzurufen. Dann muss aber gelten, dass der Listener und ein Verweis auf das auszulösende Objekt bekannt sind. Ist etwa al ein ActionListener, führt die folgende Zeile in die actionPerformed()-Methode eines Buttons b.
al.actionPerformed( new ActionEvent(b, ActionEvent.ACTION_PERFORMED, "text") );
Neben dem Problem, dass der Listener bekannt sein muss, wird natürlich nur ein Listener – und nicht alle angemeldeten – automatisch aktiviert.
Sollen alle Listener eines Buttons aufgerufen werden, so bietet sich processActionEvent() an:
b.processActionEvent( new ActionEvent(b,ActionEvent.ACTION_PERFORMED, "text") );
15.32.2 Auf alle Ereignisse hören
 
Um keine Ereignisse zu versäumen, lässt sich über das Toolkit ein Super-Listener anmelden. Dieser Listener ist vom Typ AWTEventListener, der über addAWTEventListener() mit dem Toolkit verbunden wird.
AWTEventListener ael = new AWTEventListener() {
public void eventDispatched( AWTEvent event ) {
}
};
Toolkit.getDefaultToolkit().addAWTEventListener( ael, mask );
Die mask bestimmt den Typ der gemeldeten AWTEvents. Hier kann für Mausbewegungen etwa AWTEvent.MOUSE_MOTION_EVENT_MASK stehen.
|