ActionEvent事件处理机制
事件驱动程序设计

事件驱动程序设计(英语:Event-driven programming)是一种电脑程序设计模型。
这种模型的程序运行流程是由用户的动作(如鼠标的按键,键盘的按键动作)或者是由其他程序的消息来决定的。
相对于批处理程序设计(batch programming)而言,程序运行的流程是由程序员来决定。
批量的程序设计在初级程序设计教学课程上是一种方式。
然而,事件驱动程序设计这种设计模型是在交互程序(Interactive program)的情况下孕育而生的。
事件驱动程序可以由任何编程语言来实现,然而使用某些语言来撰写会比其他的语言来的简单。
有些集成开发环境(简称IDE)也会影响实现事件驱动程序设计的难易程度。
有的IDE 会使的开发工作变的很简单,有的则否。
取代传统上一次等待一个完整的指令然后再做运行的方式,事件驱动程序模型下的系统,基本上的架构是预先设计一个事件循环所形成的程序,这个事件循环程序不断地检查目前要处理的信息,根据要处理的信息运行一个触发函数进行必要的处理。
其中这个外部信息可能来自一个目录夹中的文件,可能来自键盘或鼠标的动作,或者是一个时间事件。
对一个事件驱动(event driven)系统进行程序设计,因此可以视为改写系统默认触发函数的行为,来符合自己需要的一种动作。
输入的事件可以放进事件循环或者是经由已经注册的中断处理器来与硬件事件交互;而许多的软件系统使用了混和这两种技术的处理。
预先设计好的算法确定了一件事,那就是当他们被需要的时候,就会在适当的时机被触发。
也因此提供了一个模拟中断驱动环境(interrupt driven environment)的软件抽象架构。
事件驱动程序设计基本上包含了许多小程序片段,这些小程序片段被称为事件处理器并且被用来回应外部的事件与分发事件。
通常尚未被事件处理器处理的事件,都会被系统放在一个称为事件队列的数据结构中,等待被处理。
许多情况下,事件处理器可以自己触发事件,因此也可能形成一个事件串。
AWT事件处理

Java AWT事件处理1 AWT事件处理基本概念AWT事件处理的过程中,主要涉及3类对象。
(1) Event(事件):用户对组件的一个操作,称之为一个事件,以类的形式出现,例如,键盘操作对应的事件类是KeyEvent。
其实例在改事件发生时有系统自动产生。
(2) Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮Button。
(3) Event Monitor(事件监听器):接收事件对象并对其进行处理的类的对象,通常其中某个成员方法对事件进行相应的处理。
事件委托处理模型图10-10 事件委托处理模型Java采取了事件委托处理模型(Delegation Model),事件源自己不处理事件,而是把在其自身所有可能发生的事件委托给事件监听器来处理。
比如,在Canvas对象上既可能发生鼠标事件,也可能发生键盘事件,该Canvas对象就可以委托给事件监听器1来处理鼠标事件,同时委托给事件监听器2来处理键盘事件。
委托模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。
2 事件事件分类。
按事件的性质分类java.util.EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。
AWT的相关事件继承于java.awt.AWTEvent类,这些AWT事件分为两大类:低级事件和高级事件。
(1)低级事件低级事件是指基于组件和容器的事件,当一个组件上发生事件,如鼠标的进入、点击、拖放等,或组件的窗口开关等时,触发了组件事件。
—ComponentEvent(组件事件:组件尺寸的变化、移动);—ContainerEvent(容器事件:组件增加、移动);—WindowEvent(窗口事件:关闭窗口、窗口闭合、图标化);—FocusEvent(焦点事件:焦点的获得和丢失);—KeyEvent(键盘事件:键按下、释放);—MouseEvent(鼠标事件:鼠标单击、移动)。
第13章事件处理(第4版)

