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变量,适当类上的公共访问方法提供

事件监听者结构:

java 委托事件默认为空 简述java的委托事件模型_事件监听

AWT事件类的层次结构:

java 委托事件默认为空 简述java的委托事件模型_事件监听_02

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 软件包包含两个事件源接口:AdjustableItemSelectable。Adjustable的作用是设置一个值,这个值在规定的最小值与最大值之间,只要这个值改变,就会激发AdjustmentEvents事件。一个ItemSelectable具有零个或多个可供选择的项目。

2.6 监听者

就是xxxListener类

3、AWT适配器

为了不用实现在接口中定义的所有方法,AWT提供了许多适配器类,这些适配器类提供了一些在适当接口中定义的方法的空操作实现。

XXXAdapter类