1、事件角色
java中的事件机制的参与者有3种角色:
event object:事件状态对象,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中
event source:具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener。
event listener:事件监听者。对每个明确的事件的发生,都相应地定义一个明确的Java方法。
2、Java 实现
主要的API:
事件状态类:java.util.EventObject
事件监听接口:java.util.EventListener
我们需要定义的类/接口有:
类名
功能
父类/父接口
事件状态类
持有事件触发改变的“状态属性”
EventObject
事件监听接口
定义事件触发以后,根据不同状态属性的抽象操作方法
EventListener
具体的监听实现类(可以有多个)
提供具体的,根据不同状态属性的操作
事件监听接口
事件源类
1、持有监听类,并提供注册功能
2、提供触发事件的功能,触发事件的同时,通知监听器
无
示例如下:
事件状态类:
/**
* Created by 兴趣使然的程序员 on 2017/7/12.
* 事件状态类
* 持有事件触发改变的“状态属性”
*/
public class EventState extends EventObject {
private String state;
public void setDoorState(String state) {
this.state = state;
}
public String getDoorState() {
return this.state;
}
/**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @throws IllegalArgumentException if source is null.
*/
public EventState(Object source) {
super(source);
}
}
事件监听接口:
/**
* Created by 兴趣使然的程序员 on 2017/7/12.
* 事件监听接口
*/
public interface StateListener extends EventListener {
void doorEvent(EventState event);
}
事件源类:
/**
* Created by 兴趣使然的程序员 on 2017/7/12.
* 具体的事件源类
*
*/
public class EventSource {
private ConcurrentLinkedQueue listeners;
/**
* 添加监听
*/
public void addListener(StateListener stateListener) {
if (listeners == null) {
listeners = new ConcurrentLinkedQueue();
}
listeners.add(stateListener);
}
/**
* 移除监听
*/
public void removeListener(StateListener stateListener) {
if (listeners == null)
return;
listeners.remove(stateListener);
}
/**
* 触发事件,更改事件状态
*/
protected void fireStateChange(String doorState) {
if (listeners == null)
return;
EventState event = new EventState(this);
event.setDoorState(doorState);
notifyListeners(event);
}
/**
* 通知所有的DoorListener,让Listener对状态变化做出响应操作
*/
private void notifyListeners(EventState event) {
for(StateListener stateListener:listeners)
stateListener.doSomethingForEvent(event);
}
}
使用:
/**
* Created by 兴趣使然的程序员 on 2017/7/12.
*/
public class Test {
public static void main(String[] args) {
EventSource eventSource = new EventSource();
//添加一个监听,并同时定义根据事件状态变化做出的操作
eventSource.addListener(new ListenerA());
eventSource.fireStateChange("啦啦啦");
}
}
class ListenerA implements StateListener{
@Override
public void doSomethingForEvent(EventState event) {
String doorState = event.getDoorState();
System.out.println(doorState);
//触发事件以后,将自己移除
((EventSource)event.getSource()).removeListener(this);
}
}