1. 程式人生 > >Java事件處理機制

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關閉,同時關閉走廊的燈