15.31 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 zugerodnet. 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.
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 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 ist. Ist etwa al ein ActionListener, so 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 auch nur ein Listener so aktiviert und nicht automatisch alle angemeldeten.
Sollen alle Listener eines Buttons aufgerufen werden, so bietet sich processActionEvent() an:
b.processActionEvent (new ActionEvent(b,ActionEvent.ACTION_PERFORMED, "text") );
|