一旦我們建立一個顯示畫面和某些 Widget 並啟動應用程式的訊息迴圈,哪裡才是作用真正發生的時候? 每次從佇列中讀取事件並分派給 Widget 時便會發生。 大部份應用程式邏輯被實作為使用者事件的回應。
基礎模式是將接聽器新增到您所建立的一些 Widget, 而且當適當的事件發生時,將執行接聽器程式碼。這個簡單範例改編自 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 中。
下表彙總可用事件及支援每一事件的 Widget。
事件類型 |
說明 |
Widget |
---|---|---|
Arm |
當 Widget(例如功能表項目)待命時產生。 |
MenuItem |
Control |
當移動或調整控制項大小時產生。 |
Control, TableColumn, Tracker |
Dispose |
當 Widget 經由程式或使用者除去時產生。 |
Widget |
Focus |
當控制項取得或失去焦點時產生。 |
Control |
Help |
當使用者要求 Widget 說明(例如按 F1 鍵)時產生。 |
Control, Menu, MenuItem |
Key |
當控制項有鍵盤焦點而使用者按下或放開鍵盤按鍵時產生。 |
Control |
Menu |
當隱藏或顯示功能表時產生。 |
Menu |
Modify |
當修改 Widget 文字時產生。 |
CCombo, Combo, Text, StyledText |
Mouse |
當使用者在控制項上按下、放開或按兩下滑鼠時產生。 |
Control |
MouseMove |
當使用者將滑鼠移過控制項時產生。 |
Control |
MouseTrack |
當滑鼠進入、離開或橫越控制項時產生。 |
Control |
Paint |
當控制項需要重繪時產生。 |
Control |
Selection |
當使用者選取控制項中的項目時產生。 |
Button, CCombo, Combo, CoolItem, CTabFolder, List, MenuItem, Sash, Scale, ScrollBar, Slider, StyledText, TabFolder, Table, Table Cursor, TableColumn, TableTree, Text, ToolItem, Tree |
Shell |
當 Shell 最小化、最大化、啟動、取消啟動或關閉時產生。 |
Shell |
Traverse |
當使用者使用按鍵遍訪控制項時產生。 |
Control |
Tree |
當使用者展開或收合樹狀結構中的項目時產生。 |
Tree, TableTree |
Verify |
當 Widget 的文字即將被修改時產生。讓應用程式有機會改變文字或阻止修正。 |
Text, StyledText |
上述的典型事件系統是透過低層次、非典型 Widget 事件機制實作的。 這個機制不是設計來供應用程式使用,但您會看到它在 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);