该【(精品)第12章 】是由【286919636】上传分享,文档一共【31】页,该文档可以免费在线阅读,需要了解更多关于【(精品)第12章 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。• 212 •
• 241 •
第 12 章 事件处理
Java 从入门到精通
第 12 章
事 件 处 理
上一章主要讨论了组件的使用以及容器的布局,这些使 Java 图形用户界面的程序设计变
得灵活方便,但是与图形界面程序密切相关的还有一个比较重要的内容——事件处理机制。本章主要讲述事件处理模型的概念,介绍事件处理类、事件监听器、时间适配器等内容。
事件处理模型
以下 3 类与事件处理机制相关。
Event(事件对象):用户界面操作以类的形式描述,例如鼠标操作对应的事件类
MouseEvent,界面动作对应的事件类 ActionEvent。
Event Source(事件源):产生事件的场所,通常指组件,例如按钮 Checkbox。
Event handler(事件处理器):接收事件类并进行相应的处理对象。
例如,在窗口中有一个按钮,当用户用鼠标单击这个按钮时,会产生 ActionEvent 类的
一个对象。该按钮就是所谓的事件源,该对象就是鼠标操作所对应的事件,然后事件监听器接受触发的事件,并进行相应处理。
图 12-1 事件处理机制
同一个事件源可能会产生一个或者多个事件,Java 语言采用授权处理机制(Delegation
Model)将事件源可能产生的事件分发给不同的事件处理器。例如 Panel 对象可能发生鼠标事件和键盘事件,它可以授权处理鼠标事件的事件处理器来处理鼠标事件,同时也可以授权处理键盘事件的事件处理器处理键盘事件。事件处理器会一直监听所有的事件,直到有与之相匹配的事件,就马上进行相应的处理,因此事件处理器也称为事件监听器。
授权处理机制可以将事件委托给外部的处理对象进行处理,这就实现了事件源与事件处理器(监听器)的分离。通常事件处理者是一个事件类,该类必须实现处理该类型事件的接
• 242 •
• 213 •
口,并实现某些接口方法。例如程序 是一个演示事件处理模型的例子,类 ButtonHandler
实现了 ActionListener 接口,该接口可以处理的事件是 ActionEvent。
//导入需要使用的包和类
import .*; import .*;
public class EventManagerDemon {
public static void main(String[ ] args) {
final Frame f = new Frame("Test"); //声明,并初始化窗口对象 f Button b = new Button("Press Me!"); //声明,并初始化按钮对象 b
//注册监听器进行授权,(new ButtonHandler());
(new FlowLayout()); //为窗口设置布局管理器 FlowLayout (b); //在窗口中添加按钮b
(200,100); //(new WindowAdapter(){
public void windowClosing(WindowEvent evt) { (false); //设置窗口f 不可见
(); //释放窗口及其子组件的屏幕资源
(0); //退出程序
}
});
(true); //显示窗口
}
}
//ButtonHandler 实现接口 ActionListener 才能做事件 ActionEvent 的处理者
class ButtonHandler implements ActionListener { public void actionPerformed(ActionEvent e)
//ActionEvent 事件对象作为参数
{
("时间发生,已经捕获到");
//本接口必须实现的方法 actionPerformed
}
}
描述:事件处理模型演示
// 文件:程序
编写完程序后,使用 javac 命令编译该文件产生class 文件,然后使用 java 命令运行该class
文件,运行结果如图 12-2,按下“Press Me!”按钮,运行结果如图 12-3 所示。
图 12-2 运行结果一 图 12-3 运行结果二
程序 中,为窗口添加了 WindowListener 监听器和 ActionListener 监听器。监听器监听所有的事件,并当遇到与之匹配的事件,就调用响应的方法进行处理。每一个监听器接口
第 12 章 事件处理
Java 从入门到精通
• 214 •
• 241 •
都有实现的方法,如 ActionListener 必须实现 actionPerformed 方法。Java 中授权处理机制具
有以下特征。
在程序中如果想接受并处理事件*Event,必须定义与之相应的事件处理类,该类必须实现与事件相对应接口*Listener。
定义事件处理类之后,必须将事件处理对象注册到事件源上,使用方法
add*Listener(*Listener)注册监听器。
事件类
每一个事件类都与一个事件类接口相对应,由事件引起的动作都存放在接口需要实现的方法中。本节主要讲述 Java 中比较常用的事件类接口,动作事件类、调整事件类、焦点事件类、项目事件类、按钮事件类、鼠标事件类以及窗口事件类。
事件类分类
所有与 AWT 相关的事件类都是 的派生类, AWTEvent 也是
+--
+--
+--.*Event
类的派生类。事件类的派生关系如下。
总体来说,AWT 事件有低级事件和高级事件两大类。低级事件是指源于组件或容器的事件,当组件或容器发生事件时(单击左键、右键、拖动以及窗口大小的改变等),将触发事件。高级事件是语义事件,此类事件与特定的具体事件不一定相对应,但是会产生特定的事件对象,如按钮被按下触发 ActionEvent 事件、滚动条移动滑块触发 AdjustmentEvent 事件、或选中项目列表某项时触发 ItemEvent 事件。
低级事件包括以下几种。
组件事件(ComponentEvent)。
容器事件(ContainerEvent)。
窗口事件(WindowEvent)。
焦点事件(FocusEvent)。
键盘事件(KeyEvent)。
鼠标事件(MouseEvent)
高级事件(语义事件)包括以下几种。
动作事件(ActionEvent)。
调整事件(AdjustmentEvent)。
项目事件(ItemEvent)。
文本事件(TextEvent)。
第 12 章 事件处理
Java 从入门到精通
• 242 •
• 215 •
本节介绍了几个经常使用的事件,其他的组件也十分类似,如果遇到什么问题,读者可以查询 API 等相关文档。
动作事件类
Public void actionPerformed(ActionEvent e){
//按钮被操作发生
}
动作事件类(ActionEvent)指发生组件定义的语义事件,用户在操作 Button、CheckBox、TextField 等组件的时候将出现动作事件,例如单击 Button、TextField,按下回车键等。使用动作事件时需给组件增加一个事件监听器(事件处理器)ActionListener。ActionListener 只有惟一的 actionPerfomed()方法。它的一般格式如下。
ActionEvent 类的方法有以下几种。
getActionCommand():返回命令字符串。
getModifiers():取得按下的修饰符键。
getWhen():取得事件发生的时间。
paramString():生成事件状态的字符串。
(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//按钮被操作 dosomething
}
}
假设存在按钮组件对象 button,动作事件使用如下。
程序 中定义了事件监听类 ButtonHandler,该类实现了 ActionListener 接口,并且在按钮对象b 中通过 addActionListener(new ButtonHandler())注册时间监听器。
调整事件类
调整事件是滑动滚动条的滚动块时发生的事件。ScrollBar 组件在滑动滚动块时就会触发调整事件, 为了监听调整事件,必须给 ScrollBar 组件对象添加一个调整事件监听器
public void adjustmentValueChanged(AdjustmentEvent e)
{
//调整滚动条发生
}
AdjustmentListener。该监听器只有一个方法,其一般格式如下。
AdjustmentEvent 类的方法有以下几种。
getAdjustable():取得事件源,返回 Adjustable 接口对象。
getAdjustmentType():取得调整类型。
getValue():取得源中的值。
第 12 章 事件处理
Java 从入门到精通
• 216 •
• 241 •
slider = new Scrollbar(,0,1,0,100); //初始化滚动条对象 slider
//为滚动条添加 AdjustmentListener (new AdjustmentEventHandler()); value = new TextField("0",5); //(false); //设置文本域不可编辑label = new Label("0~100"); //初始化标签对象 label (); //设置标签的背景色add(label); //将标签添加到窗口中
add(slider); //将滚动条添加到窗口中
add(value); //将文本域添加到窗口中addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent evt) { setVisible(false); //设置窗口f 不可见
dispose(); //释放窗口及其子组件的屏幕资源
(0); //退出程序
}
});
//设置窗口的布局管理器为 GridLayout
//声明滚动条域 slider
//声明TextField 域 value
//声明 Label 域 label
public void init( ) {
setLayout(new GridLayout(1, 3));
//实例化 AdjustmentEventDemo 对象
}
public static void main(String args[ ])
{
new AdjustmentEventDemo();
}
Scrollbar slider; TextField value; Label label;
//导入需要使用的包和类
import .*;
import ; import ; import ; import ;
public class AdjustmentEventDemo extends Frame {
//声明 AdjustmentEventDemo 构造方法
public AdjustmentEventDemo ()
{
super(); //调用父类构造方法
init(); //调用 init 方法
描述:AdjustmentEvent 演示
// 文件:程序
getValueIsAdjusting():判断源是否被移动。
paramString():生成事件状态的字符串。
假设现有滚动条组件对象 scrollbar,调整事件使用如下。
(new AdjustmentListener()
{
public void adjustmentValueChanged(AdjustmentEvent e)
{
//调整滚动条 do someting
}
});
下面是一个调整事件类的例子。
第 12 章 事件处理
Java 从入门到精通
• 242 •
• 217 •
}
}
}
的值
class AdjustmentEventHandler implements AdjustmentListener
{
//实现 adjustmentValueChanged 方法
public void adjustmentValueChanged(AdjustmentEvent eve) {
((((Scrollbar)()).getValue()));//设置 value
//设置窗口大小
//显示窗口
setSize(300, 50); setVisible(true);
}
编写完程序后,使用 javac 命令编译该文件产生class 文件,然后使用 java 命令运行该class
文件,运行结果如图 12-4 所示。
程序 中创建了一个滚动条对象 slider、一
第 12 章 事件处理
Java 从入门到精通
• 218 •
• 241 •
初始化窗口的组件,设置窗口的布局管理器为
图 12-4 运行结果
第 12 章 事件处理
Java 从入门到精通
• 242 •
• 241 •
GridLayout,并为 slider 添加了 AdjustmentListener 监听器,设置 label 的值为“0~100”,最后将 3 个组件添加窗口。Slider 添加的监听器的参数为 AdjustmentEventHandler 类对象,该类派生于 AdjustmentListener,并实现了 adjustmentValueChanged 方法。
焦点事件类
焦点事件类(FocusEvent)是指用户程序界面的组件失去焦点(即焦点从一个对象转移到另外一个对象)时,就会发生焦点事件。得到焦点事件的组件处于激活状态,例如界面包含文本框组件和单行文本输入区两个组件,如果文本框内部闪烁着光标,则表明该文本框拥有焦点。当鼠标单击单行文本框输入区时,这个时候就会触发焦点时间。使用焦点事件必须给组件增加一个 FocusListener 接口的事件处理器,该接口包含以下两个方法。
void focusGained(FocusEvent e):当获得焦点时发生。
void focusLost(FocusEvent e):当失去焦点时发生。
FocusEvent 类的方法有以下几种。
getOppositeComponent():返回焦点转换到的下一个组件。
isTemporary():判断焦点的转换是暂时的还是永久的。
(new FocusListener() public void focusGained(FocusEvent e)
{
//获得焦点 do somthing
}
public void focusLost(FocusEvent e)
{
//失去焦点 do somthing
}
paramString():生成事件状态的字符串,用 toString()方法进行。假设现有一个文本组件对象 textfield,焦点事件的使用示例如下:
第 12 章 事件处理
Java 从入门到精通
• 242 •
• 241 •
//实例化 FocusEventDemo 对象
//声明 TextArea 域
//声明 TextField 域
//设置窗口的布局管理器为 GridLayout
//初始化 TextArea 对象textarea
});
// 文件:程序
描述:FocusEvent 演示
下面是一个焦点事件的例子。
//导入需要使用的包和类
import .*;
import ; import ; import ; import ;
public class FocusEventDemo extends Frame {
//声明,事项 FocusEventDemo 构造方法
public FocusEventDemo ()
{
super();
init();
}
public static void main(String args[ ])
{
new FocusEventDemo();
}
TextArea textarea; TextField textfield; public void init( ) {
setLayout(new GridLayout(2, 1)); textarea = new TextArea();
//调用父类的构造方法
//调用 init 方法
(new FocusListener() //为 textarea 添加FocusListener 监听器
{
public void focusGained(FocusEvent eve) { ("textarea:获得焦点"); //设置 textarea 的文本内容
}
public void focusLost(FocusEvent eve) { ("textarea:失去焦点"); //设置 textarea 的文本内容
}
});
textfield = new TextField();
//初始化 TextField 对象textfield
(new FocusListener() //为 textfield 添加FocusListener 监听器
{
public void focusGained(FocusEvent eve) { ("textfield:获得焦点"); //设置 textfield 的文本内容
}
public void focusLost(FocusEvent eve) { ("textfield:失去焦点"); //设置 textfield 的文本内容
}
});
add(textarea); //在窗口中添加 textarea add(textfield); //在窗口中添加 textfield addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent evt) {
setVisible(false); //设置窗口f 不可见
dispose(); //释放窗口及其子组件的屏幕资源
(0); //退出程序
}
第 12 章 事件处理
Java 从入门到精通
• 242 •
• 221 •
编写完程序后,使用 javac 命令编译该文件产生 class 文件,然后使用 java 命令运行该 class 文件,运行结果如图 12-5 所示。
程序 中有两个组件对象 textfield 和 textarea,当程序运行后,焦点位于容器中添加的第一个组件
}
//设置窗口的大小
//显示窗口
});
setSize(300, 200); setVisible(true);
}
第 12 章 事件处理
Java 从入门到精通
• 222 •
• 241 •
textarea,但是当用鼠标单击 textfield 之后,可以看到
textarea 失去焦点,textfield 获得焦点,获得焦点的组件处于激活状态。
项目事件类
图 12-5 运行结果
第 12 章 事件处理
Java 从入门到精通
• 242 •
• 241 •
项目事件类(ItemEvent)是指某一个项目被选定、取消的语义事件。选择 CheckBox、
ComboBox、List 等组件的时候将产生项目事件。使用项目事件必须给组件添加一个实现
ItemListener 接口的事件处理器,该接口的方法如下。
void itemStateChange(ItemEvent e)
项目事件类的方法有以下几种。
getItem():返回取得影响的项目对象。
getItemSelectable():返回事件源 ItemSelectable 对象。
getStateChange():返回状态的改变类型,包括 SELECTED 和DESELECTED 两种。
paramString():生成事件状态的字符串。
(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
//项目发生改变 do somthing
}
});
假设现有一个下拉列表框组件对象jComboBox1,项目事件的使用示例如下。
下面是一个项目事件的例子。
//导入需要使用的包和类
import .*;
import ; import ; import ; import ;
public class ItemEventDemo extends Frame implements ItemListener{
//声明,实现 ItemEventDemo 构造方法
public ItemEventDemo()
描述:ItemEvent 演示
// 文件:程序
第 12 章 事件处理
Java 从入门到精通
• 242 •
• 241 •
{
super(); //调用父类构造方法
init(); //调用 init 方法
}
public static void main(String args[ ])
{
new ItemEventDemo(); //实例化 ItemEventDemo 对象
}
List list; //声明滚动文本项列表类型域
Checkbox checkbox1,checkbox2,checkbox3; //声明复选框类型域Choice colorChooser; //声明弹出式选择菜单域TextArea textarea; //声明文本区域
public void init( ) {
setLayout(new GridLayout(4, 1)); //设置窗口布局管理器为 GridLayout textarea = new TextArea(); // 初 始 化 文 本 区 域 textarea add(textarea); //将文本区对象添加到窗口中
list = new List(4,false); //初始化滚动列表,显示 4 行,允许多选
("语文"); //在滚动项列表末尾添加“语文”项
("数学"); //在滚动项列表末尾添加“数学”项
("英语"); //在滚动项列表末尾添加“英语”项
("物理"); //在滚动项列表末尾添加“物理”项
("化学"); //在滚动项列表末尾添加“化学”项
("历史"); //在滚动项列表末尾添加“历史”项
("地理"); //在滚动项列表末尾添加“地理”项add(list); //在窗口中添加滚动列表
(this); //为 list 添加监听器 ItemListener Panel panel = new Panel(); //创建,并初始化面板对象 panel
CheckboxGroup cbg = new CheckboxGroup(); //创建,并初始化一个复选框组 cbg checkbox1 = new Checkbox("one", cbg, true); //初始化复选框对象 checkbox1 (this); //为复选框 checkbox1 添加项目监听器 ItemListener (checkbox1); //在面板中添加复选框 checkbox1
checkbox2 = new Checkbox("two", cbg, false); // 初 始 化 复 选 框 对 象 checkbox2 (this); //为复选框 checkbox1 添加项目监听器 ItemListener (checkbox2); //在面板中添加复选框 checkbox1
checkbox3 = new Checkbox("three", cbg, true); //初始化复选框对象 checkbox3 (this); //为复选框 checkbox1 添加项目监听器 ItemListener (checkbox3); //在面板中添加复选框 checkbox1
add(panel); //
(精品)第12章 来自淘豆网m.daumloan.com转载请标明出处.