Java 圖形界面編程的核心在於事件驅動模型。本文以 AWT 為例,系統講解事件源、事件對象、監聽器接口、適配器類與匿名內部類的協作機制,並通過規範化的代碼結構展示最佳實踐。
流程:事件源發生動作 → 創建事件對象 → 調用已註冊監聽器的對應方法
| 事件類型 | 事件對象 | 監聽器接口 | 關鍵方法 |
|---|---|---|---|
| 動作事件 | ActionEvent | ActionListener | actionPerformed(ActionEvent e) |
| 視窗事件 | WindowEvent | WindowListener | windowClosing/Opened/Closed... 共 7 方法 |
| 滑鼠事件 | MouseEvent | MouseListener/MouseMotionListener | clicked/pressed/released/entered/exited/dragged/moved |
| 鍵盤事件 | KeyEvent | KeyListener | keyPressed/Released/Typed |
為避免實現接口所有方法,Java 提供適配器類(空實現):
WindowAdapter → 只需覆寫關心的方法(如 windowClosing)MouseAdapter、KeyAdapter、FocusAdapter 等import java.awt.*;
import java.awt.event.*;
public class EventDemo extends Frame {
private Button btnSubmit;
private TextField txtInput;
private TextArea txtLog;
public EventDemo() {
initComponents();
layoutComponents();
registerListeners();
setVisible(true);
}
private void initComponents() {
btnSubmit = new Button("提交");
txtInput = new TextField(20);
txtLog = new TextArea(10, 30);
txtLog.setEditable(false);
}
private void layoutComponents() {
setTitle("事件處理演示");
setBounds(300, 200, 400, 300);
setLayout(new BorderLayout());
Panel top = new Panel(new FlowLayout());
top.add(new Label("輸入:"));
top.add(txtInput);
top.add(btnSubmit);
add(top, BorderLayout.NORTH);
add(new ScrollPane(txtLog), BorderLayout.CENTER);
}
private void registerListeners() {
// 1. 按鈕點擊事件 - 匿名內部類 + Lambda
btnSubmit.addActionListener(e -> {
String text = txtInput.getText().trim();
if (!text.isEmpty()) {
txtLog.append("收到輸入: " + text + "\n");
txtInput.setText("");
}
});
// 2. 視窗關閉事件 - 適配器類
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
// 3. 文本框回車事件 - 另一種註冊方式
txtInput.addActionListener(e ->
btnSubmit.dispatchEvent(new ActionEvent(btnSubmit, ActionEvent.ACTION_PERFORMED, "enter"))
);
}
public static void main(String[] args) {
new EventDemo();
}
}
所有事件處理代碼運行在 Event Dispatch Thread (EDT) 中。耗時操作(網絡、資料庫、大量計算)必須放入背景線程(SwingWorker、ExecutorService),否則界面會凍結。
事件驅動是 GUI 程式的靈魂。理解「源-對象-監聽器」三角關係,熟練運用適配器與 Lambda,遵循 EDT 線程規則,就能編寫出響應迅速、結構清晰、易於維護的桌面應用程式。