編寫 SWT 程式的核心步驟:佈局使用者介面、綁定事件處理。SWT 事件模型設計簡潔直觀——每種事件對應一個 Listener 介面,Widget 提供 addXxxListener() 註冊。本文透過完整範例,帶你快速上手事件處理、適配器模式簡化程式碼、事件物件傳遞的關鍵資訊。
public class EventDemo {
private Shell shell;
public EventDemo() {
Display display = new Display();
shell = new Shell(display, SWT.SHELL_TRIM);
shell.setLayout(new RowLayout());
shell.setText("Event Demo");
Button button = new Button(shell, SWT.PUSH | SWT.CENTER);
button.setText("Click me!");
// 註冊選擇事件監聽器
button.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
handleSelectionEvent(); // 實際業務邏輯
}
@Override
public void widgetDefaultSelected(SelectionEvent e) { /* 不關心 */ }
});
shell.setBounds(200, 300, 300, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
private void handleSelectionEvent() {
MessageBox dialog = new MessageBox(shell, SWT.OK | SWT.ICON_INFORMATION);
dialog.setText("Hello");
dialog.setMessage("Hello, World!");
dialog.open();
}
// main、getter/setter 省略
}
SelectionListener)。Listener 介面常含多方法(如 SelectionListener 有兩個),若只關心其中一個,仍需實作所有方法。SWT 提供對應 Adapter 抽象類(如 SelectionAdapter),預設實作為空,僅需覆寫關心方法:
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleSelectionEvent();
}
});
事件處理方法參數 EventObject 子類型提供豐富上下文:
| 事件類型 | 事件物件 | 關鍵屬性 | 說明 |
|---|---|---|---|
| 鍵盤 | KeyEvent | character, keyCode, stateMask, doit | character 為按鍵字符;keyCode 為 SWT 虛擬鍵碼(如 SWT.F1);stateMask 檢測 Ctrl/Shift/Alt;doit=false 可取消事件 |
| 滑鼠 | MouseEvent | button, x, y, stateMask, doit | button: 1=左鍵 2=右鍵;x/y 為相對控件座標;stateMask 同鍵盤 |
| 視窗 | ShellEvent | doit | shellClosed 中設 doit=false 可阻止視窗關閉 |
text1.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
// e.character 取得按鍵字符,即時顯示於 text2
text2.setText(String.valueOf(e.character));
}
});
除強類型 Listener,SWT 還支援通用 Listener + Event 機制(在 org.eclipse.swt.widgets 套件)。單一 handleEvent(Event e) 處理所有事件,透過 e.type 區分(如 SWT.Resize, SWT.Paint)。適合需集中處理多種事件、或動態註冊場景。
Listener listener = e -> {
switch (e.type) {
case SWT.Resize: System.out.println("Resize"); break;
case SWT.Paint: System.out.println("Paint"); break;
}
};
shell.addListener(SWT.Resize, listener);
shell.addListener(SWT.Paint, listener);
掌握事件模型,是構建豐富互動 SWT 應用的基石。下一步將探索更多進階控件與佈局技巧。