实现上述的接口,针对想要捕获的事件编写方法代码 。如要捕获单击按钮事件,就要为ActionListener接口 里的actionPerformed()方法编写代码。
为事件监听者创建一个对象,让自己的组件和方法完 成对它的注册,方法是在监听者接口的名字里加入一 个前缀“add”,如addActionListener()
待用户通过鼠标、键盘给它通知(消息驱动), 它再根据这个通知的内容进行相应的处理(事件 驱动)。 通常一个键盘或鼠标操作会引发一个系统预先定 义好的事件,用户只需编写代码,定义每个特定 事件发生时程序应做出何种响应即可。
3
13.1 委托事件处理
事件(event):用户使用鼠标或键盘对窗口中的组 件进行交互时所发生的事情。对这些事件做出响 应的程序,称为事件处理程序(Event Handler)。
见教材例13.5
20
13.6 文本组件及相应的事件处理
文本组件所触发的事件主要有动作事件 ActionEvent和文本变化事件CaretEvent 。 见教材例13.6
21
13.7 窗口组件及窗口事件处理
Window类的任何子类都可能触发下列的窗口事 件:打开窗口、正在关闭窗口、关闭窗口、激活窗 口、变成非活动窗口、最小化窗口和还原窗口。 Window类常用方法见教材表13.8
5
13.1 委托事件处理
Java语言规定:为了让监听者能对事件源发生的 事件进行处理,创建该监听者对象的类必须声明 实现相应的监听者接口或继承相应的适配类,即 必须在类体中具体定义该接口中所有方法的方法 体或覆盖适配器类中的相应方法,以供监听者自 动调用相应事件处理方法来完成对应事件的任务 ,这些处理事件的方法就是事件处理程序。
JCheckBoxMenuItem类的构造方法及常用方法 见教材表13.30、13.31。
事件类型——精选推荐

事件类型个⼈分类:1.所有事件类型:Java将所有组件可能发⽣的事件进⾏分类,具有共同特征的事件被抽象为⼀个事件类AWTEvent,其中包括ActionEvent类(动作事件)、MouseEvent类(⿏标事件)、KeyEvent类(键盘事件)等。
表列出了常⽤Java事件类、处理该事件的接⼝及接⼝中的⽅法。
常⽤Java事件类、处理该事件的接⼝及接⼝中的⽅法事件类/接⼝名称接⼝⽅法及说明ActionEvent动作事件类ActionListener接⼝actionPerformed(ActionEvent e)单击按钮、选择菜单项或在⽂本框中按回车时AdjustmentEvent调整事件类AdjustmentListener接⼝adjustmentValueChanged(AdjustmentEvent e)当改变滚动条滑块位置时ComponentEvent组件事件类ComponentListener接⼝componentMoved(ComponentEvent e)组件移动时componentHidden(ComponentEvent e)组件隐藏时componentResized(ComponentEvent e)组件缩放时componentShown(ComponentEvent e)组件显⽰时ContainerEvent容器事件类ContainerListener接⼝componentAdded(ContainerEvent e)添加组件时componentRemoved(ContainerEvent e) 移除组件时FocusEvent焦点事件类FocusListener接⼝focusGained(FocusEvent e)组件获得焦点时focusLost(FocusEvent e)组件失去焦点时ItemEvent选择事件类ItemListener接⼝itemStateChanged(ItemEvent e)选择复选框、选项框、单击列表框、选中带复选框菜单时KeyEvent键盘事件类KeyListener接⼝keyPressed(KeyEvent e)键按下时keyReleased(KeyEvent e) 键释放时keyTyped(KeyEvent e)击键时MouseEvent⿏标事件类MouseListener接⼝mouseClicked(MouseEvent e) 单击⿏标时mouseEntered(MouseEvent e)⿏标进⼊时mouseExited(MouseEvent e)⿏标离开时mousePressed(MouseEvent e)⿏标键按下时mouseReleased(MouseEvent e) ⿏标键释放时MouseEvent⿏标移动事件类MouseMotionListener接⼝mouseDragged(MouseEvent e)⿏标拖放时mouseMoved(MouseEvent e)⿏标移动时TextEvent⽂本事件类TextListener接⼝textValueChanged(TextEvent e)⽂本框、多⾏⽂本框内容修改时WindowEvent窗⼝事件类WindowListener接⼝windowOpened(WindowEvent e)窗⼝打开后windowClosed(WindowEvent e)窗⼝关闭后windowClosing(WindowEvent e)窗⼝关闭时windowActivated(WindowEvent e)窗⼝激活时windowDeactivated(WindowEvent e) 窗⼝失去焦点时windowIconified(WindowEvent e)窗⼝最⼩化时windowDeiconified(WindowEvent e) 最⼩化窗⼝还原时当多个事件源触发的事件由⼀个共同的监听器处理时,我们可以通过getSource()⽅法判断当前的事件源是哪⼀个组件。
事件流程总结

