Java AWT/Swing 事件模型建立在三大核心角色之上:
Button、TextField)。ActionEvent、MouseEvent),傳遞給監聽器。ActionListener)的物件,負責處理事件邏輯。事件源提供 addXxxListener(XxxListener l) 方法,將監聽器註冊至內部列表。當事件觸發(如按鈕點擊),事件源:
actionPerformed(ActionEvent e))。這是典型的觀察者模式應用:事件源為主題,監聽器為觀察者,鬆耦合實現關注點分離。
class EventDemo {
EventDemo() {
Button bt = new Button("變紅");
// 關鍵綁定:事件源 bt 註冊實作 ActionListener 的匿名/具名類
bt.addActionListener(new Test());
}
class Test implements ActionListener {
// 實作介面唯一方法:事件處理入口
@Override
public void actionPerformed(ActionEvent e) {
// e 封裝了按鈕點擊的完整上下文
System.out.println("按鈕被點擊:" + e.getActionCommand());
// 此處編寫業務邏輯:變色、彈窗、網路請求等
}
}
}
java.util.EventObject (根事件類)
└─ java.awt.AWTEvent
├─ ActionEvent (按鈕、菜單動作)
├─ MouseEvent (滑鼠操作)
├─ KeyEvent (鍵盤輸入)
├─ WindowEvent (視窗狀態變化)
└─ ...其他具體事件類
java.util.EventListener (標記介面)
├─ ActionListener → actionPerformed(ActionEvent)
├─ MouseListener → mouseClicked/Pressed/Released/Entered/Exited
├─ MouseMotionListener → mouseDragged/Moved
├─ KeyListener → keyTyped/Pressed/Released
└─ ...其他監聽器介面
當監聽器介面包含多個方法(如 MouseListener 有 5 個),只關心其中幾個時,可繼承對應適配器類(MouseAdapter),僅覆寫需求方法:
button.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// 僅處理點擊,無需實作空方法
}
});
所有 Swing 事件回調均在事件派發執行緒(EDT)執行。嚴禁在監聽器中執行耗時操作(網路、資料庫、大量運算),否則會凍結 UI。正確做法:
SwingWorker 將耗時任務移至背景執行緒。ExecutorService,完成後用 SwingUtilities.invokeLater() 回到 EDT 更新 UI。業務系統常需自定義事件(如「訂單建立」、「庫存預警」):
// 1. 定義事件類
class OrderEvent extends EventObject {
private String orderId;
public OrderEvent(Object source, String orderId) { super(source); this.orderId = orderId; }
public String getOrderId() { return orderId; }
}
// 2. 定義監聽器介面
interface OrderListener extends EventListener {
void orderCreated(OrderEvent e);
}
// 3. 事件源管理監聽器
class OrderService {
private final List listeners = new CopyOnWriteArrayList<>();
public void addOrderListener(OrderListener l) { listeners.add(l); }
public void removeOrderListener(OrderListener l) { listeners.remove(l); }
public void createOrder(String id) {
// 業務邏輯...
fireOrderCreated(new OrderEvent(this, id));
}
private void fireOrderCreated(OrderEvent e) {
for (OrderListener l : listeners) l.orderCreated(e);
}
}
Java 事件機制以介面契約為核心,透過註冊-回調實現事件源與處理邏輯的解耦。理解「事件源長耳朵(實作介面)、事件對象傳遞上下文、EDT 執行緒模型」三大要點,即可靈活驅動 GUI 與業務系統的事件流轉。