首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SWT/JFace 入門指南:掌握事件處理機制,讓介面動起來

     編輯:Java 相關知識

編寫 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 省略
}

三步驟掌握事件處理流程

  1. 依事件類型找對應 Listener(如點擊對應 SelectionListener)。
  2. 實作 Listener 介面(或繼承 Adapter,見下)。
  3. 在關心的方法填寫邏輯,不關心的留空。

適配器模式:告別空方法煩惱

Listener 介面常含多方法(如 SelectionListener 有兩個),若只關心其中一個,仍需實作所有方法。SWT 提供對應 Adapter 抽象類(如 SelectionAdapter),預設實作為空,僅需覆寫關心方法:

button.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(SelectionEvent e) {
        handleSelectionEvent();
    }
});

事件物件:攜帶上下文關鍵資訊

事件處理方法參數 EventObject 子類型提供豐富上下文:

常見事件物件屬性速查

事件類型事件物件關鍵屬性說明
鍵盤KeyEventcharacter, keyCode, stateMask, doitcharacter 為按鍵字符;keyCode 為 SWT 虛擬鍵碼(如 SWT.F1);stateMask 檢測 Ctrl/Shift/Alt;doit=false 可取消事件
滑鼠MouseEventbutton, x, y, stateMask, doitbutton: 1=左鍵 2=右鍵;x/y 為相對控件座標;stateMask 同鍵盤
視窗ShellEventdoitshellClosed 中設 doit=false 可阻止視窗關閉

鍵盤事件範例:即時同步輸入

text1.addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        // e.character 取得按鍵字符,即時顯示於 text2
        text2.setText(String.valueOf(e.character));
    }
});

Untyped Events:萬能事件處理器

除強類型 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 應用的基石。下一步將探索更多進階控件與佈局技巧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved