Nach der Erstellung einer Anzeige und verschiedener Widgets 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 Widget 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 Widget, 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-Funktionhinzufü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 folgende Tabelle fasst die verfügbaren Ereignisse und die Widgets, die das jeweilige Ereignis unterstützen, zusammen.
Ereignistyp |
Beschreibung |
Widgets |
---|---|---|
Arm |
Wird generiert, wenn ein Widget (z. B. eine Menüoption) "gedrückt" wird. |
MenuItem |
Control |
Wird generiert, wenn ein Steuerelement versetzt oder seine Größe geändert wird. |
Control, TableColumn, Tracker |
Dispose |
Wird generiert, wenn ein Widget entweder über das Programm oder durch den Benutzer entfernt wird. |
Widget |
Focus |
Wird generiert, wenn der Fokus auf ein Steuerelement gesetzt bzw. von ihm genommen wird. |
Control |
Help |
Wird generiert, wenn der Benutzer Hilfe zu einem Widget anfordert, beispielsweise durch Drücken der Taste F1. |
Control, Menu, MenuItem |
Key |
Wird generiert, wenn der Benutzer eine Taste drückt oder loslässt, sofern das Steuerelement im Tastatureingabebereich liegt. |
Control |
Menu |
Wird generiert, wenn ein Menü angezeigt oder verdeckt wird. |
Menu |
Modify |
Wird angezeigt, wenn der Text eines Widgets geändert wird. |
CCombo, Combo, Text, StyledText |
Mouse |
Wird generiert, wenn der Benutzer die Maus über dem Steuerelement drückt, loslässt oder doppelklickt. |
Control |
MouseMove |
Wird generiert, wenn der Benutzer die Maus über das Steuerelement zieht. |
Control |
MouseTrack |
Wird generiert, das Steuerelement über die Maus aktiviert, inaktiviert oder die Maus über das Steuerelement gezogen wird. |
Control |
Paint |
Wird generiert, wenn das Steuerelement erneut gezeichnet werden muss. |
Control |
Selection |
Wird generiert, wenn der Benutzer ein Element im Steuerelement auswählt. |
Button, CCombo, Combo, CoolItem, CTabFolder, List, MenuItem, Sash, Scale, ScrollBar, Slider, StyledText, TabFolder, Table, Table Cursor, TableColumn, TableTree, Text, ToolItem, Tree |
Shell |
Wird generiert, wenn eine Shell auf Symbolgröße oder auf Vollbildgröße gesetzt, aktiviert, inaktiviert oder geschlossen wird. |
Shell |
Traverse |
Wird generiert, wenn sich ein Benutzer durch Tastatureingaben durch ein Steuerelement bewegt. |
Control |
Tree |
Wird generiert, wenn der Benutzer Einträge in einer Baumstruktur erweitert bzw. komprimiert. |
Tree, TableTree |
Verify |
Wird generiert, wenn der Text eines Widgets geändert werden soll. Auf diese Weise kann die Anwendung die Textänderung zulassen oder verhindern. |
Text, StyledText |
Die oben beschriebene System der Ereignistypen wird durch einen maschinennahen Mechanismus für Widget-Ereignisse ohne Ereignistyp implementiert. Dieser Mechanismus ist nicht zur Verwendung durch Anwendungen gedacht. Er ist jedoch innerhalb der SWT-Implementierung erkennbar. Außerdem wird er bei vielen Implementierungen von Assistentenseiten der Workbench eingesetzt.
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. Das folgenden Snippet 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);