java事件处理机制(自定义事件)

java事件处理机制(自定义事件)

java事件机制包括三个部分:事件、事件监听器、事件源。

1、事件。一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息。

也就是这个事件有哪些属性和行为,比如说门,有打开和关闭两种行为

 

2、事件监听器。实现java.util.EventListener接口,注册在事件源上。 当事件源的属性或状态改变时,取得相应的监听器调用其内部的回调方法。

比如是门的话,做具体的开门,关门,以及开灯,关灯动作

 

3、事件源。事件发生的地方,由于事件源的某项属性或状态发生了改变(比如BUTTON被单击、TEXTBOX的值发生改变等等)导致某项事件发生。换句话说就是生成了相应的事件对象。

因为事件监听器要注册在事件源上,所以事件源类中应该要有盛装监听器的容器(List,Set等等)。

事件源对象,在这里你可以把它想象成一个控制开门关门的遥控器

 

(1)通过DoorEvent.java文件创建DoorEvent类,这个类继承EventObject。

/**
* 定义事件对象,必须继承EventObject
*/

复制代码
public class DoorEvent extends EventObject {

    private static final long serialVersionUID = 6496098798146410884L;

    private String doorState = "";// 表示门的状态,有“开”和“关”两种

    public DoorEvent(Object source, String doorState) {
        super(source);
        this.doorState = doorState;
    }

    public void setDoorState(String doorState) {
        this.doorState = doorState;
    }

    public String getDoorState() {
        return this.doorState;
    }

}
复制代码

(2)定义新的事件监听接口,该接口继承自EventListener;该接口包含对doorEvent事件的处理程序:

/**
* 定义监听接口,负责监听DoorEvent事件
*/

public interface DoorListener extends EventListener {
     public void doorEvent(DoorEvent event);
}

通过上面的接口我们再定义事件监听类,这些类具体实现了监听功能和事件处理功能。

/**
* 该类为 门1监听接口的实现,做具体的开门,关门动作
*/

复制代码
public class DoorListener1 implements DoorListener {
    @Override
    public void doorEvent(DoorEvent event) {
        // TODO Auto-generated method stub
        if (event.getDoorState() != null && event.getDoorState().equals("open")) {
            System.out.println("门1打开");
        } else {
            System.out.println("门1关闭");
        }
    }

}
复制代码

/**

* 该类为 门2监听接口的实现,做具体的开门,关门,以及开灯,关灯动作
*/

复制代码
public class DoorListener2 implements DoorListener {

    @Override
    public void doorEvent(DoorEvent event) {
        // TODO Auto-generated method stub
        if (event.getDoorState() != null && event.getDoorState().equals("open")) {
            System.out.println("门2打开,同时打开走廊的灯");
        } else {
            System.out.println("门2关闭,同时关闭走廊的灯");
        }
    }

}
复制代码

(3)通过DoorManager.java创造一个事件源类,它用一个Collection listeners对象来存储所有的事件监听器对象,存储方式是通过addDoorListener(..)这样的方法。notifyListeners(..)是触发事件的方法,用来通知系统:事件发生了,你调用相应的处理函数吧。

/**
* 事件源对象,在这里你可以把它想象成一个控制开门关门的遥控器,
* (如果是在swing中,就类似一个button)
*/

复制代码
public class DoorManager {
    private Collection listeners;

    /**
     * 添加事件
     * 
     * @param listener
     *            DoorListener
     */
    public void addDoorListener(DoorListener listener) {
        if (listeners == null) {
            listeners = new HashSet();
        }
        listeners.add(listener);
    }

    /**
     * 移除事件
     * 
     * @param listener
     *            DoorListener
     */
    public void removeDoorListener(DoorListener listener) {
        if (listeners == null)
            return;
        listeners.remove(listener);
    }

    /**
     * 触发开门事件
     */
    protected void fireWorkspaceOpened() {
        if (listeners == null)
            return;
        DoorEvent event = new DoorEvent(this, "open");
        notifyListeners(event);
    }

    /**
     * 触发关门事件
     */
    protected void fireWorkspaceClosed() {
        if (listeners == null)
            return;
        DoorEvent event = new DoorEvent(this, "close");
        notifyListeners(event);
    }

    /**
     * 通知所有的DoorListener
     */
    private void notifyListeners(DoorEvent event) {
        Iterator iter = listeners.iterator();
        while (iter.hasNext()) {
            DoorListener listener = (DoorListener) iter.next();
            listener.doorEvent(event);
        }
    }
}
复制代码

(4)好了,最后写一个测试程序测试一下我们自定义的事件吧,这段程序应该不难理解吧:)

/**
* 主程序,就想象成要开门的哪个人
*/

复制代码
public class DoorMain {
    public static void main(String[] args) {
        DoorManager manager = new DoorManager();
        manager.addDoorListener(new DoorListener1());// 给门1增加监听器
        manager.addDoorListener(new DoorListener2());// 给门2增加监听器
        // 开门
        manager.fireWorkspaceOpened();
        System.out.println("我已经进来了");
        // 关门
        manager.fireWorkspaceClosed();
    }
}
复制代码

运行DoorMain

门1打开 
门2打开,同时打开走廊的灯
我已经进来了
门1关闭
门2关闭,同时关闭走廊的灯

 

posted @ 2017-06-29 15:52  wjj1013  阅读(788)  评论(0编辑  收藏  举报