java listener 实现机制_事件 监听 机制的自实现 (event listener)

www.java114.com))

Event/Listener模式在Java中很常见,并且很有用,但要自己来实现这个模式是一件很费时间并且单调乏味的工作。每次你都不得不和List或Vector打交道,每次你都不得不处理Add方法、Remove方法,然后你还得遍历整个列表来通知所有的监听者,这才算完。如果能象下面这样简单就好了:

Notifier notifier = new Notifier("actionPerformed");

...notifier.addListener( someObject );

...notifier.notify( new ActionEvent(this) );只要几行代码就能够完成一切。

下面的Notifier类就达到了这个目的:

package com.generationjava.lang;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.EventObject;

import java.util.Iterator;

public class Notifier {

private ArrayList listeners = new ArrayList();

private String listenerMethod;

public Notifier(String name) {

this.listenerMethod = name;

}

public void addListener(Object not) {

this.listeners.add(not);

}

public void removeListener(Object not) {

this.listeners.remove(not);

}

public void notify(EventObject event) {

Iterator itr = listeners.iterator();

while(itr.hasNext()) {

try {

Object listener = itr.next();

Class clss = listener.getClass();

Method method = clss.getMethod(this.listenerMethod,new Class[] { event.getClass() });

method.invoke( listener, new Object[] { event } );

} catch(Exception e) {

e.printStackTrace();

}

}

}

}

这个类并没有经过性能上的优化,而且它是不同步的,但在编写一组Event/Listener API的时候,可以很快掌握它并且节省时间。利用Notifier类,你就能执行这样一个常见的任务而不必每次都为之编写代码。

以下内容摘自CSDC社区: (http://topic.csdn.net/t/20020918/10/1032825.html)

其实java的事件机制十分简单,你完全可以实现自己的事件驱动;

主要涉及到如下几个类(可以参考键盘事件的有关类):

1.事件类XXXEvent,其中包含你所规定的事件的一些信息,如事件源,事件名称等等,如KeyEvent,中有eventSource,keyCode等等

2.事件监听接口,XXXEventListener,其中包含捕获到事件的类要作的事情,如KeyListener,其中包括:keyPress,keyReleased,等等

如:

public   interface   XXXListener{

public   void   doXXXEvent(xxxEvent   e);

}

3.发出事件的类:可以是任意的类,在这个类中,可以发出该事件XXXEvent,比如可以在这个类中添加一个fireXXXEvent方法,在这个方法中去手工发出事件,如:

public   void   fireXXXEvent(){

java.util.Vector   targets;

synchronized   (this)   {

targets   =   (java.util.Vector)   xxxListeners.clone();

}

XXXEvent   evt   =   new   XXXEvent(.....);

for   (int   i   =   0;   i   <   targets.size();   i++)   {

XXXListener   target   =   (XXXListener)   targets.elementAt(i);

target.doXXXEvent(evt);

}

}

此外在这个类里要有一个监听列表即上面的xxxlisteners,在这个类中还要实现一个addXXXListrener(XXXListener)方法,来把一个实现了XXXListenr的类作为监听者加到该类中。

posted on 2008-03-05 08:20 笨蛋 阅读(441) 评论(0)  编辑  收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值