理论教育 Java程序设计实用教程:事件处理模型

Java程序设计实用教程:事件处理模型

时间:2023-11-21 理论教育 版权反馈
【摘要】:然后将该事件对象传递给监听者对象,监听者对象根据该事件对象内的信息决定适当的处理方式。图7.2显示了事件的处理过程。表7.1列出了常用的AWT事件及其相应的监听器接口,共10类事件,11个接口。表7.1常用的AWT事件及其相应的监听器接口续表Swing并不是来取代原有的AWT,使用Swing组件时,对于比较低层的事件需要使用AWT包提供的处理方法对事件进行处理。

Java程序设计实用教程:事件处理模型

1.事件模型的原理

Java采用委托事件模型来处理事件。委托事件模型的特点是将事件的处理委托给独立的对象,而不是组件本身,从而将使用者界面与程序逻辑分开。整个“委托事件模型”由产生事件的对象(事件源)、事件对象及监听者对象之间的关系所组成。

每当用户在组件上进行某种操作时,事件处理系统便会将与该事件相关的信息封装到一个“事件对象”中。例如,用户用鼠标单击命令按钮时便会生成一个代表此事件的ActionEvent事件类对象。用户的操作不同,事件类对象也会不同。

然后将该事件对象传递给监听者对象,监听者对象根据该事件对象内的信息决定适当的处理方式。每类事件对应一个监听程序接口,它规定了接收并处理该类事件的方法规范。例如ActionEvent事件就对应ActionListener接口。该接口中只有一个方法actionPerformed(),当出现ActionEvent事件时,该方法将会被调用。

为了接收并处理某类用户事件,必须在程序代码中向产生事件的对象注册相应的事件处理程序,即事件的监听程序,它是实现了对应监听程序接口的一个类。当事件产生时,产生事件的对象就会主动通知监听者对象,监听者对象可以根据产生的事件对象来决定处理事件的方法。例如,为了处理命令按钮上的ActionEvent事件,需要定义一个实现ActionListener接口的监听程序类。每个组件都由形如add××Listener的方法,通过这类方法,可以为组件注册事件监听程序。例如,在Jbutton类中有方法public void addActionListener(ActionListener 1),该 方 法 可 以 为Jbutton组件注册ActionEvent事件监听程序,方法的参数应该是一个实现了ActionListener接口的类的实例。图7.2显示了事件的处理过程。

图7.2 事件处理模型示意图

【例7.1】 事件处理演示程序。

功能:在窗口界面放置一个命令按钮,为该命令按钮注册一个ButtonEventHandle对象作为ActionEvent事件的监听程序,该监听者实现ActionEvent事件对应的ActionListener接口。在该类的actionPerformed方法中给出如何处理ActionEvent事件,当用户单击命令按钮时,事件被触发,该方法被调用。

2.事件模型的实现方法

事件模型的实现方法有3种:定义类时实现监听接口、在另一个类中实现监听接口和创建匿名内部类。

(1)定义类时实现监听接口。

【例7.2】 定义类时实现监听接口实例。

(2)在另一个类中实现监听接口,如[例7.1]所示。

(3)创建匿名内部类

【例7.3】 创建匿名内部类实例。(www.daowen.com)

3.事件及监听者

前面介绍了图形用户界面处理的一般机制,其中只涉及ActionEvent事件类,由于不同事件源上发生的事件种类不同,不同的事件由不同的监听者处理。所以在java.aw t.event包和javax.Swing.event包中还定义了很多其他事件类。每个事件类都有一个对应的接口,接口中声明了若干个抽象的事件处理方法,事件的监听程序类需要实现相应的接口。

事件类的体系结构图如图7.3所示。

java.util.EventObject类是所有事件类的基础父类,所有事件都是由它派生出来的。AWT的相关事件继承自java.aw t.AWTEvent类,这些AWT事件分为两大类:低级事件和高级事件,低级事件是指基于组件和容器的事件,如鼠标的进入、点击、拖放等或组件的窗口开关等,触发了组件事件。低级事件主要包括ComponentEvent、ContainerEvent、WindowEvent、FocusEvent、KeyEvent、MouseEvent等。

图7.3 事件类的体系结构图

高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类,如在TextField中按Enter键会触发ActionEvent事件,滑动滚动条会触发AdjustmentEvent事件,或是选中项目列表的某一条就会触发ItemEvent事件。高级事件主要包括ActionEvent、AdjustmentEvent、ItemEvent、TextEvent等。

表7.1列出了常用的AWT事件及其相应的监听器接口,共10类事件,11个接口。

表7.1 常用的AWT事件及其相应的监听器接口

续表

Swing并不是来取代原有的AWT,使用Swing组件时,对于比较低层的事件需要使用AWT包提供的处理方法对事件进行处理。在javax.Swing.event包中也定义了一些事件类,包括AncestorEvent、CaretEvent、CareEvent、DocumentEvent等。

所有的事件都继承自EventObject类,在该类中定义了一个重要的方法getSource(),该方法的功能是从事件对象获取触发该事件的事件源,为编写事件处理的代码提供方便。该方法的声明为public Object getSource(),无论事件源是何种具体类型,返回的都是Object类型的引用,开发人员需要自己编写代码进行引用的强制类型转换。

对于AWT的组件类和Swing组件类提供注册和注销监听器的方法,注册监听器的方法为public void add××Listener(listener),如果不需要对该事件进行监听处理,可以把事件源的监听器注销,方法为public void remove××Listener(listener)。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