java的事件机制一般包括三个部分:EventObject,EventListener和Source。
EventObject
java.util.EventObject是事件状态对象的基类,它封装了事件源对象以及和事件相关的信息。所有java的事件类都需要继承该类。
EventListener
java.util.EventListener是一个标记接口,就是说该接口内是没有任何方法的。所有事件监听器都需要实现该接口。事件监听器注册在事件源上,当事件源的属性或状态改变的时候,调用相应监听器内的回调方法。
Source
事件源不需要实现或继承任何接口或类,它是事件最初发生的地方。因为事件源需要注册事件监听器,所以事件源内需要有相应的盛放事件监听器的容器。
以下是事件机制的一个简单实现,当事件源的状态改变的时候,调用相应的监听器的回调方法:
事件对象
1 importjava.util.EventObject;2
3 /**
4 *5 *@authorThief6 *7 */
8 public class MyEvent extendsEventObject {9
10 private static final long serialVersionUID = 1L;11 private intsourceState;12
13 publicMyEvent(Object source) {14 super(source);15 sourceState =((Source)source).getFlag();16 }17
18 public intgetSourceState() {19 returnsourceState;20 }21
22 }
View Code
事件监听器
1 importjava.util.EventListener;2
3 /**
4 *5 *@authorThief6 *7 */
8 public class StateChangeListener implementsEventListener {9
10 public voidhandleEvent(MyEvent event) {11 System.out.println("触发状态改变事件。。。");12 System.out.println("当前事件源状态为:" +event.getSourceState());13 System.out.println("。。。。。。。。。。。。。。。。。。。。。。。");14 }15 }
View Code
1 importjava.util.EventListener;2
3 /**
4 *5 *@authorThief6 *7 */
8 public class StateChangeToOneListener implementsEventListener {9
10 public voidhandleEvent(MyEvent event) {11 System.out.println("触发状态变为1的事件。。。");12 System.out.println("当前事件源状态为:" +event.getSourceState());13 System.out.println("。。。。。。。。。。。。。。。。。。。。。。。");14 }15
16 }
View Code
事件源
1 importjava.util.EventListener;2 importjava.util.HashSet;3 importjava.util.Set;4
5 /**
6 *7 *@authorThief8 *9 */
10 public classSource {11
12 private int flag = 0;13 Set listeners = new HashSet();14
15 /**
16 * 注册事件监听器17 *18 *@paramlistener19 */
20 public voidaddStateChangeListener(StateChangeListener listener) {21 listeners.add(listener);22 }23
24 /**
25 * 注册事件监听器26 *27 *@paramlistener28 */
29 public voidaddStateChangeToOneListener(StateChangeToOneListener listener) {30 listeners.add(listener);31 }32
33 /**
34 * 当事件发生时,通知注册在事件源上的所有事件做出相应的反映35 */
36 public voidnotifyListener() {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 voidchangeFlag() {52 flag = (flag == 0 ? 1 : 0);53 notifyListener();54 }55
56 public intgetFlag() {57 returnflag;58 }59 }
View Code
测试类
1 public classTest {2
3 public static voidmain(String[] args) {4
5 Source source = newSource();6 source.addStateChangeListener(newStateChangeListener());7 source.addStateChangeToOneListener(newStateChangeToOneListener());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