java 事件機制

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

相關文章
相關標籤/搜索