自定义Java的事件监听器
自定义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 |
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 |
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,其实可以建立很多,就像我前面说的,可以监听一个实体属性的改变,监听方法的改变等等监听事件
评论暂时关闭