Java事件机制浅析

Java事件机制浅析

Java的事件机制最初是用在Swing组件上的,用来处理诸如按钮按下之类的动作事件,但如果理解了事件机制的基本概念,我们可以轻易的将其用到任何Java对象上。

基本概念

  • 事件

  事件可以是系统中发生的任何动作。   当一个事件发生时,该事件用一个事件对象来表示。事件对象有对应的事件类。

  • 事件源

  事件最初发生的地方。

  • 事件处理器(事件处理方法)

  事件处理器是一个接收事件对象并进行相应处理的方法。事件处理器包含在一个类中,这个类的对象负责检查事件是否发生,若发生就激活事件处理器进行处理。

  • 注册事件监听器

  为了能够让事件监听器检查事件源是否发生了某些事件,并且在发生时激活事件处理器进行相应的处理,必须在事件源上注册事件监听器。

实现Java事件机制

先介绍下Java中和事件处理相关的几个类,然后我们通过一个简单的实例来详细了解。

涉及到的Java类

Java的事件机制一般包括三个部分:EventObjectEventListenerSource

  • EventObject

java.util.EventObject是事件状态对象的基类,它封装了事件源对象以及和事件相关的信息。所有java的事件类都需要继承该类。

  • EventListener

java.util.EventListener是一个标记接口,就是说该接口内是没有任何方法的。所有事件监听器都需要实现该接口。事件监听器注册在事件源上,当事件源的属性或状态改变的时候,调用相应监听器内的回调方法。

  • Source

事件源不需要实现或继承任何接口或类,它是事件最初发生的地方。因为事件源需要注册事件监听器,所以事件源内需要有相应的盛放事件监听器的容器。

实例

事件对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.EventObject;
public class MyEvent extends EventObject {
private static final long serialVersionUID = 1L;
private int sourceState;
public MyEvent(Object source) {
super(source);//source为实际的事件对象(数据)
sourceState = ((Source)source).getFlag();
}
public int getSourceState() {
return sourceState;
}
}

事件监听器

1
2
3
4
5
6
7
8
9
10
import java.util.EventListener;
public class StateChangeListener implements EventListener {
public void handleEvent(MyEvent event) {
System.out.println("触发状态改变事件。。。");
System.out.println("当前事件源状态为:" + event.getSourceState());
System.out.println("。。。。。。。。。。。。。。。。。。。。。。。");
}
}
1
2
3
4
5
6
7
8
9
10
11
import java.util.EventListener;
public class StateChangeToOneListener implements EventListener {
public void handleEvent(MyEvent event) {
System.out.println("触发状态变为1的事件。。。");
System.out.println("当前事件源状态为:" + event.getSourceState());
System.out.println("。。。。。。。。。。。。。。。。。。。。。。。");
}
}

事件源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.util.EventListener;
import java.util.HashSet;
import java.util.Set;
public class Source {
private int flag = 0;
Set<EventListener> listeners = new HashSet<EventListener>();
/**
* 注册事件监听器
*
* @param listener
*/
public void addListener(EventListener listener) {
listeners.add(listener);
}
/**
* 当事件发生时,通知注册在事件源上的所有事件做出相应的反映
*/
public void notifyListener() {
for (EventListener listener : listeners) {
try {
((StateChangeListener)listener).handleEvent(new MyEvent(this));
} catch (Exception e) {
if (flag == 1) {
((StateChangeToOneListener)listener).handleEvent(new MyEvent(this));
}
}
}
}
/**
* 改变状态
*/
public void changeFlag() {
flag = (flag == 0 ? 1 : 0);
notifyListener();
}
public int getFlag() {
return flag;
}
}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test {
public static void main(String[] args) {
Source source = new Source();
source.addListener(new StateChangeListener());
source.addListener(new StateChangeToOneListener());
source.changeFlag();
System.out.println("————————————————————————");
source.changeFlag();
System.out.println("~~~~~~~~~~~~~");
source.changeFlag();
}
}
坚持原创技术分享,您的支持将鼓励我继续创作!