二级Java考试辅导教程:5.2AWT事件处理模型 |
|
www.nanhushi.com 佚名 不详 |
5.2 AWT事件处理模型 上一节中的主要内容是如何放置各种组件,使图形界面更加丰富多彩,但是还不能响应用户的任何操作,要能够让图形界面接收用户的操作,就必须给各个组件加上事件处理机制。在事件处理的过程中,主要涉及三类对象: Event-事件,用户对界面操作在java语言上的描述,以类的形式出现,例如键盘操作对应的事件类是KeyEvent。 Event Source-事件源,事件发生的场所,通常就是各个组件,例如按钮Button。 Event handler-事件处理者,接收事件对象并对其进行处理的对象 例如,如果用户用鼠标单击了按钮对象button,则该按钮button就是事件源,而java运行时系统会生成ActionEvent类的对象actionE,该对象中描述了该单击事件发生时的一些信息,然后,事件处理者对象将接收由java运行时系统传递过来的事件对象actionE并进行相应的处理。 由于同一个事件源上可能发生多种事件,因此java采取了授权处理机制(Delegation Model),事件源可以把在其自身所有可能发生的事件分别授权给不同的事件处理者来处理。比如在Canvas对象上既可能发生鼠标事件,也可能发生键盘事件,该Canvas对象就可以授权给事件处理者一来处理鼠标事件,同时授权给事件处理者二来处理键盘事件。有时也将事件处理者称为监听器,主要原因也在于监听器时刻监听着事件源上所有发生的事件类型,一旦该事件类型与自己所负责处理的事件类型一致,就马上进行处理。授权模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。事件处理者(监听器)通常是一个类,该类如果要能够处理某种类型的事件,就必须实现与该事件类型相对的接口。例如例5.9中类ButtonHandler之所以能够处理ActionEvent事件,原因在于它实现了与ActionEvent事件对应的接口ActionListener。每个事件类都有一个与之相对应的接口。 来源:www.examda.com 将事件源对象和事件处理器(事件监听器)分开。如图5.2所示 打个不太恰当的比喻,比如说有一位李先生,李先生可能会发生很多法律纠纷,可能是民事法律纠纷,也可能是刑事法律纠纷,那么李先生可以请律师,他可以授权王律师负责帮他打民事法律的官司,同时也可以授权张律师帮他打刑事法律的官司。这个请律师的过程从李先生的角度来看,就是授权的过程,而从王律师和张律师的角度来看,一旦被授权,他们就得时刻对李先生负责,"监听"着李先生,一旦发生民事纠纷了,王律师就要马上去处理,而一旦发生刑事纠纷了,张律师就要马上进行处理。此时此刻,李先生就是事件源,王律师是一个事件处理者,张律师是另外一个事件处理者,民事纠纷和刑事纠纷就是不同类型的事件。 使用授权处理模型进行事件处理的一般方法归纳如下: 1.对于某种类型的事件XXXEvent, 要想接收并处理这类事件,必须定义相应的事件监听器类,该类需要实现与该事件相对应的接口XXXListener; 2.事件源实例化以后,必须进行授权,注册该类事件的监听器,使用addXXXListener(XXXListener ) 方法来注册监听器。 5.2.1 事件类 与AWT有关的所有事件类都由java.awt.AWTEvent类派生,它也是EventObject类的子类。AWT事件共有10类,可以归为两大类:低级事件和高级事件。 java.util.EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。AWT的相关事件继承于java.awt.AWTEvent类,这些AWT事件分为两大类:低级事件和高级事件,低级事件是指基于组件和容器的事件,当一个组件上发生事件,如:鼠标的进入,点击,拖放等,或组件的窗口开关等,触发了组件事件。高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类,如在TextField中按Enter键会触发ActionEvent事件,滑动滚动条会触发AdjustmentEvent事件,或是选中项目列表的某一条就会触发ItemEvent事件。 低级事件 ComponentEvent( 组件事件:组件尺寸的变化,移动) ContainerEvent( 容器事件:组件增加,移动) WindowEvent( 窗口事件:关闭窗口,窗口闭合,图标化) FocusEvent( 焦点事件:焦点的获得和丢失) KeyEvent( 键盘事件:键按下、释放) MouseEvent( 鼠标事件:鼠标单击,移动) 高级事件(语义事件) ActionEvent(动作事件:按钮按下,TextField中按Enter键) AdjustmentEvent(调节事件:在滚动条上移动滑块以调节数值) ItemEvent(项目事件:选择项目,不选择"项目改变") TextEvent(文本事件,文本对象改变) 5.2.2 事件监听器 每类事件都有对应的事件监听器,监听器是接口,根据动作来定义方法。 例如,与键盘事件KeyEvent相对应的接口是: public interface KeyListener extends EventListener { public void keyPressed(KeyEvent ev); public void keyReleased(KeyEvent ev); public void keyTyped(KeyEvent ev); } 注意到在本接口中有三个方法,那么java运行时系统何时调用哪个方法?其实根据这三个方法的方法名就能够知道应该是什么时候调用哪个方法执行了。当键盘刚按下去时,将调用keyPressed( )方法执行,当键盘抬起来时,将调用keyReleased( )方法执行,当键盘敲击一次时,将调用keyTyped( )方法执行。
又例如窗口事件接口: public interface WindowListener extends EventListener{ public void windowClosing(WindowEvent e); //把退出窗口的语句写在本方法中 public void windowOpened(WindowEvent e); //窗口打开时调用 public void windowIconified(WindowEvent e); //窗口图标化时调用 public void windowDeiconified(WindowEvent e); //窗口非图标化时调用 public void windowClosed(WindowEvent e); //窗口关闭时调用 public void windowActivated(WindowEvent e); //窗口激活时调用 public void windowDeactivated(WindowEvent e); //窗口非激活时调用 } AWT的组件类中提供注册和注销监听器的方法: 注册监听器: public void add (listener); 注销监听器: public void remove (listener); 例如Button类:(查API) public class Button extends Component { …… public synchronized void addActionListener(ActionListener l); public synchronized void removeActionListener(ActionListener l); ……}
5.2.3 事件适配器 Java语言为一些Listener接口提供了适配器(Adapter)类。可以通过继承事件所对应的Adapter类,重写需要方法,无关方法不用实现。事件适配器为我们提供了一种简单的实现监听器的手段, 可以缩短程序代码。但是,由于java的单一继承机制,当需要多种监听器或此类已有父类时,就无法采用事件适配器了。 1.事件适配器--EventAdapter 下例中采用了鼠标适配器: import java.awt.*; import java.awt.event.*; public class MouseClickHandler extends MouseAdaper{ public void mouseClicked(MouseEvent e) //只实现需要的方法 { ……} } java.awt.event包中定义的事件适配器类包括以下几个: 1.ComponentAdapter( 组件适配器) 2.ContainerAdapter( 容器适配器) 3.FocusAdapter( 焦点适配器) 4.KeyAdapter( 键盘适配器) 5.MouseAdapter( 鼠标适配器) 6.MouseMotionAdapter( 鼠标运动适配器) 7.WindowAdapter( 窗口适配器) 2. 用内部类实现事件处理 内部类(inner class)是被定义于另一个类中的类,使用内部类的主要原因是由于: 一个内部类的对象可访问外部类的成员方法和变量,包括私有的成员。 实现事件监听器时,采用内部类、匿名类编程非常容易实现其功能。 编写事件驱动程序,内部类很方便。 因此内部类所能够应用的地方往往是在AWT的事件处理机制中。 3.匿名类(Anonymous Class) 当一个内部类的类声名只是在创建此类对象时用了一次,而且要产生的新类需继承于一个已有的父类或实现一个接口,才能考虑用匿名类,由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用一个无参的父类的构造方法,并且重写父类的方法。所谓的匿名就是该类连名字都没有,只是显示地调用一个无参的父类的构造方法。
|
|
|
文章录入:杜斌 责任编辑:杜斌 |
|
上一篇文章: 二级Java考试辅导教程:5.1用AWT生成图形化用户界面[2] 下一篇文章: 二级Java考试辅导教程:5.3AWT组件库[1] |
【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
|