Zdarzenia

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.

Zdarzenia wysokiego poziomu

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.

Zdarzenia niskiego poziomu

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.

Zdarzenia beztypowe

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