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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM