Java 事件模型核心在於事件源與事件監聽器分離。事件源(如 JButton)只負責產生事件物件(ActionEvent),不關心誰處理;監聽器(ActionListener)註冊到事件源,關心特定事件並實作處理邏輯。這種「觀察者模式」讓元件高內聚、低耦合。
new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "click"))。listener.actionPerformed(event)。當多個未知數量的物件對某類別的狀態變化感興趣時。若只有固定幾個物件關心,直接呼叫其方法或用回呼介面即可;若只有自己關心,內部處理即可。自定義事件適合「廣播」場景。
// 1. 事件類別
public class MyEvent extends EventObject {
private String message;
public MyEvent(Object source, String msg) { super(source); this.message = msg; }
public String getMessage() { return message; }
}
// 2. 監聽器介面
public interface MyListener extends EventListener {
void myPerformed(MyEvent e);
}
// 3. 事件源類別
public class EventSource {
private final List listeners = new ArrayList<>();
public void addMyListener(MyListener l) { listeners.add(l); }
public void removeMyListener(MyListener l) { listeners.remove(l); }
protected void fireMyEvent(String msg) {
MyEvent event = new MyEvent(this, msg);
for (MyListener l : listeners) {
l.myPerformed(event);
}
}
// 觸發時機範例
public void doSomething() {
// 業務邏輯...
fireMyEvent("狀態已更新");
}
}
EventSource source = new EventSource();
source.addMyListener(e -> System.out.println("Listener A 收到: " + e.getMessage()));
source.addMyListener(e -> System.out.println("Listener B 處理: " + e.getMessage()));
source.doSomething();
// 輸出:
// Listener A 收到: 狀態已更新
// Listener B 處理: 狀態已更新
java.util.EventObject,攜帶事件源引用與上下文資料。java.util.EventListener(標記介面),方法命名慣例 xxxPerformed/xxxChanged。addXxxListener/removeXxxListener,內部用 CopyOnWriteArrayList 或同步集合保證執行緒安全。