java 事件机制
java的事件机制一般包括三个部分:EventObject,EventListener和Source。
EventObject
java.util.EventObject是事件状态对象的基类,它封装了事件源对象以及和事件相关的信息。所有java的事件类都需要继承该类。
EventListener
java.util.EventListener是一个标记接口,就是说该接口内是没有任何方法的。所有事件监听器都需要实现该接口。事件监听器注册在事件源上,当事件源的属性或状态改变的时候,调用相应监听器内的回调方法。
Source
举例
属性 name 和status 改变,被监管
public class Door1 {
private String state = "";
private String name = "";
private DoorStateListener stateListener;
private DoorNameListener nameListener;
public void setState(String newValue) {
if (state != newValue) {
state = newValue;
if (stateListener != null){
//注意参数传递
Door1Event event = new Door1Event(this, "state",newValue);
stateListener.doorEvent(event);
}
}
}
public void setName(String newValue) {
if (name != newValue) {
name = newValue;
if (nameListener != null){
Door1Event event = new Door1Event(this,"name", newValue);
nameListener.doorEvent(event);
}
}
}
public void setStateListener(DoorStateListener stateListener) {
this.stateListener = stateListener;
}
public void setNameListener(DoorNameListener nameListener) {
this.nameListener = nameListener;
}
public String getState() {
return state;
}
public String getName() {
return name;
}
}
2.数据传递对象 Door1Event
import java.util.EventObject;
public class Door1Event extends EventObject {
private static final long serialVersionUID = 6496098798146410884L;
private final String key ;
private final String value ;
public Door1Event(Object source,String key , String value) {
super(source);
this.key = key;
this.value = value;
}
public String getValue() {
return value;
}
public String getKey() {
return key;
}
}
3.被监管对象
Door1StateObserver
class DoorStateListener implements EventListener {
public void doorEvent(Door1Event event) {
if (event.getValue() != null && event.getValue().equals("open")) {
System.out.println("门1打开");
} else {
System.out.println("门1关闭");
}
}
}
Door1NameObserver
class DoorNameListener implements EventListener {
public void doorEvent(Door1Event event) {
Door1 door = (Door1) event.getSource();
System.out.println("I got a new name,named \"" + door.getName() + "\"");
}
}
4 .Door1Test
public class Door1Test {
public static void main(String[] args) {
Door1 door = new Door1();
door.setStateListener(new DoorStateListener());
door.setNameListener (new DoorNameListener());
// 开门
door.setState("open");
System.out.println("我已经进来了");
// 关门
door.setState("close");
// 改名
door.setName("dengzy"); } }