1、Java 事件
java中的事件機制的參與者有3種角色:
1.event object:事件狀態物件,用於listener的相應的方法之中,作為參數,一般存在與listerner的方法之中
2.event source:具體的事件來源,比如說,你點擊一個button,那麼button就是event source,要想使button對某些事件進行響應,你就需要註冊特定的listener。
3.event listener:具體的對監聽的事件類別,當它監聽到event object產生的時候,它就調用相應的方法,進行處理。
與jbpm中的 task,event,action 類似
與vb相比,java 的事件機制複雜一些,但功能更強大,也更底層。
事件機制不論表現得多麼強大,其本質還是由類屬性、方法來完成。
如本例的一個事件來源:
- /**
- * 事件來源對象,在這裡你可以把它想象成一個控制開門關門的遙控器,
- * (如果是在swing中,就類似一個button)
- */
- package test;
- import java.util.*;
- 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);
- }
- }
-
- }
可以看到事件只不過是一個對象DoorEvent event = new DoorEvent(this, "open"); ,只不過DoorEvent一定要繼承自EventObject
所謂的事件觸發 notifyListeners(event); ,也就是將所有的listerner對象 逐個激發一遍
Iterator iter = listeners.iterator();
- while (iter.hasNext()) {
- DoorListener listener = (DoorListener) iter.next();
- listener.doorEvent(event);
- }