我們已經瞭解如何建立顯示畫面及一些小組件來執行應用程式的訊息迴圈。 真實的工作會在哪裡發生?每次從佇列中讀取事件並分派給小組件時便會發生。 大部份應用程式邏輯被實作為使用者事件的回應。
基本方式是將接聽器新增到您所建立的一些小組件。當發生適當的事件時,便會執行 接聽器程式碼。這個簡單範例改編自 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 ());
}
});
以每一種接聽器類型而言,都有一個定義接聽器 (XyzListener) 的介面,一 個提供事件資訊 (XyzEvent) 的類別,以及一個新增接聽器 (addXyzListener) 的 API 方法。 如果接聽器介面中定義了多個方法 ,便會提供實作接聽器介面及提供空白方法的配接器 (XyzAdapter)。所有事 件、接聽器和配接器皆定義於套件 org.eclipse.swt.events 中。
下表彙總可用事件及支援每一事件的小組件。
事件類型 |
說明 |
小組件 |
---|---|---|
Arm |
當小組件(例如功能表項目)待命時產生。 |
MenuItem |
Control |
當移動或調整控制項大小時產生。 |
Control、TableColumn、Tracker |
Dispose |
當小組件經由程式或使用者除去時產生。 |
Widget |
Focus |
當控制項取得或失去焦點時產生。 |
Control |
Help |
當使用者要求小組件說明(例如按 F1 鍵)時產生。 |
Control、Menu、MenuItem |
Key |
當控制項有鍵盤焦點而使用者按下或放開鍵盤按鍵時產生。 |
Control |
Menu |
當隱藏或顯示功能表時產生。 |
Menu |
Modify |
當修改小組件文字時產生。 |
CCombo、Combo、Text、StyledText |
Mouse |
當使用者在控制項上按下、放開或按兩下滑鼠時產生。 |
Control |
MouseMove |
當使用者將滑鼠移過控制項時產生。 |
Control |
MouseTrack |
當滑鼠進入、離開或橫越控制項時產生。 |
Control |
Paint |
當控制項需要重繪時產生。 |
Control |
Selection |
當使用者選取控制項中的項目時產生。 |
Button、CCombo、Combo、CTabFolder、List、MenuItem、Sash、Scale、 ScrollBar、Slider、StyledText、TabFolder、Table、TableColumn、TableTree、 Text、ToolItem、Tree |
Shell |
當 Shell 最小化、最大化、啟動、取消啟動或關閉時產生。 |
Shell |
Traverse |
當使用者使用按鍵遍訪控制項時產生。 |
Control |
Tree |
當使用者展開或收合樹狀結構中的項目時產生。 |
Tree、TableTree |
Verify |
當小組件的文字即將被修改時產生。讓應用程式有機會改變文字或阻止修正。 |
Text、StyledText |
上述的典型事件系統是透過低層次、非典型小組件事件機制實作的。 這個機制不是設計來供應用程式使用,但您會看到它在 SWT 實作方式內使用。 它也用於許多工作台精靈頁面實作方式。
非典型機制根據某常數來識別事件類型及定義此常數提供的通用接聽器。 這可讓接聽器實作 "case style" 接聽器。在下列片段中,我們定義一個 通用事件處理程式並將許多接聽器新增至 Shell。
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);