|
事件监听器 将JavaBeans接通起来的方法(1)
摘要JavaBeans通过事件(封装着与所发生情况有关的数据的对象)与其它软件组件进行通讯。本文将向你展示如何利用Java的新的事件框架把Beans接通起来,以生成新的Beans或构造完整的应用程序。在阐述这个问题的过程中,我们将会涉及到一些Java语言的新特性。
通过适当配置,JavaBeans能够去"监听"其它软件对象。而且正如你将要看到的一样,一个Java1。1类(包括任何一个JavaBeans)一旦成为一个事件监听者,就不仅仅只能够监听其父类,而且能够监听所有产生事件的类。事件监听者的思想正是Java类(和其它JavaBeans)如何处理事件的关键。
我先来介绍两个图标,它们将帮助我们识别一些关键问题。
JavaBeans是一个重要概念
Cuppajoe图标表示对于Java语言来说新的或重要的思想
什么是事件
软件事件是一段说明某事已经发生的数据。用户移动鼠标,或从网上传来数据报,或传感器监测到某人非正常介入,所有这些发生的情况,都可以被看成是事件的实例,而有关这些情况的信息可以包括在事件之中。通常情况下,根据事件处理来开发软件系统是较为方便的:在此情况下,程序设计变成一种对"当此发生时,做彼"式的叙述进行加工处理的过程。如果鼠标已被移动,则随之移动屏幕上的光标;如果网上传来数据报,则读之;如果发现有人侵入,则驱逐之。
通常而言,一个事件包括以下信息:事件源(产生事件或最初接收到事件的对象),事件的发生时刻,和一些事件接收者可能用到的说明什么情况发生,如何去做的子类的具体信息。例如,在Windows系统中,就应当有一个关于点击鼠标的事件子类。点击鼠标事件将包括点击鼠标时的时刻;也可能包括当点击发生时,鼠标在屏幕上的位置,SHIFT键和ALT键的状态,是点击了鼠标左键还是右键等等诸如此类的信息。处理事件的编码,不可思议地被称为"事件处理者"(eventhandler).
那么,所有这些与JavaBeans有何关系呢?事件是Beans相互通讯的主要方式。这点我们在下面将会看到。如果你正确地选择了事件和它们的连接,你就可能在你的应用系统中将Beans相互接通,让每一个Beans按照你的意愿去响应与其相关的事件。每一个Beans将各负其责,对新来的事件进行适当地响应,并且当新的情况出现的时候,向相关的邻居Beans发送新的事件。一旦你知道如何利用事件,你就能够写出通过事件和其他组件进行通讯的Beans。更进一步地讲,外部系统,例如集成开发环境(IDEs)能够自动地检测你的Beans所用的事件,并能让你以图解的方式来互连Beans。IDEs同样也能向JavaBeans发送事件和从JavaBeans接收事件,本质上讲,可以从外部来控制JavaBeans。
为了了解事件怎样和Beans一起工作,你就必须了解他们在Java中是如何工作的。而事件工作的方式各不相同,JDK1。1则是标准的。
JDK1。0的事件机制有何问题?
在JDK1。0中,事件主要被用在抽象视窗工具包(AWT)中,当在用户接口上出现某种情况时,它将通知相应的类。程序员应用继承机制,通过创建某个类的能够接收相应的事件类型的子类对象和重载父类的事件处理过程,来进行事件处理。
例如,在Java1.0版中,能够获得某个行为事件(action event)的唯一途径,就是把它从某个知道如何处理此行为事件的类中继承下来。
public class MyButton extends java.awt.Button
{
//重载action()方法以处理行为事件
public boolean action(Event evt, Object what)
{
//此处,做一些行为事件所做的事
}
}
这意味着,只有从java。awt。button中继承下来的类才能够响应点击鼠标事件。这种组织结构与用户接口捆绑在一起,不够灵活方便。它不便于构造新的事件类型。而且即便你能够构造新的事件,你也很难改变那些将被类响应的事件,因为有关的信息都被僵硬地固化在AWT的"族系树"(继承图)中。
新的JDK1。1拥有一个更为普适的事件框架,它能够让产生事件的类和其它不产生事件的类互相通讯。新的模式放弃了定义客户子类必须重载的事件处理函数(方法)的工作方式,转而采用定义接口的方式。如果一个类需要接收某一特定的消息类型,则这个类可以使用所定义的接口。(你可能会明白,这意味着通过"授权"(delegation),而不是通过"继承"(inheritance)来处理事件)。我们将还以JDK1。0button例子来说明JDK1。1的模式。
我在此想要做的事是,构造一个新的类,使它能够在按钮被按下时,去做某件事情。在JDK1。0版中,为了处理与按钮(Button)行为相关的事件,我必须继承java。awt。Button,这样,一旦某个按钮被按下时,该按钮将会让我的新类知道。
//...在程序的另一个地方,我们定义了"监听"按钮行为的对象
ActionListener myActionListener = new ActionListener();
//...
//按钮行为事件
public class MyButton extends java.awt.Button
{
//重载action()以通知我的新类
public boolean action(Event evt, Object object)
{
myActionListener.action(evt, object);
}
}
现在, 每当MyButton 被按下时,myActionListener 对象都会收到一个事件。myActionListener 并非一定要是java。awt。Component的一个子?br />
[1] [2] [3] 下一页
|