服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

事件监听器 将javabeans接通起来的方法(2)


  事件监听器 将javabeans接通起来的方法(2)

所有这些与beans有何关系?
javabeans主要利用事件监听器接口进行通讯

事件监听器为对象提供了一种普适的不经过继承关系而进行通讯的方法。正因为如此,他们对于组件技术来说,是一种非常好的通讯机制,从某种角度来讲,它们即是javabeans。虽然上面看到的事件监听器全都出现在awt中,但他们的应用不仅仅限于用户接口。他们可以被应用于各式各样的事件:属性的变更,传感器的阅读,时钟事件,文件系统行为,对象命名等。

现在开始“beany”部分

#你能够为它们定义你自己的事件类型和事件监听器。

#如果你的新事件类型被称为eventtype,那么通过实现下面两个方法,你的beans就能成为你的新事件类型的源。


o addeventtypelistener(eventobject e)
o removeeventtypelistener(eventobject e)

#那么通过实现接口eventlistener,其它beans能够成为事件的目标。

#最后,你可以通过调用sourcebean。addeventtypelistener(targetbean)"接通"事件的源和事件目标。

创建和利用你自已的eventobject类型
让我们看一个创建eventobject类型的例子。这个例子是在上个月的一个例子,barchartbean的基础上进行"脑外科式"(brainsurgery)的改造而成的。我先在barchartbean中增加代码,以使得在bar区域内,用户每次点击或拖动鼠标时,都重先设置percent属性。这为我们提供了一个通过鼠标来改变percent属性的方法。

barchartbean通过预先定义的propertychangelistener接口(在java。beans包中定义的,通用的事件监听器接口),来通知其它对象它的percent属性变化情况。现在,我们通过定义一个新的事件类型,percentevent,为外部beans增加另一个方法,以使这些beans能够被通知到每一次percent的变化。



import java.util.*;

//
//该类封装每一次percent属性的变化,并将变化传递给"percentlistener".
//

public class percentevent extends java.util.eventobject
{
protected int iold_, inew_;

public percentevent(object source, int iold, int inew)
{
super(source);
iold_ = iold;
inew_ = inew;
}

public int getoldpercent() { return iold_; }

public int getpercent() { return inew_; }

public int getchangedby() { return inew_ - iold_; }
}

你是否还记得,在前面我们曾提到过在事件中封装类规范(class-specific)数据?妤了,在此,新的和旧的百分比值都规范于percentevent事件类。

现在,让我们为这一新的事件类型定义一个监听器接口。

import java.util.*;

//每一个想监听"percent"变化情况的类都
//应该实现这个接口

public interface percentlistener extends eventlistener
{
public void percentchanged(eventobject e);
}

接下来,我们要把barchartbean变成为一个percentevent的源。为达此目的,我们将在barchartbean中实现addpercentlistener()和removepercentlistener(),并且无论何时,当percent属性改变时,都能够去修改所有的监听器。(在此,我们只需看源代码中相关的部分)

//
// barchart bean现在接收输入
//
public class barchartbean extends canvas
implements serializable, propertychangelistener
{
// ...
// list of percent listeners.
private vector percentlisteners_;

// ... a whole lotta methods...

// set/get methods for percent
public void setpercent(int ipercent)
{
// set new percent, and only if necessary repaint()
// this is the only place that ipercent´s range is controlled
if (ipercent <= 100 && ipercent>= 0)
{
// save old value, set new value first
int prevpercent = ipercent_;
ipercent_ = ipercent;

// notify property listeners of change to "percent" property
pcs_.firepropertychange("percent",
new integer(prevpercent),
new integer(ipercent_));

// notify all listeners for "percent" change
notifypercentchanged(prevpercent, ipercent);

// repaint only if necessary.
if (prevpercent != ipercent_)
{
repaint();
}
}
}

// ...

//
// these methods are for handling "percentlisteners"
//

// add a new percent listener
public synchronized void addpercentlistener(percentlistener listener)
{
percentlisteners_.addelement(listener);
}

// remove a percent listener
public synchronized void removepercentlistener(percentlistener listener)
{
percentlisteners_.removeelement(listener);
}

// notify all listeners that "percent" changed
protected void notifypercentchanged(int oldpct, int newpct)
{
vector thislist = new vector();
percentevent thisevent = new percentevent(this, oldpct, newpct);

// make a copy of the list so potential changes to it by
// other threads won´t affect traversal.
synchronized (this)
{
thislist = (vector)percentlisteners_.clone();
}

// send a "percentevent" to every listener.
for (int elem = 0; elem

矢量percentlisteners_是一列当percent属性改变时,需要被通知的percentlisteners(实现了percentlistener接口的对象)清单。在源程序的更下方,以前的setpercent()方法调用firepropertychange(),而现在,它还调用notifypercentchanged()以通知在percentlisteners_清单中的所有对象。(在此,实际上,我们提供了两种通知percent变化的方法:(以前的)作为一个propertychange,和现在的作为一个percentevent。)

[1] [2] [3]