java的事件機制通常包括三個部分:EventObject,EventListener和Source。java
EventObjectide
java.util.EventObject是事件狀態對象的基類,它封裝了事件源對象以及和事件相關的信息。全部java的事件類都須要繼承該類。測試
EventListenerthis
java.util.EventListener是一個標記接口,就是說該接口內是沒有任何方法的。全部事件監聽器都須要實現該接口。事件監聽器註冊在事件源上,當事件源的屬性或狀態改變的時候,調用相應監聽器內的回調方法。spa
Sourcecode
事件源不須要實現或繼承任何接口或類,它是事件最初發生的地方。由於事件源須要註冊事件監聽器,因此事件源內須要有相應的盛放事件監聽器的容器。對象
如下是事件機制的一個簡單實現,當事件源的狀態改變的時候,調用相應的監聽器的回調方法:blog
事件對象繼承
1 import java.util.EventObject; 2 3 /** 4 * 5 * @author Thief 6 * 7 */ 8 public class MyEvent extends EventObject { 9 10 private static final long serialVersionUID = 1L; 11 private int sourceState; 12 13 public MyEvent(Object source) { 14 super(source); 15 sourceState = ((Source)source).getFlag(); 16 } 17 18 public int getSourceState() { 19 return sourceState; 20 } 21 22 }
事件監聽器接口
1 import java.util.EventListener; 2 3 /** 4 * 5 * @author Thief 6 * 7 */ 8 public class StateChangeListener implements EventListener { 9 10 public void handleEvent(MyEvent event) { 11 System.out.println("觸發狀態改變事件。。。"); 12 System.out.println("當前事件源狀態爲:" + event.getSourceState()); 13 System.out.println("。。。。。。。。。。。。。。。。。。。。。。。"); 14 } 15 }
1 import java.util.EventListener; 2 3 /** 4 * 5 * @author Thief 6 * 7 */ 8 public class StateChangeToOneListener implements EventListener { 9 10 public void handleEvent(MyEvent event) { 11 System.out.println("觸發狀態變爲1的事件。。。"); 12 System.out.println("當前事件源狀態爲:" + event.getSourceState()); 13 System.out.println("。。。。。。。。。。。。。。。。。。。。。。。"); 14 } 15 16 }
事件源
1 import java.util.EventListener; 2 import java.util.HashSet; 3 import java.util.Set; 4 5 /** 6 * 7 * @author Thief 8 * 9 */ 10 public class Source { 11 12 private int flag = 0; 13 Set<EventListener> listeners = new HashSet<EventListener>(); 14 15 /** 16 * 註冊事件監聽器 17 * 18 * @param listener 19 */ 20 public void addStateChangeListener(StateChangeListener listener) { 21 listeners.add(listener); 22 } 23 24 /** 25 * 註冊事件監聽器 26 * 27 * @param listener 28 */ 29 public void addStateChangeToOneListener(StateChangeToOneListener listener) { 30 listeners.add(listener); 31 } 32 33 /** 34 * 當事件發生時,通知註冊在事件源上的全部事件作出相應的反映 35 */ 36 public void notifyListener() { 37 for (EventListener listener : listeners) { 38 try { 39 ((StateChangeListener)listener).handleEvent(new MyEvent(this)); 40 } catch (Exception e) { 41 if (flag == 1) { 42 ((StateChangeToOneListener)listener).handleEvent(new MyEvent(this)); 43 } 44 } 45 } 46 } 47 48 /** 49 * 改變狀態 50 */ 51 public void changeFlag() { 52 flag = (flag == 0 ? 1 : 0); 53 notifyListener(); 54 } 55 56 public int getFlag() { 57 return flag; 58 } 59 }
測試類
1 public class Test { 2 3 public static void main(String[] args) { 4 5 Source source = new Source(); 6 source.addStateChangeListener(new StateChangeListener()); 7 source.addStateChangeToOneListener(new StateChangeToOneListener()); 8 9 source.changeFlag(); 10 System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 11 source.changeFlag(); 12 System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 13 source.changeFlag(); 14 } 15 16 }
參考:
http://ericliu1986.iteye.com/blog/629562