您的位置:首页 > 编程语言 > Java开发

Java事件处理机制

2017-07-12 00:00 417 查看

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<StateListener> 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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 事件监听