Ereignisse

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.

Ereignisse auf hoher Ebene

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.

Ereignisse auf niedriger Ebene

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.

Ereignis ohne Ereignistyp

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);