自定义Java的事件监听器


看了一些网上网友的文章,按照文章内容,写了一个实际的例子,对自定义java事件监听有了一些了解。通过例子的运行,觉得这个事件监听器非常像设计模式中的观察者模式” Java中事件机制参与者的3钟角色(来自网友文章)

1
event object:事件产生时的具体事件,一般以参数形式存在与listerner的方法中。怎么理解这句话呢?触发某一事件的目的是让另外一个对象干活,event object就是干具体活的人,呵呵。通过下面例子更容易理解。
2
event source:具体的接受事件实体。实体属性改变是要做什么事,实体方法读取时要做什么事,这些要做的什么事就是监听器。而这些事情的载体就是event source
3
event listener:具体的要监听的事件类,就是event source改变时,要做到事情。

例子:
先看一下系统工程截图

通过DemoEvent.java文件创建DemoEvent类,这个类继承EventObject。这个类的构造函数的参数传递了产生这个事件的事件源(比如各种控件),方法getSource用来获得这个事件源的引用。

DemoEvent.java

1    package com.css.event;
2     
3    import java.util.EventObject;
4     
5    /**
6     * Created by IntelliJ IDEA.
7     * User: liuzhy
8     * Date: 2010-11-2
9     * Time: 15:23:45
10    */
11   public class DemoEvent extends EventObject {
12       Object obj;
13    
14       /**
15        * Constructs a prototypical Event.
16        *
17        * @param source The object on which the Event initially occurred.
18        * @throws IllegalArgumentException if source is null.
19        */
20       public DemoEvent(Object source) {
21           super(source);
22           obj = source;
23       }
24    
25   //    @Override
26   //    public Object getSource() {
27   //        return obj;
28   //    }
29    
30       public void say() {
31           System.out.println("This is say method ...");
32       }
33   }
34  

定义新的事件监听接口,该接口继承自EventListener;该接口包含对DemeEvent事件的处理程序。事件触发了,让DemeEvent对象做什么事情。

 

DemoListener.java

1    package com.css.event; 
2      
3    import java.util.EventListener; 
4      
5    /** 
6     * Created by IntelliJ IDEA. 
7     * User: liuzhy 
8     * Date: 2010-11-2 
9     * Time: 15:25:58 
10    */ 
11   public interface DemoListener extends EventListener { 
12       public void demoEvent(DemoEvent dm); 
13   } 
14  




通过上面的接口我们再定义事件监听类,这些类具体实现了监听功能和事件处理功能。

Listener1.java

 

1    package com.css.event; 
2      
3    /** 
4     * Created by IntelliJ IDEA. 
5     * User: liuzhy 
6     * Date: 2010-11-2 
7     * Time: 15:27:50 
8     */ 
9    public class Listener1 implements DemoListener { 
10       public void demoEvent(DemoEvent dm) {
11           System.out.println("Inside listener1 ..."); 
12           dm.say();
13       } 
14   }
15  

通过DemeSource.ava文件创造一个事件源类,它用一个java.utile.Vector对象来存储所有的事件监听器对象,存储方式是通过 addListener(..)这样的方法。notifyDemeEvent(..)是触发事件的方法,用来通知系统:事件发生了,你调用相应的处理函数(回调函数)吧。

 

DemoSource.java

1    package com.css.event; 
2      
3    import java.util.Enumeration;
4    import java.util.Vector; 
5      
6    /** 
7     * Created by IntelliJ IDEA. 
8     * User: liuzhy 
9     * Date: 2010-11-2 
10    * Time: 15:29:01 
11    */ 
12   public class DemoSource { 
13       private Vector repository = new Vector(); 
14       DemoListener dl; 
15     
16       public DemoSource() { 
17       } 
18     
19       public void addDemoListener(DemoListener dl){ 
20           repository.addElement(dl); 
21       } 
22     
23       public void romoveListener(DemoListener dl){ 
24           repository.remove(dl); 
25       } 
26     
27       public void notifyDemoEvent(){ 
28           Enumeration enum2 = repository.elements(); 
29           while(enum2.hasMoreElements()){ 
30               dl = (DemoListener) enum2.nextElement(); 
31               dl.demoEvent(new DemoEvent(this)); 
32           } 
33       } 
34   } 
35  

最后写一个测试程序测试一下

TestDemo.java

1    package com.css.event; 
2      
3    /** 
4     * Created by IntelliJ IDEA.
5     * User: liuzhy 
6     * Date: 2010-11-2 
7     * Time: 15:34:14 
8     */ 
9    public class TestDemo { 
10       DemoSource ds; 
11     
12       public TestDemo() { 
13           ds = new DemoSource(); 
14           Listener1 l1 = new Listener1(); 
15     
16           ds.addDemoListener(l1); 
17           ds.notifyDemoEvent(); 
18       } 
19     
20       public static void main(String[] args) { 
21           new TestDemo(); 
22       } 
23   } 
24  


注:我们可以建立很多Listener,我这里因为懒省事,就建立了一个Listener1,其实可以建立很多,就像我前面说的,可以监听一个实体属性的改变,监听方法的改变等等监听事件

执行结果:

相关内容