java 事件机制

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 }
View Code

事件监听器

 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 }
View Code
 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 }
View Code

事件源

 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 }
View Code

测试类

 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

原文地址:https://www.cnblogs.com/minisculestep/p/5059321.html