1. 从JDK1.1开始,Java采用了一种名为“委托事件模型”的事件处理机制,以支持Java GUI程序与用户的实时交互。
¯ 委托事件模型
约定:组件在与用户交互时,遇到特定操作则会触发相应的事件,即自动创建事件类对象并提交给Java运行时系统
建立监听和被监听的关系,这一过程称为:注册监听器。
2.事件、事件源、事件处理方法、事件监听器、
µ 事件(Event):用户在GUI组件上进行的操作,如鼠标单击、输入文字、关闭窗口等。
µ 事件源(Event Source):能够产生事件的GUI组件对象,如按钮、文本框等。
µ 事件处理方法(Event Handler):能够接收、解析和处理事件类对象,实现与用户交互功能的方法。
µ 事件监听器(Event Listener):调用事件处理方法的对象。
3. 4. 事件类
Java GUI主要事件类的层次结构
注释:ComponentEvent事件类包括他的子事件类都是低级事件;剩下的是高级事件。
低级事件:
ComponentEvent(组件事件):组件尺寸的变化和移动。
ContainerEvent(容器事件):组件增加、移动。
WindowEvent(窗口事件):窗口闭合、图标化。
KeyEvent(键盘事件):按钮被按下或释放。
高级事件:
ActionEvent(动作事件):按钮被按下,在文本框中按Enter键
AdjustmentEvent(调整事件):在滚动条上移动滑块
ItemEvent(项目事件):选择项目
5. 并不是任何类型的对象都能做事件监听器
(1)JDK的java.awt.event包中定义了一系列的事件监听器接口,在这些接口中分别定义了各种类型的Java GUI 事件的处理方法,只有实现了这些接口的类对象才有资格作监听器,去处理相应类型的事件。 如:String类对象肯定不能作为监听器来处理ActionEvent事件,因为它们根本没有封装处理事件所需的功能方法。
(2)事件监听器类型和对应的事件处理方法都是事先约定好的.
6. 事件监听器类型和对应的事件处理方法都是事先约定好的;所有事件处理方法的返回值类型均为void。(详见书上P221)
Released:释放; Dragged:拖拉; KeyTyped:打字;
typed:类型; Iconified:缩放; deactivated:是无效、不活动
7.
8.. 事件适配器
存在的问题:WindowHandler作为监听器类要处理“关闭”窗口动作,需要实现WindowListener接口,虽然只是用到一个相应的事件处理方法,但却不得不重写该接口中所有的7个抽象方法。
太麻烦了,so:
为简化程序员的编程负担,JDK中针对大多数事件监听器接口提供了相应的实现类(事件适配器Adapter),在适配器中,实现了相应监听器接口的所有方法,但不做任何处理,即只是添加了一个空的方法体。
程序员在定义监听器类时就可以不再直接实现监听接口,而是继承事件适配器类,并只重写所需要的方法即可。
监听器接口 对应适配器 说明
MouseListener MouseAdapter 鼠标事件适配器
MouseLotionListener MouseMotionAdapter 鼠标运动事件适配器
WindowListener WindowAdapter 窗口事件适配器
FocusListener FocusAdapter 焦点事件适配器
KeyListener KeyAdapter 键盘事件适配器
ComponentListener ComponentAdapter 组件事件适配器
ContainerListener ContainerAdapter 容器事件适配器
使用适配器类的优点:不用实现WindowListener接口中所有的抽象方法,需要哪个方法,重写哪个方法即可,使开发者得以解脱。
但需注意:适配器类并不能完全取代相应的监听器接口,由于Java 单继承机制的限制,如果要定义的监听器类需要同时处理两种以上的GUI事件,则只能直接实现有关的监听器接口,而无法只通过继承适配器实现。
9. 内部类和匿名类在GUI 事件处理中的作用
µ 内部类
在Java GUI 事件处理中,经常采用内部类来定义监听器类,这是因为监听器类中封装的业务逻辑具有非常强的针对性,通常没有重用价值。而且作为内部类的监听器对象可以直接访问外部类中的成员,这可以提供很大的便利。
µ 匿名类
例子:
addMouseMotionListener(newMouseMotionAdapter //new一个父类对象 (){
public void mouseDragged(MouseEvente){
txtDisplay.setText("鼠标位置"+e.getPoint());
}
}); //分号不能省
10. 多重监听
由于事件源可以产生多种不同类型的事件,因而可以注册多种不同类型的监听器,但是当事件源发生了某种类型的事件时,只触发事先已就该种事件类型注册过的监听器。
事件源组件和监听器对象的对应关系:
ü 针对同一个事件源组件的同一种事件也可以注册多个监听器。(如:一架总统专机配置多架护航战斗机)
ü 针对同一个事件源组件的多种事件也可以注册同一个监听器对象进行处置。只是这要求监听器对象是一个“多面手”,即有能力处理各种不同类型的事件
ü 同一个监听器对象可以被同时注册到多个不同的事件源上。(如:一支消防队负责多家工厂安全)