Java事件處理機制
本文來自CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/feicongcong/article/details/76685848?utm_source=copy
Java事件處理機制
java中的事件機制的參與者有3種角色:
1.event object(事件類,事件觸發/釋出):事件狀態物件,用於listener的相應的方法之中,作為引數,一般存在於listerner的方法之中
2.event source(事件源類):具體的事件源,比如說,你點選一個button,那麼button就是event source,要想使button對某些事件進行響應,你就需要註冊特定的listener。
3.event listener(監聽類):對每個明確的事件的發生,都相應地定義一個明確的Java方法。這些方法都集中定義在事件監聽者(EventListener)介面中,這個介面要繼承 java.util.EventListener。 實現了事件監聽者介面中一些或全部方法的類就是事件監聽者。
伴隨著事件的發生,相應的狀態通常都封裝在事件狀態物件中,該物件必須繼承自java.util.EventObject。事件狀態物件作為單參傳遞給應響應該事件的監聽者方法中。發出某種特定事件的事件源的標識是:遵從規定的設計格式為事件監聽者定義註冊方法,並接受對指定事件監聽者介面例項的引用。
具體的對監聽的事件類,當它監聽到event object產生的時候,它就呼叫相應的方法,進行處理。
先看看jdk提供的event包:
public interface EventListener:所有事件偵聽器介面必須擴充套件的標記介面。
public class EventObject extends Object implements Serializable
所有事件狀態物件都將從其派生的根類。 所有 Event 在構造時都引用了物件 "source",在邏輯上認為該物件是最初發生有關 Event 的物件。
(1)通過DoorEvent.java檔案建立DoorEvent類,這個類繼承EventObject。
/** * 定義事件物件,必須繼承EventObject */ public class DoorEvent extends EventObject { private static final long serialVersionUID = 6496098798146410884L; private String doorState = "";// 表示門的狀態,有“開”和“關”兩種 public DoorEvent(Object source, String doorState) { super(source); this.doorState = doorState; } public void setDoorState(String doorState) { this.doorState = doorState; } public String getDoorState() { return this.doorState; } }
(2)定義新的事件監聽介面,該介面繼承自EventListener;該介面包含對doorEvent事件的處理程式:
/**
* 定義監聽介面,負責監聽DoorEvent事件
*/
public interface DoorListener extends EventListener {
public void doorEvent(DoorEvent event);
}
通過上面的介面我們再定義事件監聽類,這些類具體實現了監聽功能和事件處理功能。
/**
* 該類為 門1監聽介面的實現,做具體的開門,關門動作
*/
public class DoorListener1 implements DoorListener {
@Override
public void doorEvent(DoorEvent event) {
// TODO Auto-generated method stub
if (event.getDoorState() != null && event.getDoorState().equals("open")) {
System.out.println("門1開啟");
} else {
System.out.println("門1關閉");
}
}
}
/**
* 該類為 門2監聽介面的實現,做具體的開門,關門,以及開燈,關燈動作
*/
public class DoorListener2 implements DoorListener {
@Override
public void doorEvent(DoorEvent event) {
// TODO Auto-generated method stub
if (event.getDoorState() != null && event.getDoorState().equals("open")) {
System.out.println("門2開啟,同時開啟走廊的燈");
} else {
System.out.println("門2關閉,同時關閉走廊的燈");
}
}
}
(3)通過DoorManager.java創造一個事件源類,它用一個Collection listeners物件來儲存所有的事件監聽器物件,儲存方式是通過addDoorListener(..)這樣的方法。notifyListeners(..)是觸發事件的方法,用來通知系統:事件發生了,你呼叫相應的處理函式吧。
/**
* 事件源物件,在這裡你可以把它想象成一個控制開門關門的遙控器,
* (如果是在swing中,就類似一個button)
*/
public class DoorManager {
private Collection listeners;
/**
* 新增事件
*
* @param listener
* DoorListener
*/
public void addDoorListener(DoorListener listener) {
if (listeners == null) {
listeners = new HashSet();
}
listeners.add(listener);
}
/**
* 移除事件
*
* @param listener
* DoorListener
*/
public void removeDoorListener(DoorListener listener) {
if (listeners == null)
return;
listeners.remove(listener);
}
/**
* 觸發開門事件
*/
protected void fireWorkspaceOpened() {
if (listeners == null)
return;
DoorEvent event = new DoorEvent(this, "open");
notifyListeners(event);
}
/**
* 觸發關門事件
*/
protected void fireWorkspaceClosed() {
if (listeners == null)
return;
DoorEvent event = new DoorEvent(this, "close");
notifyListeners(event);
}
/**
* 通知所有的DoorListener
*/
private void notifyListeners(DoorEvent event) {
Iterator iter = listeners.iterator();
while (iter.hasNext()) {
DoorListener listener = (DoorListener) iter.next();
listener.doorEvent(event);
}
}
}
(4)好了,最後寫一個測試程式測試一下我們自定義的事件吧
/**
* 主程式,就想象成要開門的哪個人
*/
public class DoorMain {
public static void main(String[] args) {
DoorManager manager = new DoorManager();
manager.addDoorListener(new DoorListener1());// 給門1增加監聽器
manager.addDoorListener(new DoorListener2());// 給門2增加監聽器
// 開門
manager.fireWorkspaceOpened();
System.out.println("我已經進來了");
// 關門
manager.fireWorkspaceClosed();
}
}
執行DoorMain
門1開啟
門2開啟,同時開啟走廊的燈我已經進來了
門1關閉
門2關閉,同時關閉走廊的燈