Nach der Erstellung einer Anzeige und verschiedener Fensterobjekte sowie dem Starten der Anwendungsnachrichtenschleife stellt sich die Frage, wo die Verarbeitungsprozesse tatsächlich stattfinden. Die eigentliche Verarbeitung findet immer dann statt, wenn ein Ereignis aus der Warteschlange gelesen und einem Fensterobjekt zugeteilt wird. Ein Großteil der Anwendungslogik wird in Form von Reaktionen auf Benutzerereignisse implementiert.
Das Grundmuster ist das Hinzufügen einer Listener-Funktion zu einem bestimmten Fensterobjekt, das Sie erstellt haben. Sobald das entsprechende Ereignis eintritt, wird der Code für die Listener-Funktion ausgeführt. Das folgende einfache Beispiel wurde aus org.eclipse.swt.examples.helloworld.HelloWorld3 übernommen:
Display display = new Display (); Shell shell = new Shell (display); Label label = new Label (shell, SWT.CENTER); ... shell.addControlListener(new ControlAdapter() { public void controlResized(ControlEvent e) { label.setBounds (shell.getClientArea ()); } });
Für jeden Typ Listener-Funktion gibt es eine Schnittstelle, die die Listener-Funktion definiert (XyzListener), eine Klasse, die Ereignisinformationen bereitstellt (XyzEvent) und eine API-Methode, die die Listener-Funktion hinzufügt (addXyzListener). Wenn in der Schnittstelle einer Listener-Funktion mehrere Methoden definiert sind, gibt es außerdem einen Adapter (XyzAdapter), der die Schnittstelle der Listener-Funktion implementiert und leere Methoden bereitstellt. Alle Ereignisse, Listener-Funktionen und Adapter sind im Paket org.eclipse.swt.events definiert.
Die folgenden Tabellen fassen die verfügbaren Ereignisse und die Fensterobjekte, die das jeweilige Ereignis unterstützen, zusammen. Ereignisse können in zwei allgemeines Kategorien aufgeteilt werden: Ereignisse auf hoher Ebene, die eine logische Operation eines Steuerelements darstellen, und Ereignisse auf niedriger Ebene, die detailliertere Benutzerinteraktionen beschreiben. Ereignisse auf hohem Niveau können durch mehrere Ereignisse auf niedrigem Niveau dargestellt werden, die je nach Plattform unterschiedlich sein können. Ereignisse auf niedriger Ebene sollten allgemein nur für Implementierungen von angepassten Fensterobjekten verwendet werden.
Ereignistyp |
Beschreibung |
---|---|
Activate, Deactivate | Wird generiert, wenn ein Steuerelement aktiviert oder inaktiviert wird. |
Arm | Ein MenuItem wird gedrückt (hervorgehoben und bereit zur Auswahl). |
Close | Eine Shell ist kurz davor, geschlossen zu werden, so wie vom Fenstermanager angefordert. |
DefaultSelection | Der Benutzer wählt ein Element aus, indem er eine Standardauswahlaktion aufruft. Dies kann beispielsweise das Drücken der Eingabetaste oder eine Doppelklick auf eine Zeile in einer Tabelle sein. |
Dispose | Ein Fensterobjekt ist kurz davor, entfernt zu werden, entweder über das Programm oder durch den Benutzer. |
DragDetect | Der Benutzer hat eine mögliche Operation 'Ziehen' eingeleitet. |
Expand, Collapse | Ein Element einer Baumstruktur ist entweder erweitert oder ausgeblendet. |
Help | Der Benutzer hat Hilfe für ein Fensterobjekt angefordert. Dies ist beispielsweise der Fall, wenn unter Windows die Taste 'F1' gedrückt wird. |
Iconify, Deiconify | Eine Shell wurde minimiert, maximiert oder wieder hergestellt. |
MenuDetect | Der Benutzer hat ein Kontextmenü angefordert. |
Modify | Der Text eines Fensterobjekts wurde geändert. |
Move, Resize | Ein Steuerelement hat die Position geändert oder seine Größe wurde angepasst, entweder über das Programm oder durch den Benutzer. |
Selection | Der Benutzer wählt ein Element der Steuerung aus. Die kann beispielsweise ein einzelner Klick auf eine Zeile in einer Tabelle sein, oder eine Navigation durch die Elemente per Tastatur. |
SetData | Daten müssen bei Verwendung einer virtuellen Tabelle für ein 'TableItem' eingestellt werden. |
Show, Hide | Die Sichtbarkeit eines Steuerelements wurde geändert. |
Traverse | Ein Benutzer versucht, über einen Tastenanschlag aus der Steuerung heraus zu traversieren. Die Taste 'Escape' oder die Tabulatortaste werden beispielsweise für die Traversierung verwendet. |
Verify | Der Text eines Fensterobjekts ist kurz davor, geändert zu werden. Dieses Ereignis bietet der Anwendung die Möglichkeit, den Text zu ändern oder die Änderung zu verhindern. |
Ereignistyp |
Beschreibung |
---|---|
FocusIn, FocusOut | Der Fokus wurde auf ein Steuerelement gesetzt, bzw. von diesem entfernt. |
KeyDown, KeyUp | Der Benutzer hat eine Taste drückt oder losgelassen, sofern das Steuerelement im Tastatureingabebereich liegt. |
MouseDown, MouseUp, MouseDoubleClick | Der Benutzer hat die Maus über dem Steuerelement gedrückt, losgelassen oder doppelt geklickt. |
MouseMove | Der Benutzer hat die Maus über das Steuerelement bewegt. |
MouseEnter, MouseExit, MouseHover | Die Maus wurde über das Steuerelement geführt, von diesem heruntergenommen oder befindet sich über diesem. |
MouseWheel | Das Mausrad wurde gedreht. |
Paint | Das Steuerelement wurde beschädigt und muss neu ausgefüllt werden. |
Zusätzlich zu dem oben beschriebenen System der Ereignistypen unterstützt SWT einen maschinennahen Mechanismus für Fensterobjektereignisse ohne Ereignistyp. Der Mechanismus ohne Ereignistypen identifiziert den Ereignistyp anhand einer Konstanten und definiert eine generische Listener-Funktion, die mit dieser Konstante bereitgestellt wird. Auf diese Weise kann die Listener-Funktion eine vorgangsorientierte Listener-Funktion bereitstellen. Der folgende Ausschnitt definiert eine generische Steuerroutine für Ereignisse und fügt einer Shell mehrere Listener-Funktionen hinzu.
Shell shell = new Shell(); Listener listener = new Listener() { public void handleEvent(Event e) { switch (e.type) { case SWT.Resize: System.out.println ("Resize received"); break; case SWT.Paint: System.out.println ("Paint received"); break; default: System.out.println ("Unknown event received"); } } }; shell.addListener(SWT.Resize, listener); shell.addListener(SWT.Paint, listener);