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

Java 事件處理機制核心:發生與處理解耦、自定義事件實作指南

     編輯:Java 相關知識

Java 事件模型核心在於事件源與事件監聽器分離。事件源(如 JButton)只負責產生事件物件(ActionEvent),不關心誰處理;監聽器(ActionListener)註冊到事件源,關心特定事件並實作處理邏輯。這種「觀察者模式」讓元件高內聚、低耦合。

標準事件流程

  1. 事件源發生狀態變化(使用者點擊按鈕)。
  2. 事件源建立事件物件(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "click"))。
  3. 事件源遍歷已註冊的監聽器清單,呼叫 listener.actionPerformed(event)。
  4. 監聽器內部執行業務邏輯(如改變 JPanel 背景色)。

何時需要自定義事件?

當多個未知數量的物件對某類別的狀態變化感興趣時。若只有固定幾個物件關心,直接呼叫其方法或用回呼介面即可;若只有自己關心,內部處理即可。自定義事件適合「廣播」場景。

自定義事件三件套實作

// 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 或同步集合保證執行緒安全。
  • 遵循 JavaBeans 命名慣例,IDE 可自動識別並生成綁定代碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved