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

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

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

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

 

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

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

 

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

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

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

 

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

/**

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

*/



java事件处理机制(自定义事件)_监听器

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;
}

}


java事件处理机制(自定义事件)_监听器


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

/**

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

*/



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


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

/**

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

*/



java事件处理机制(自定义事件)_监听器

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关闭");
}
}

}


java事件处理机制(自定义事件)_监听器


/**

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

*/



java事件处理机制(自定义事件)_监听器

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关闭,同时关闭走廊的灯");
}
}

}


java事件处理机制(自定义事件)_监听器


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

/**

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

* (如果是在swing中,就类似一个button)

*/



java事件处理机制(自定义事件)_监听器

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);
}
}
}


java事件处理机制(自定义事件)_监听器


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

/**

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

*/



java事件处理机制(自定义事件)_监听器

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();
}
}


java事件处理机制(自定义事件)_监听器


运行DoorMain

门1打开 

门2打开,同时打开走廊的灯

我已经进来了

门1关闭

门2关闭,同时关闭走廊的灯