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,匿名类以及映射法写一般类。