java的事件机制一般包括三个部分:EventObject,EventListener和Source。
EventObject
java.util.EventObject是事件状态对象的基类,它封装了事件源对象以及和事件相关的信息。所有java的事件类都需要继承该类。
EventListener
java.util.EventListener是一个标记接口,就是说该接口内是没有任何方法的。所有事件监听器都需要实现该接口。事件监听器注册在事件源上,当事件源的属性或状态改变的时候,调用相应监听器内的回调方法。
Source
事件源不需要实现或继承任何接口或类,它是事件最初发生的地方。因为事件源需要注册事件监听器,所以事件源内需要有相应的盛放事件监听器的容器。
以下是事件机制的一个简单实现,当事件源的状态改变的时候,调用相应的监听器的回调方法:
事件对象
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 Setlisteners = new HashSet ();14 15 /**16 * 注册事件监听器17 * 18 * @param listener19 */20 public void addStateChangeListener(StateChangeListener listener) {21 listeners.add(listener);22 }23 24 /**25 * 注册事件监听器26 * 27 * @param listener28 */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