§ 4.4 事件处理
本节的主要内容如下,
l Java事件处理机制
l Java事件监听器
l GUI组件事件处理
任务
通过前面几节的学习, 我们已经使用 Java中的组件完成了计算器的窗
体界面布局 。 但是目前还不能提供实际的功能, 这是因为还没有对
组件所产生的事件进行处理, 因此组件还不能提供其相应的功能 。为实现该计算器软件的功能, 请您使用 Java的事件处理技术来组件
中的事件 。 您的主要任务如下,
1,处理按钮事件以实现接收用户输入和计算的功能;
2,处理计算器中按钮事件以实现退格和清屏功能 。
4.4.1 事件处理
当用户按一下按钮或滚动文本, 移动鼠标或按下一个键等, 这个动
作就激发一个事件 。 事件是描述发生什么事件的一个对象 。 不同类型的用户交互在 Java中用不同类型的事件类 。 Java中将事件处理机制
分为三个部分:事件源 ( Event Source), 事件对象 (Event Object)和
事件监听器 (Event Listener)。 事件源是事件的产生者;事件对象是封
装了有关该事件的信息;事件监听器是一个对象, 在事件发生时由事件源将通知监听器 。 如下图所示 。
4.4.1 事件处理
事件模型
事件发生后, 系统把事件传递给事件处理程序的方
式称为事件模型 ( Event Model) 。 目前 Java中有两
种基本的事件模型:一种称为层次型事件模型;另
一种称为委托事件模型 。
4.4.2 事件类型
Java的事件类中常用的事件有:行为事件 ( ActionEvent), 焦点事件
(FocusEvent),项目事件 (ItemEvent),击键事件 (KeyEvent),鼠标事件
(MouseEvent),文本事件 (TextEvent)和窗口事件 (WindowEvent)。
4.4.2 事件类型
1,行为事件 ( ActionEvent)
当 GUI组件指定行为发生时, 组件就会产生行为事件 。 例如, 当用户按下
一个按钮或选中菜单项时, 产生一个行为事件 。
2,焦点事件 ( FocusEvent)
当一个组件得到或失去焦点时, 发生焦点事件 。 例如, 当用户在对话框
中从一个组件移到另一个组件进行制表时产生 。 界面上的组件只能有一个组件获得焦点, 其余的组件都将失去焦点 。
3,项目事件 ( ItemEvent)
当用户选择一个复选框, 复选框菜单项, 选择列表或列表项时, 就会
发生项目事件 。 当选定或撤消选定时, 会激发项目事件 。 这两种状态分别由 ItemEvent类中的 SELECTED和 DESELECTED常量代表 。 如果要当
前项目的状态, 可以能过调用 ItemEvent中的 getStateChange方法 。 还可
以用事件对象中的 getSelectedItems方法获取所选择的项目项 。
4.4.2 事件类型
4,击键事件 ( KeyEvent)
当用户按下或释放一个键时, 发生击键事件, 它分为三类:键按下, 键释放和键
输入 。 当用户按下键时发生键按下事件, 而释放键则发生键释放事件 。 键按下 /
释放由一个 key code( 键码, 通常是一个 32位整数 ) 来表示 。 当按下键就会产
生一个 Unicode字符 ( 一种字符编码用 16位表示 ), 同时会产生一个键输入事件 。
击键事件发生是有先后顺序的, 通常是先是键按下事件, 然后是键输入事件,
最后才是键释放事件 。 在 KeyEvent类中提供了许多常量 ( 例如 VK_A和
VK_ENTER) 来标识键码 。 要从事件对象中获取键码, 可以通过调用 KeyEvent
中的 getKeyCode方法实现 。 而要获取所输入的字符可以使用事件对象中的
getKeyChar方法 。
5,鼠标事件 ( MouseEvent)
当用户按下鼠标, 释放鼠标或移动鼠标指针时, 发生鼠标事件 。 从 MouseEvent类
中创建的对象代表鼠标事件 。
MouseEvent中的 getX和 getY方法可以返回鼠标指针的坐标 。 这些坐标是相对于事
件源对象的坐标而言的如鼠标在窗口中单击, 则返回的坐标是鼠标在窗体中的坐标值 。 还可以调用 getPoint方法, 把它们作为一个点对象来获取 。 当操作弹出
式菜单时, 需要调用 MouseEvent的 isPopupTrigger方法, 这个方法获取弹出式触
发器的设置 ( 当用户激发弹出菜单, 将返回一个逻辑真 ) 。
4.4.2 事件类型
6,文本事件 ( TextEvent)
当文本框或单行文本框的内容发生改变时, 发生文本事件 。
也就是说当按下键 ( 这个组件焦点 ) 或调用组件的 setText
方法时, 组件的内容发生了改变, 就会激发文本事件 。
7,窗口事件 ( WindowEvent)
当窗口执行激活, 撤销, 打开, 关闭等动作时, 就会激发窗
口事件 。 这种事件是从 WindowEvent类中创建的对象表示窗
口事件 。 要标识激发事件的容器窗口, 如对话框, 文件框
或框架, 需要调用 WindowEvent中的 getWindow方法 。
4.4.3 事件监听器
必须创建并注册监听器才能实现对事件的激活 。 监听器对象先使用事件
源注册自己, 当事件发生时, 这个事件源就会调用该监听器 。 如下图所
示 。 图中所示的是从组件对等实体发送一个事件到组件对象的过程, 最
后事件对象再从组件对象传递给一个注册的监听器 。 要成为源事件的注
册监听器, 对象必须从一个实现监听器界面的类中创建, 并且需要调用
一个源事件注册方法 。
组 件 对 等 实 体
A W T
组 件 对
象
监 听 对
象
宿 主 操 作 系 统 事 件 信 息
A W T 事 件 信 息
A W T 事 件 对 象
4.4.3 事件监听器
在 Java语言中, 一个事件类对应一个事件监听器接口, 事件
监听器接口的命名方法是:去掉事件类后边的, Event”,
换成, Listener”。 例如, 行为事件类取名为 ActionEvent,
则相应的动作事件监听器接口名字为 ActionListener。 常
用的监听器有:行为监听器, 焦点监听器, 项目监听器,
击键监听器, 鼠标监听器, 文本监听器和窗口监听器 。 这
些常用的事件类, 事件监听器接口和接口中包括的处理方
法请参考书中的表 4.4.1。
4.4.4 Java事件处理程序设计
示例 4.4.1 设计一个系统登录窗口, 要求具
有口令校验的功能 。
4.4.4 Java事件处理程序设计
练习 4.4.1 设计一个简单的聊天窗口, 要求
聊天窗口中能响应用户输入的字符串, 并能
响应关闭窗口操作 。 聊天窗口如下图所示 。
聊 天 窗 口
聊 天 窗 口
您 好 ! !
您 好 ! ! 发 送
任务解决
通过对各种布局管理器的学习, 使我们学会
了使用 Java的事件处理方法来响应用户的操
作从而实现了与系统的交互操作 。 也初步具
备了解决任务 1的能力 。
精练
请您根据本节所学的 Java事件处理的知识解
决项目中的任务 2。
分析:对任务解决中的计算器程序进行完善,
使计算器具有退格和清除显示功能 。
小结
事件处理机制用来实现 GUI系统与用户的交互 。 目前 Java中有两种事件模型,
(1) 层次型事件模型
(2) 委托事件模型
事件处理机制分为三个部分:事件源, 事件对象和事件监听器 。
(1) 事件源
事件源是就是事件的产生者 。
(2) 事件对象
事件对象是封装了有关该事件的信息 。 目前 Java中常用的有七种事件:行为事件,
焦点事件, 项目事件, 击键事件, 鼠标事件, 文本事件和窗口事件 。
(3) 事件监听器
事件监听器则是一个对象, 在事件发生时由事件源将通知监听器, 实际上, 监听
器, 监听, 事件, 并且在运行时响应事件 。 事件监听器在接到事件通知时将收
到该事件对象 。 然后它使用该对象对事件做出响应 。 事件源需要提供用于注册
监听器或取消监听器注册的方法 。 事件源维护一个已注册的监听器列表, 并在
事件发生时, 通知每个注册的事件处理器 。