概述事件处理流程分3个步骤,1)添加事件监听(初始化),2产生事件(运行时),3)执行事件(运行时)。
1)首先将每个组件上配置的事件监听(可多个)注册到组件自己的监听列表中。
UIComponentBaseprivate List<FacesListener> listeners;//组件自身的监听列表addFacesListener(FacesListener listener) {listeners.add(listener);}一般情况下注册监听器是在构造组件树时完成的。
即由jsp tag或facelet tag来完成。
每个tag调用componentXX.addFacesListener来将componentXX上配置的监听器添加到componentXX的listeners中。
<h:inputText><f:valueChangeListener type="com.corejsf.CountryListener"/></ h:inputText>也可以将监听注册到其它组件上,比如f:phaseListener会注册到root上参加facelet 的PhaseListenerHandlerUIViewRoot root = ComponentSupport.getViewRoot(ctx, parent);//寻找的是root 而不是parent。
PhaseListener pl = new LazyPhaseListener(this.listenerType, b);root.addPhaseListener(pl);2)运行时的每个阶段组件都可能产生事件,//每阶段都先处理页面阶段事件,再处理其它事件。
//----处理阶段事件---- notifyPhaseListeners。
---//XXXXXXX产生的事件不存储直接就被处理掉XXXXX PhaseEvent event = createPhaseEvent(context, phaseId);Iterator iter = phaseListeners.iterator();While{curListener = (PhaseListener)iter.next();curListener.beforePhase(event);//XXXXXXX产生的事件先被存储,然后在适当的时机被处理XXXXX //---- processDecodes ---notifyPhaseListeners。
实验题目

实验一 Java语言概述【实验目的】1.掌握开发Java应用程序的三个步骤:编写源文件、编译源文件和运行应用程序。
2.熟悉Java应用程序的基本结构,并能联合编译应用程序所需要的类。
文件保存要求:在D:盘新建文件夹“学号”,在“D:\ 学号”下新建文件夹“timu1”。
题目1的文件保存在“timu1”中,以下依次类推。
【题目1】1、实验要求:编写一个简单的Java应用程序,该程序在命令行窗口输出两行文字:“你好,很高兴学习Java”和“We are students”。
2、程序模板:请按模板要求,将【代码】替换为Java程序代码。
3、实验后的练习a.编译器怎样提示丢失大括号的错误。
b.编译器怎样提示语句丢失分号的错误。
c.编译器怎样提示将System写成system这一错误。
d.编译器怎样提示将String写成string这一错误。
【题目2】1、实验要求:编写3个源文件:、、,每个源文件只有一个类。
含有应用程序的主类(含有main方法),并使用了Teacher和Student类。
将3个源文件保存到同一目录,D:\timu2,然后编译。
2、程序模板:请按模板要求,将【代码】替换为Java程序代码。
3、实验后的练习a.将编译通过后,不断地修改源文件中的【代码2】。
比如,在命令行窗口输出“我是语文老师”或“我是数学老师”。
要求每次修改源文件后,单独编译,然后直接运行应用程序(不要再编译)。
b.如果需要编译某个目录下的全部Java源文件,如D:\1001目录,可以使用如下命令:D:\1001>javac *.java请练习上述命令。
【题目3】1、实验要求:课本第15页习题2、实验后的练习习题8.(4)实验四类与对象【实验目的】1.掌握使用类来封装对象的属性和行为。
2.掌握对象的组合以及参数传递。
3.掌握类变量与实例变量,以及类方法与实例方法的区别。
文件保存要求:在D:盘新建文件夹“shiyan04”,在“D:\ 20120shiyan04”下新建文件夹“timu1”。
谈Java技术中的事件处理与应用

[1] 《Java 程序设计实践教程》刘万军 宋强 清华大学出 版社 2006 年 9 月
[2] 《Java 编程技术》孙一林 彭波 机械工业出版社 2008 年 6月
(收稿日期:20 11. 05 .05 )
·64·
事件源
触发的事件类的类型Button NhomakorabeaActionEvent
CheckBox
ActionEve nt、ItemEvent
—— —— —— —— —— —— —— 作者简介:邢素萍(1957-),女,江苏南京人,南京工业职业技术学院教授,研究方向:Java 技术,南京,210046
王 健南 (1957- ),男 ,江 苏南 京人 ,南 京工 业职 业技 术学 院教 授, 研究 方向 :数 据库 技术 ,教 育技 术, 南京 ,210046
Microcomputer Applications Vol. 27, No.12, 2011
技术交流
微型电脑应用
2011 年第 27 卷第 12 期
文章编号:100 7-757X(2011)12-0063-02
谈 Java 技 术 中 的 事 件 处 理 与 应 用
邢素萍,王健南
摘 要:简述了 JAVA 语言面向对象程序设计中事件处理的基本方法,并通过一个包含命令按钮的实例说明了编程基本原则。
Java 把事件类分为语义事件和底层事件,语义事件直接 继承自 AWTEvent 类。如: ActionEvent、Adjustm enEvent
图2
在 AWT 组件中,有的只是触发一个事件处理类,而有 的可能触发几个事件处理类,给出常用组件与可能触发事件 的关系,如表 1 所示:
表 1 事件源与触发的事件类类型的关系
AWT事件处理机制

