Java中事件的应用

ZDNet软件频道 时间:2002-04-11 作者:ZDNET CHINA 特稿 |  我要评论()
本文关键词:EVENT JAVA
Events是Java整体平台的一部分,本文中,我把一些概念放在Event应用和处理方法之后来解释,同时,还要讨论一些常用技术来简化events的处理过程。

JAVA中基本API函数就象Windows工具箱一样很多时候都要依赖EVENT实现某些功能,更不用说JAVA Media Framework (JMF), JAVA Platform Debugger Architecture (JPDA), 和 JavaBeans了。EVENTs是JAVA整体平台的一部分,本文中,我把一些概念放在EVENT应用和处理方法之后来解释,同时,还要讨论一些常用技术来简化EVENTs的处理过程。

术语:

事件:由用户创建、需要程序做出响应的行为——比如,按钮、鼠标动作

EVENTs编程

EVENTs并不排斥JAVA平台,在JAVA之前就有了EVENTs,而且尤为受Windows和X Windows系统图形用户界面的欢迎。这些图形化系统都是用户用EVENTs创建的。相反,传统的编程模型中,程序流程是由具体应用来决定的,具体的流程已经由给定的状态和条件预先设定好了(图A)。

图 A

传统程序流程

这种应用类型的例子就是指令应用,一旦应用被调用,它就会按照给定的指令、逻辑代码和外部独立参数来实现它的功能。

EVENTs并不同于传统的程序步骤,因为它是在程序指令之外发挥作用。当EVENT被触发的时候,就会告知具体的应用程序,然后执行某些代码(图B),通常这一过程要涉及到调用预先设定好的程序或函数,并给它们足够的信息以保证程序能够按正常的逻辑关系运行。

图 B

EVENT程序流程

EVENT在某些时候不按预先设定好的顺序发挥作用,这样就需要不同的程序模型,在这个模型中,应用程序就要受EVENT的控制,由EVENT来决定实现什么功能以及什么时候运行。同时,应用程序还要预先编码,这样才能不完全依赖于EVENTs的顺序。

这个编程模型定义了EVENT-driven应用,象图形用户界面(GUI)的交互应用,它仅仅对用户的行为(EVENT)做出反应,而且这些行为要依仗具体的EVENT,另外,用户还可以在任何时候,按任何顺序点击按钮、选择选项以及输入信息。基本上来说,EVENTs是很随便的——可以按照用户的意图来决定。

EVENTs和JAVA

JAVA中,EVENTs是由Objects生成的,一个EVENT由带有EVENT信息的JAVA.util.EVENTObject子集来表示,每一种EVENT都有很多子集。至少,它们都带有生成此EVENT的Object的一些信息,但是每一个子集都定义了EVENT的一些额外信息。

比如,点击JAVAx.swing.JButton,这个object就会生成JAVA.awt.EVENT.ActionEVENT,同时还生成了JAVA.awt.EVENT.ActionEVENT类,把关于EVENT的一些信息包括它本身的一些参考信息总结在一起,就会发现EVENT的很有意思的部分。

EVENT公告

公告是调用object并把EVENT作为参数传给它,也就是所谓的EVENT handlers,如果一个object被给定了EVENT,那么它就必须要运行一个界面并且对EVENT进行注册,称这些Objects为EVENT listeners。

Object执行哪个界面要视EVENT而定,每种EVENT都有特定的界面,叫做EVENT listeners界面的子界面。每种界面都定义了一个方法,而且每个方法都把EVENT Object作为一个参数

注意对于一个界面定义多种方法是很正常的,而且多个EVENTs也通常用一个类来表示。比如,键锁定和键释放都会生成EVENT,但是这两个动作都可以用同一个类JAVA.awt.EVENT.KeyEVENT来表示。尽管EVENT Object经常要确定哪种EVENT生成,但是如果不同的方法表示不同的EVENT,那么实现起来还是很简单的。

所以,用JAVA.awt.EVENT.KeyEVENT EVENTs(JAVA.awt.EVENT.KeyEVENT)的相关界面可以定义key presses方法keyPressed,并且可以定义另一种key releases方法keyReleased

一旦Object执行了正确的界面,它就必须注册为相关EVENT的Listener,生成EVENTs的每个类都能提供增加和删除listener的方法,许多listeners都可以用假设的源来注册,当一个EVENT过期的时候,其他EVENT都可以轮流调用。

处理EVENTs

如果想看看EVENT Listener是如何实现的,可以看看列表A(Listing A)中的例子,它包含了扩展类JAVAx.swing.Jdialog,同时还生成了带两个按钮Ok和Cancel的对话框,注意,类也可以实现JAVA.awt.EVENT.ActionListener界面。

EVENTs由两个按钮生成,因此actionPerformed法证明了调用何种方法要依靠按哪一个按钮来决定。与此类似,其他控制也要运行相关界面和相同逻辑来处理。

匿名类

我们已经看到了什么是实现EVENT的最传统、有效的方式,但有时候它也会带来麻烦——特别是当你需要处理很多控键时,实现额外的界面和测试证明确实存在问题。对这一问题,程序员就需要找另外的方法来解决,最常用的方法就是用匿名类,见表B (Listing B).

尽管这一方法简便易行,但是除了一些简单情况之外,我们并不推荐这一方法,因为这样每个EVENT又要生成一个新的类。如果每一个应用都有一个复杂的界面,那么这些小的匿名类数量就会成倍增长,这样,由于大量的类占用了很大的磁盘空间,就会降低用户的运行速度。当采用这些类生成Windows和对话框时,用户就要经过一段时间延迟。

映射

另一种处理EVENTs的常用方法就是使用映射API来写一般类。表C(Listing C)就是这样一个例子,表D(Listing D)是表A中更改后的一些代码。

这一方法与匿名类具有同样的优点,但它却没有匿名类那样的麻烦。处理其他类型EVENT的新类采用同样的方法很容易生成。

结论

    EVENT编程并不与JAVA相排斥,它是这个平台很重要的组成部分。它提供了开发灵活应用的方法,同时用户可以自主决定程序流程,JAVA中实现EVENT也是直截了当的。但是知道在什么情况下使用什么方法是非常重要的。本文中我们共谈到了3中方法:为Object分配EVENT,匿名类以及映射法写一般类。

责任编辑:超凡

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134