java中的事件监听是怎样实现随时监听的

java中的事件监听是怎样实现随时监听的

标签(空格分隔): Java


参考文献
[1]. http://www.jcodecraeer.com/a/chengxusheji/java/2012/0822/371.html

事件监听机制

java中的事件监听是怎样实现随时监听的_第1张图片
  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 listeners = new Vector();
    /**
     * 添加监听器
     * @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的事件传递的实现,现在版本于上述有所不同,但应该都是这个原理。

你可能感兴趣的:(Java)