1、授权事件模型
- 在新模型中,事件处理是从一个事件源授权到一个或多个事件监听者,由此得到了授权事件模型这个名字。
- 授权事件模型的原理很简单:构件激发事件,事件监听者监听和执行事件。可以通过调用addXYZListener (XYZListener)方法向构件注册监听者。
- 把监听者加入到构件中以后,如果构件激发相应类型的事件,那么监听者接口中的适当方法将被调用。
1.1 构件、事件和监听者
import java.applet.Applet;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class demo08 extends Applet {
@Override
public void init() {
Button b = new Button("b");
b.addActionListener(new ButtonListener(this));
add(b);
}
class ButtonListener implements ActionListener {
private Applet applet;
public ButtonListener(Applet applet) {
this.applet = applet;
}
public void actionPerformed(ActionEvent e) {
Button source = (Button) e.getSource();
applet.showStatus(source.getLabel() + "activated");
}
}
}
这个applet程序实例化了·个ButtonListener,并把它加到按钮中。当按钮被激活时,ButtonListener实现ActionListener接口,并修改applet的状态栏。
- 通过调用
void EventSource . addListenertype (ListenerType listener)
方法 - 事件监听者向一个事件源注册。事件源通过实例化事件类型激发事件
- 同时把事件传送给
voidListenerType .eventHandler (EventType event)
。
1.2 过滤事件
在基于继承的事件模型中,不管构件是否对事件感兴趣,所有的事件都将被传送给每一个构件。授权事件模型可以过滤事件,只有下面的情况出现时,事件才会被传送给构件:
- 对事件类型有兴趣的监听者已被加入到构件中。
- 调用Component . enableEvents (long mask ),mask 代表即将被传送的事件。
无论采用哪种方法,和 mask 有关的或者和监听者类型有关的事件都将被构件激发,并且被传送给监听者或者对于覆盖的事件处理方法可用。
2、结构概述
在所涉及的事件和监听者范围中,所有的动作都开始于java.util软件包。java. util 有一个类和一个接口:EventObject和 EventListener,它们构成了授权事件模型的基础。
- EventObject是一个简单类,只是用来跟踪事件源。
- EventListener是一个带标志°的接口,所有的监听者都要扩展它。EventListener和EventObject 分别确定了监听者和事件的层次结构。
- java.util .EventObject 保留了对事件源的引用,AWTEvent类跟踪事件的ID 和事件是否被消耗掉学一般地,AWT的当前版本已经废除了public变量,适当类上的公共访问方法提供
事件监听者结构:
AWT事件类的层次结构:
2.1 事件
JDK事件类:
java.utl.Event
AWTEvent
ActionEvent
AdjustmentEvent
ComponentEvent
ContainerEvent
FocusEvent
InputEvent
ItemEvent
KeyEvent
MouseEvent
PaintEvent
TextEvent
WindowEvent
相关的方法常量查询api。
2.2 构件作为事件源
许多AWT构件带有addXYZ.L.istener (XYZIistener)方法,这种方法允许某种类型的监听者注册感兴趣的事件。
- 为了处理某个给定构件的某个事件,只产生一个监听者,并把监听者传递给构件的适当addX YZListener方法。这样要处理的事件会自动传递给监听者。
- **注意:**某个类型的多个监听者可以向同一个构件注册。通知的顺序是很重要的。你可能认为通知的顺序应该符合监听者被加人到构件中的顺序,但这并不是确定的。
2.3 多点传送事件源
一个多点传送事件源可以有给定类型的、多个已经注册的事件监听者。
2.4 单点传送事件源
- 事件源都应该是多点传送事件源,但也可以禁止一个给定的事件源注册多个监听者。例如,一个图像按钮可能就只有一个相应的监听者,控制按钮对鼠标事件的响应方式。
- 单点传送事件源为一个给定类型的事件保存唯一事件监听者。单点传送事件源的监听者注册方法由在下面的
void addListenerType ( Listener lype listener)throws java. util . ToomanyListenersException
void removeListenerType ( Listener'Type listener)
- 当一个单点传送事件源中已经有一个已注册的 ListenerType监听者时,如果仍然调用事件源中的 addListenerType方法的话,那么已注册的监听者应该保持不变,同时事件源会抛出TooManyListenerException 异常。如果要改变和单点传送事件源相关联的监听者,在调用addListenerType方法以前,必须调用removeListenerType 方法。
- 单点传送事件源也可以是多点传送事件源。例如,前面提到的图像按钮,可以仅有一个监听者响应鼠标事件,但同时也允许有多个监听者响应动作事件。
2.5 事件源接口
java.awt 软件包包含两个事件源接口:Adjustable
和ItemSelectabl
e。Adjustable的作用是设置一个值,这个值在规定的最小值与最大值之间,只要这个值改变,就会激发AdjustmentEvents事件。一个ItemSelectable具有零个或多个可供选择的项目。
2.6 监听者
就是xxxListener类
3、AWT适配器
为了不用实现在接口中定义的所有方法,AWT提供了许多适配器类,这些适配器类提供了一些在适当接口中定义的方法的空操作实现。
XXXAdapter类