一旦我們建立一個顯示畫面和某些小組件並啟動應用程式的訊息迴圈,哪裡才是作用真正發生的時候? 每次從佇列中讀取事件並分派給小組件時便會發生。 大部分應用程式邏輯被實作為使用者事件的回應。
基礎模式是將接聽器新增至您所建立的一些小組件, 而且當適當的事件發生時,將執行接聽器程式碼。這個簡單範例改編自 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 中。
下表彙總可用事件及支援每一事件的小組件。事件可分成兩個一般種類: 一是代表控制項上邏輯運算的高層次事件,二是說明更特定之使用者交談作業的低層次事件。高層次事件可能由多個低層次事件所代表,而每個平台的低層次事件可能都不盡相同。一般而言,低層次事件應該只用來實作自訂小組件。
事件類型 |
說明 |
---|---|
Activate、Decativate | 啟動或取消啟動「控制項」時產生。 |
Arm | MenuItem 待命中(已反白且已準備好要選取)。 |
Close | 如視窗管理程式所要求,即將關閉 Shell。 |
DefaultSelection | 使用者藉由呼叫預設選項動作來選取項目。例如,點擊 Enter 鍵,或連按兩下「表格」中的列。 |
Dispose | 即將以程式的方式或由使用者除去小組件。 |
DragDetect | 使用者已起始可能的拖曳作業。 |
Expand、Collapse | 已展開或收合「樹狀結構」中的項目。 |
Help | 使用者已要求小組件說明。例如,在 Windows 中按下 F1 鍵時,便會發生此事件。 |
Iconify、Deiconify | 已最小化、最大化或還原 Shell。 |
MenuDetect | 使用者已要求快速功能表。 |
Modify | 已修改小組件文字。 |
Move、Resize | 以程式的方式或由使用者變更控制項的位置,或調整控制項大小。 |
Selection | 使用者選取控制項中的項目。例如,按一下「表格」中的列,或用鍵盤導覽所有項目。 |
SetData | 使用虛擬表格時,必須在 TableItem 上設定資料。 |
Show、Hide | 已變更控制項的可見性。 |
Traverse | 使用者正在嘗試用按鍵遍訪控制項。例如,用跳出鍵或 Tab 鍵來遍訪。 |
Verify | 即將修改小組件文字。此事件讓應用程式有機會改變文字或阻止修正。 |
事件類型 |
說明 |
---|---|
FocusIn、FocusOut | 控制項已取得或遺失焦點。 |
KeyDown、KeyUp | 使用者在控制項取得鍵盤焦點時,按下或放開鍵盤按鍵。 |
MouseDown、MouseUp、MouseDoubleClick | 使用者在控制項已按下、放開或連按兩下滑鼠。 |
MouseMove | 使用者已在控制項上移動滑鼠。 |
MouseEnter、MouseExit、MouseHover | 滑鼠已進入、離開或在控制項上滑動。 |
MouseWheel | 已旋轉滑鼠滾輪。 |
Paint | 控制項已損壞或需要重繪。 |
除了上述的典型事件系統外,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);