java的事件机制一般包括三个部分:EventObject,EventListener和Source。
EventObject
java.util.EventObject是事件状态对象的基类,它封装了事件源对象以及和事件相关的信息。所有java的事件类都需要继承该类。
EventListener
java.util.EventListener是一个标记接口,就是说该接口内是没有任何方法的。所有事件监听器都需要实现该接口。事件监听器注册在事件源上,当事件源的属性或状态改变的时候,调用相应监听器内的回调方法。
Source
事件源不需要实现或继承任何接口或类,它是事件最初发生的地方。因为事件源需要注册事件监听器,所以事件源内需要有相应的盛放事件监听器的容器。
以下是事件机制的一个简单实现,当事件源的状态改变的时候,调用相应的监听器的回调方法:
事件对象
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
事件监听器
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
事件源
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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