java中的事件监听是怎样实现随时监听的
标签(空格分隔): Java
参考文献
[1]. http://www.jcodecraeer.com/a/chengxusheji/java/2012/0822/371.html
事件监听机制
Java中的事件监听是整个Java消息传递的基础和关键。牵涉到三类对象:事件源(Event Source)、事件(Event)、事件监听器(Event Listener)。
● 事件源是事件发生的场所,通常就是各个组件,它可以是一个按钮,编辑框等。
● 事件监听者负责监听事件源所发生的事件,并对各种事件做出相应的响应。
● 事件是描述事件源状态改变的对象。
具体实现呢,可以看看Button的源码。可能不好看得懂。那好我们仿照侯捷先生的作法,来模拟一个这样的事件传递:
定义一个自己的事件
将事件源中value的最新值告知监听器
public class MyEvent {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
做一个监听器接口 Listener
当外部响应触发事件源上的事件时,产生一个事件对象,该事件对象会作为参数传递给监听器的事件处理方法
public interface Listener {
public void eventChanged(MyEvent e);
}
做一个事件发生者
● 当事件源中的value值发生改变时,会促发事件
● 监听器在事件源上注册,事件源会保存该监听器,在事件触发时调用监听器的事件处理方法
public class MySource {
private int value;
private Vector<Listener> listeners = new Vector<Listener>();
/**
* 添加监听器
* @param listener
*/
public void addListener(Listener listener){
listeners.add(listener);
}
public void setValue(int value){
this.value = value;
//发送消息
MyEvent e = new MyEvent();
e.setValue(value);
for(int i = 0; i < listeners.size(); i++){
listeners.get(i).eventChanged(e);
}
}
}
定义一个监听器
如果谁想监听MySource的value值改变了,就在MySource哪儿注册一下,然后写消息处理代码,就可以了,我们定义这样一个监听者:
public class MyListener implements Listener{
@Override
public void eventChanged(MyEvent e) {
// TODO Auto-generated method stub
System.out.println("value changed to:" + e.getValue());
}
}
这样,当MySource的value真的改变时,就会触发此方法。
注册监听器
在其他代码中把MyListener注册到MySource:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MySource s = new MySource();
MyListener l = new MyListener();
s.addListener(l);
s.setValue(10);
}
}
#结果
value changed to:10
Java中AWT/Swing的事件传递的实现,现在版本于上述有所不同,但应该都是这个原理。