Gdy zostanie już utworzony ekran i widgety oraz uruchomiona kolejka komunikatów, warto się zastanowić, gdzie jest wykonywana faktyczna praca. Odbywa się to za każdym razem, gdy z kolejki zostanie wczytane zdarzenie i przesłane do widgetu. Większa część logiki aplikacji jest implementowana jako odpowiedzi na zdarzenia użytkowników.
Podstawowym wzorcem postępowania jest dodanie funkcji nasłuchiwania do utworzonego widgetu, a w momencie wystąpienia odpowiedniego zdarzenia, wykonanie kodu tej funkcji. Poniższy prosty przykład został zaadaptowany z przykładu org.eclipse.swt.examples.helloworld.HelloWorld3:
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 ()); } });
Dla każdego typu funkcji nasłuchiwania istnieje interfejs definiujący tę funkcję (XyzListener), klasa udostępniająca informacje o zdarzeniu (XyzEvent) oraz metoda API, która służy do dodawania funkcji nasłuchiwania (addXyzListener). Gdy w interfejsie nasłuchiwania zdefiniowano kilka metod, udostępniany jest także adapter (XyzAdapter), który implementuje interfejs nasłuchiwania i udostępnia puste metody. Wszystkie zdarzenia, funkcje nasłuchiwania i adaptery są zdefiniowane w pakiecie org.eclipse.swt.events.
Poniższa tabela zawiera zestawienie dostępnych zdarzeń i widgetów obsługujących każde zdarzenie. Zdarzenia można podzielić na dwie ogólne kategorie: zdarzenia wysokiego poziomu, które reprezentują logiczne operacje wykonywane na polu sterującym, oraz zdarzenia niskiego poziomu, które opisują bardziej szczegółowe interakcje użytkownika. Zdarzenia wysokiego poziomu mogą być reprezentowane przez wiele zdarzeń niskiego poziomu, które mogą różnić się w zależności od platformy. Ogólnie zdarzenia niskiego poziomu powinny być używane tylko w niestandardowych implementacjach widgetów.
Typ zdarzenia |
Opis |
---|---|
Activate, Decativate | Generowane, gdy pole sterujące jest aktywowane lub dezaktywowane. |
Arm | Generowane, gdy pozycja menu jest przygotowana do wybrania (została wyróżniona i jest gotowa do wybrania). |
Close | Generowane, gdy powłoka jest zamykana na żądanie menedżera okna. |
DefaultSelection | Generowane, gdy użytkownik wybiera element przez wywołanie akcji domyślnego wyboru, na przykład wciskając klawisz Enter lub dwukrotnie klikając wiersz w tabeli. |
Dispose | Generowane, gdy widget jest utylizowany programowo lub przez użytkownika. |
DragDetect | Generowane, gdy użytkownik zainicjował operację przeciągania. |
Expand, Collapse | Generowane, gdy element drzewa jest rozwijany lub zwijany. |
Help | Generowane, gdy użytkownik zażądał pomocy dotyczącej widgetu. Na przykład może wystąpić, gdy w systemie Windows zostanie wciśnięty klawisz F1. |
Iconify, Deiconify | Generowane, gdy powłoka została zminimalizowana, zmaksymalizowana lub odtworzona. |
MenuDetect | Generowane, gdy użytkownik zażądał menu kontekstowego. |
Modify | Generowane, gdy tekst widgetu został zmodyfikowany. |
Move, Resize | Generowane, gdy pozycja lub rozmiar pola sterującego zostały zmienione programowo lub przez użytkownika. |
Selection | Generowane, gdy użytkownik wybiera element pola sterującego. Na przykład przez pojedyncze kliknięcie wiersza w tabeli lub przechodzenie między elementami za pomocą klawiatury. |
SetData | Generowane, gdy należy ustawić dane w tabeli elementów, jeśli używana jest tabela wirtualna. |
Show, Hide | Generowane, gdy uległa zmianie widoczność pola sterującego. |
Traverse | Generowane, gdy użytkownik próbuje wyjść z pola sterującego, naciskając klawisz. Na przykład mogą być używane klawisze Escape lub Tab. |
Verify | Generowane, gdy tekst widgetu ma właśnie zostać zmodyfikowany. To zdarzenie pozwala aplikacji zmienić tekst lub zapobiec jego modyfikacji. |
Typ zdarzenia |
Opis |
---|---|
FocusIn, FocusOut | Generowane, gdy pole sterujące przestało być aktywne lub zostało aktywowane. |
KeyDown, KeyUp | Generowane, gdy użytkownik nacisnął lub zwolnił klawisz na klawiaturze, gdy pole jest aktywne dla klawiatury. |
MouseDown, MouseUp, MouseDoubleClick | Generowane w momencie naciśnięcia lub zwolnienia przycisku myszy albo dwukrotnego kliknięcia, gdy wskaźnik myszy znajduje się w obrębie pola sterującego. |
MouseMove | Generowane, gdy użytkownik przesunął wskaźnik myszy nad polem sterującym. |
MouseEnter, MouseExit, MouseHover | Generowane w momencie wprowadzenia wskaźnika myszy w obszar pola sterującego, wyjścia wskaźnika poza ten obszar lub zatrzymania go w tym obszarze. |
MouseWheel | Generowane, gdy kółko myszy jest obracane. |
Paint | Generowane, gdy pole sterujące zostało zniszczone i wymaga ponownego malowania. |
Oprócz opisanego powyżej systemu zdarzeń działającego na podstawie typów, pakiet SWT obsługuje mechanizm beztypowych zdarzeń widgetu niskiego poziomu. Mechanizm zdarzeń beztypowych opiera się na stałej identyfikującej typ zdarzenia i definiuje ogólną funkcję nasłuchiwania dostarczaną przez tę stałą. Umożliwia to implementację funkcji nasłuchiwania z wyrażeniem warunkowym "case". Poniższy fragment kodu zawiera definicję procedury obsługi zdarzenia ogólnego oraz dodaje kilka funkcji nasłuchiwania do powłoki.
Shell shell = new Shell (); Listener listener = new Listener () { public void handleEvent (Event e) { switch (e.type) { case SWT.Resize: System.out.println ("Odebrano zdarzenie zmiany rozmiaru"); break; case SWT.Paint: System.out.println ("Odebrano zdarzenie malowania"); break; default: System.out.println ("Odebrano nieznane zdarzenie"); } } }; shell.addListener (SWT.Resize, listener); shell.addListener (SWT.Paint, listener);