看了一些网上网友的文章,按照文章内容,写了一个实际的例子,对自定义java事件监听有了一些了解。通过例子的运行,觉得这个事件监听器非常像设计模式中的“观察者模式” Java中事件机制参与者的3钟角色(来自网友文章)
1、event object:事件产生时的“具体事件”,一般以参数形式存在与listerner的方法中。怎么理解这句话呢?触发某一事件的目的是让另外一个对象干活,event object就是干具体活的人,呵呵。通过下面例子更容易理解。
2、event source:具体的接受事件实体。实体属性改变是要做什么事,实体方法读取时要做什么事,这些要做的什么事就是监听器。而这些事情的载体就是event source
3、event listener:具体的要监听的事件类,就是event source改变时,要做到事情。
例子:
先看一下系统工程截图
通过DemoEvent.java文件创建DemoEvent类,这个类继承EventObject。这个类的构造函数的参数传递了产生这个事件的事件源(比如各种控件),方法getSource用来获得这个事件源的引用。
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对象做什么事情。
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
通过上面的接口我们再定义事件监听类,这些类具体实现了监听功能和事件处理功能。
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(..)是触发事件的方法,用来通知系统:事件发生了,你调用相应的处理函数(回调函数)吧。
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
最后写一个测试程序测试一下
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,其实可以建立很多,就像我前面说的,可以监听一个实体属性的改变,监听方法的改变等等监听事件执行结果: