一、 事件驱动机制基本原理
当一个事件源注册某个类型的监听器时,将添加此监听器对象到内部进行存储。并且,在监听器所关注的方法中,根据监听器关注的事件类型产生相应的事件,接着将事件传递给监听器对象和调用其约定的接口。
1、事件源的工作
(1 )定义存储监听器对象的变量。
(2 )定义增加或删除某种类型监听器的方法,并将监听器对象放进集合变量中。
(3 )在发生监听器所关注事件的方法中,生成事件并调用监听器的处理方法。
2、监听器的工作:提供处理某种事件的一致接口。
3、事件本身的定义:提供给事件源和监听器一致的对象序列。
二、组件如何对硬件事件进行捕捉
硬件事件的发生首先被操作系统捕捉,操作系统对其分析后分发到对应的应用程序窗口句柄,窗口句柄进一步将事件发送到子窗口或控件。这就是说组件对硬件事件的捕捉是依赖于操作系统和其父窗口的。如果一个组件本身不是窗口类型并且没有父窗口作为依托的话,那么它将无法获悉任何硬件事件。
1、注册事件
一个组件要收悉某类硬件事件,首先要向其父窗口表达它的需要,接着父窗口会将与其相关并且已经登记的事件发送给相应的组件。
注册收悉某种事件有两种方式:使能或者注册某类监听器。注意,这两种方式是等价的,它们都是向父窗口表达要接受哪类事件。如果你注册了某类事件的监听器,即便监听器内不做任何事,父窗口也会将相应的事件发送给组件。
它们的区别是,使能是受保护的面向类的方法,而注册监听器则是外部的面向对象的方法。这就是说,如果对某个组件类使能某一事件,那么此组件类产出的对象都将使能某一事件;与此不同的是,利用注册监听器方式可只让指定的对象使能某一或某几类事件。当然,注册监听器的方式也能完成使能的工作,只要在类的构造函数中注册相应监听器即能达到。
2、 处理事件
组件在收悉父窗口发来的事件后并不立即进入事件处理的过程,而是进入一个事件集中分配器:processEvent(AWTEvent e) 。它根据事件类型将事件分发到不同的事件处理进程。最后由各事件处理进程分发到已注册的对应的所有监听器。
那么,在组件内从收悉事件到最终响应一共经历了事件集中分配进程、事件分类处理进程、事件处理监听器三个步骤。这就提示我们,处理事件可能有三种不同的时机可供选择。
(1) 在事件集中分配器中,可对任何已登记的事件做处理。
(2) 在事件分类处理器中,可对已登记并且符合自己处理类型的事件做出处理。
(3) 在事件处理监听器中,可对已登记并且符合自己处理类型的事件做出处理。
如果不对组件方法重载的话,事实上第二步会调用第三步。我们通过注册监听器的方式处理事件一般都走完上述三个步骤才到达处理代码。
第一、 二步骤是类中受保护的方法,我们必须重载才能达到我们的目的,但任何重载都意味着面向类的所有对象。因此在处理单个对象的事件上,还是利用监听器的方式来得灵活。
三、事件的层次结构
在事件的层次结构中,尽管有继承的关系,但是各类事件在某种程度上是相互独立的。使能子类事件并不能使其父类事件也被使能,使能父类事件同样不会使其子类事件被使能。
下表列出组件事件类的描述和与其相应的处理器:
事件名称 |
使能组件 |
描述信息 |
AdjustmentEvent |
Component |
滚动条的调整方式 |
InputMethodEvent |
Component |
与输入法有关 |
HierarchyEvent |
Component |
组件层次结构修改 |
ComponentEvent |
Component |
组件状态信息 |
FocusEvent |
Component |
组件是否获得焦点 |
MouseEvent |
Component |
鼠标点击、移动等信息 |
KeyEvent |
Component |
按键信息 |
MouseWheelEvent |
Component |
块滚动常量 |
Mouse Motion Event |
Component |
鼠标移动 |
ActionEvent |
Button、 List |
按钮或列表选择语义 |
ItemEvent |
CheckBox、 Choice 、 List |
单选、下拉选择、列表选择 |
ContainerEvent |
Container |
容器添加移动信息 |
WindowEvent |
Window 、 JDialog |
窗口状态信息 |
TextEvent |
TextComponent |
文本改变信息 |
说明:
1、凡是 Component 可以使能的事件,都能由其子组件使能。
2、子类组件能够使能所有父类使能的事件。
例如:按钮能够使能并且接收鼠标事件,因为其继承了父类组件Component 的使能信息。
3、事件之间不存在包含与被包含的关系,使能某一事件不代表使能其子类或者父类事件。使能的事件应该与监听处理事件器所能处理的事件一一对应。