AWT事件处理机制在事件处理的过程中主要涉及3类对象1.事件,⽤户对界⾯操作在Java语⾔上的描述以类的形式出现,例如键盘操作对应的事件类是KeyEvent2.事件源,事件发⽣的场所,通常是各个组件,例如按钮Button3.事件处理者,接收事件对象并对其进⾏处理的对象同⼀个事件源可能发⽣多种事件,所以Java采取授权处理机制,事件源把⾃⾝可能发⽣的事件分别授权给不同的事件处理者进⾏处理。
有时也将事件处理者称为监听器,因为监听器时刻监听事件源发⽣的事件类型,如果该事件类型与⾃⼰所负责处理的事件类型⼀致,就马上进⾏处理授权模型把事件的处理委托给外部处理实体进⾏处理,实现将事件源和监听器分开的机制。
事件处理者(监听器)通常是⼀个类,该类如果能够处理某种类型的事件,就必须实现与该事件类型相对应的接⼝import java.awt.Button;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class ep2_6 {public static void main (String[] args){Frame f=new Frame();Button b1=new Button("1");b1.addActionListener(new ButtonHandler());//注册监听器进⾏授权,该⽅法参数是事件处理对象f.setLayout(new FlowLayout());f.add(b1);f.setSize(100, 100);f.setVisible(true);}class ButtonHandler1 implements ActionListener//实现接⼝ActionListener才能做事件ActionEventd的处理者{public void actionPerformed1(ActionEvent e)//系统产⽣的ActionEvent事件对象被当作参数传递给该⽅法{System.out.println("处理");}@Overridepublic void actionPerformed(ActionEvent e) {// TODO ⾃动⽣成的⽅法存根}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
类 ActionEventng.Objectjava.util.EventObjectjava.awt.AWTEventjava.awt.event.ActionEvent所有已实现的接口:Serializablepublic class ActionEventextends AWTEvent指示发生了组件定义的动作的语义事件。
当特定于组件的动作(比如被按下)发生时,由组件(比如Button)生成此高级别事件。
事件被传递给每一个ActionListener对象,这些对象是使用组件的addActionListener方法注册的,用以接收这类事件。
注:要使用键盘在Button上触发ActionEvent,请使用空格键。
实现ActionListener接口的对象在发生事件时获取此ActionEvent。
因此,侦听器不必处理个别鼠标移动和鼠标单击的细节,而是可以处理像“按下按钮”这样的“有意义”(语义)事件。
从以下版本开始:1.1另请参见:ActionListener, Tutorial: Java 1.1 Event Model, 序列化表格字段摘要static int ACTION_FIRST用于标识动作事件的 ID 序列的起始编号。
static int ACTION_LAST用于标识动作事件的 ID 序列的结束编号。
static int ACTION_PERFORMED此事件 id 指示发生了有意义的动作。
static int ALT_MASKalt 修饰符。
static int CTRL_MASKCtrl 修饰符。
static int META_MASKmeta 修饰符。
static int SHIFT_MASKshift 修饰符。
从类 java.awt.AWTEvent继承的字段ACTION_EVENT_MASK, ADJUSTMENT_EVENT_MASK, COMPONENT_EVENT_MASK, consumed, CONTAINER_EVENT_MASK, FOCUS_EVENT_MASK,HIERARCHY_BOUNDS_EVENT_MASK, HIERARCHY_EVENT_MASK, id,INPUT_METHOD_EVENT_MASK, INVOCATION_EVENT_MASK, ITEM_EVENT_MASK, KEY_EVENT_MASK, MOUSE_EVENT_MASK, MOUSE_MOTION_EVENT_MASK, MOUSE_WHEEL_EVENT_MASK, PAINT_EVENT_MASK, RESERVED_ID_MAX,TEXT_EVENT_MASK, WINDOW_EVENT_MASK, WINDOW_FOCUS_EVENT_MASK, WINDOW_STATE_EVENT_MASK从类 java.util.EventObject继承的字段source构造方法摘要ActionEvent(Object source, int id, String command)构造一个 ActionEvent 对象。
ActionEvent(Object source, int id, String command, int modifiers) 使用修改键构造一个 ActionEvent 对象。
ActionEvent(Object source, int id, String command, long when,int modifiers)使用指定修改键和时间戳构造一个 ActionEvent 对象。
方法摘要String getActionCommand()返回与此动作相关的命令字符串。
int getModifiers()返回发生此动作事件期间按下的修改键。
long getWhen()返回发生此事件时的时间戳。
String paramString()返回标识此动作事件的参数字符串。
从类 java.awt.AWTEvent继承的方法consume, getID, isConsumed, setSource, toString从类 java.util.EventObject继承的方法getSource从类 ng.Object继承的方法clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait字段详细信息SHIFT_MASKpublic static final int SHIFT_MASKshift 修饰符。
指示 shift 键在发生事件期间是否被按下的指示器。
另请参见:常量字段值CTRL_MASKpublic static final int CTRL_MASKCtrl 修饰符。
指示 Ctrl 键在发生事件期间是否被按下的指示器。
常量字段值META_MASKpublic static final int META_MASKmeta 修饰符。
指示 meta 键在发生事件期间是否被按下的指示器。
另请参见:常量字段值ALT_MASKpublic static final int ALT_MASKalt 修饰符。
指示 alt 键在发生事件期间是否被按下的指示器。
另请参见:常量字段值ACTION_FIRSTpublic static final int ACTION_FIRST用于标识动作事件的 ID 序列的起始编号。
另请参见:常量字段值ACTION_LASTpublic static final int ACTION_LAST用于标识动作事件的 ID 序列的结束编号。
另请参见:常量字段值ACTION_PERFORMEDpublic static final int ACTION_PERFORMED此事件 id 指示发生了有意义的动作。
常量字段值构造方法详细信息ActionEventpublic ActionEvent(Object source,int id,String command)构造一个 ActionEvent 对象。
注意,传入无效 id 会导致未指定的行为。
如果 source 为 null,则此方法抛出 IllegalArgumentException。
为 null 的 command 字符串是合法的,但不建议使用。
参数:source - 发起事件的对象id - 标识事件的整数command - 一个字符串,它可以用来指定与事件所相关的一条命令(可能是几个中的一个)抛出:IllegalArgumentException - 如果 source 为 nullActionEventpublic ActionEvent(Object source,int id,String command,int modifiers)使用修改键构造一个 ActionEvent 对象。
注意,传入无效 id 会导致未指定的行为。
如果 source 为 null,则此方法抛出 IllegalArgumentException。
为 null 的 command 字符串是合法的,但不建议使用。
参数:source - 发起事件的对象id - 标识事件的整数command - 一个字符串,它可以用来指定与事件所相关的一条命令(可能是几个中的一个)modifiers - 进行此动作期间按下的修改键抛出:IllegalArgumentException - 如果 source 为 nullActionEventpublic ActionEvent(Object source,int id,String command,long when,int modifiers)使用指定修改键和时间戳构造一个 ActionEvent 对象。
注意,传入无效 id 会导致未指定的行为。
如果 source 为 null,则此方法抛出 IllegalArgumentException。
为 null 的 command 字符串是合法的,但不建议使用。
参数:source - 发起事件的对象id - 标识事件的整数command - 一个字符串,它可以用来指定与事件所相关的一条命令(可能是几个中的一个)when - 发生事件的时间modifiers - 进行此动作期间按下的修改键抛出:IllegalArgumentException - 如果 source 为 null从以下版本开始:1.4方法详细信息getActionCommandpublic String getActionCommand()返回与此动作相关的命令字符串。
这使得 "modal" 组件可以由其当前的状态,通过此字符串来得到它能够产生的几个命令之一。
例如,单个按钮可以在“显示详细信息”和“隐藏详细信息”之间切换。
在所有情况下,源对象和事件都将是相同的,但命令字符串将会标识出实际对应的动作。
注意,如果将 null 命令字符串传递给此 ActionEvent 的构造方法,则此方法返回 null。
返回:标识此事件命令的字符串getWhenpublic long getWhen()返回发生此事件时的时间戳。
因为 ActionEvent 是一个高级别语义事件,所以时间戳通常与基础 InputEvent 相同。
返回:此事件的时间戳从以下版本开始:1.4getModifierspublic int getModifiers()返回发生此动作事件期间按下的修改键。
返回:修饰符常量的按位或paramStringpublic String paramString()返回标识此动作事件的参数字符串。
此方法对于事件记录和调试很有用。
覆盖:类AWTEvent中的paramString返回:标识事件及其相关命令的字符串。