Java版本:8
写JavaBeans组件
编写JavaBeans组件非常简单。您不需要特殊的工具,也不需要实现任何接口。编写bean只是遵循某些编码约定的问题。您所要做的就是使您的类看起来像一个bean——使用bean的工具将能够识别和使用您的bean。
属性(Properties)
要在bean类中定义属性,需要提供公共的getter和setter方法。例如,以下方法定义了一个名为mouthWidth的int属性:
public class FaceBean {
private int mMouthWidth = 90;
public int getMouthWidth() {
return mMouthWidth;
}
public void setMouthWidth(int mw) {
mMouthWidth = mw;
}
}
像NetBeans这样的构建工具可以识别方法名,并在其属性列表中显示mouthWidth属性。它还识别类型int,并提供适当的编辑器,以便在设计时对属性进行操作。
这个例子展示了一个可读可写的属性。其他组合也是可能的。例如,只读属性有getter方法,但没有setter方法。只写属性只有setter方法。
布尔属性的一个特殊情况是允许使用is而不是get来定义访问器方法。例如,一个布尔属性running的访问器可以如下所示:
public boolean isRunning() {
// ...
}
基本属性的各种专门化将在以下部分中提供和描述。
索引属性
索引属性是一个数组,而不是单个值。在本例中,bean类提供了获取和设置整个数组的方法。下面是一个 int[ ] 属性的 testGrades的例子:
public int[] getTestGrades() {
return mTestGrades;
}
public void setTestGrades(int[] tg) {
mTestGrades = tg;
}
对于索引属性,bean类还提供了获取和设置数组特定元素的方法。
public int getTestGrades(int index) {
return mTestGrades[index];
}
public void setTestGrades(int index, int grade) {
mTestGrades[index] = grade;
}
绑定属性
绑定属性会在其值更改时通知侦听器,这有两个含义:
- bean类包含addPropertyChangeListener()和removePropertyChangeListener()方法用于管理bean的监听器。
- 当绑定的属性发生更改时,bean将向其注册的侦听器发送PropertyChangeEvent事件。
PropertyChangeEvent 和 PropertyChangeListener 在 java.beans 包中。
java.beans 包还包括一个 PropertyChangeSupport 类,它负责绑定属性的大部分工作。这个方便的类跟踪属性的监听器,并包含一个向所有注册的监听器触发属性更改事件的方便方法。
下面的示例展示了如何使用PropertyChangeSupport类将mouthWidth属性设置为绑定属性。
import java.beans.*;
public class FaceBean {
private int mMouthWidth = 90;
private PropertyChangeSupport mPcs = new PropertyChangeSupport(this);
public int getMouthWidth() {
return mMouthWidth;
}
public void setMouthWidth(int mw) {
int oldMouthWidth = mMouthWidth;
mMouthWidth = mw;
mPcs.firePropertyChange("mouthWidth", oldMouthWidth, mw);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
mPcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
mPcs.removePropertyChangeListener(listener);
}
}
绑定属性可以使用像NetBeans这样的构建工具直接绑定到其他bean属性。例如,您可以获取滑块组件的value属性,并将其绑定到示例中所示的mouthWidth属性。NetBeans允许您在不编写任何代码的情况下做到这一点。
约束属性
约束属性是一种特殊的绑定属性。对于受约束的属性,bean会跟踪一组否决侦听器。当受约束的属性将要被更改时,会向侦听器咨询。任何一个侦听器都有机会否决更改,在这种情况下,属性保持不变。
否决监听器与属性更改监听器是分开的。幸运的是,java.beans包包括了VetoableChangeSupport类,它极大地简化了受约束的属性。
import java.beans.*;
public class FaceBean {
private int mMouthWidth = 90;
private PropertyChangeSupport mPcs = new PropertyChangeSupport(this);
private VetoableChangeSupport mVcs = new VetoableChangeSupport(this);
public int getMouthWidth() {
return mMouthWidth;
}
public void
setMouthWidth(int mw) throws PropertyVetoException {
int oldMouthWidth = mMouthWidth;
mVcs.fireVetoableChange("mouthWidth", oldMouthWidth, mw);
mMouthWidth = mw;
mPcs.firePropertyChange("mouthWidth", oldMouthWidth, mw);
}
public void
addPropertyChangeListener(PropertyChangeListener listener) {
mPcs.addPropertyChangeListener(listener);
}
public void
removePropertyChangeListener(PropertyChangeListener listener) {
mPcs.removePropertyChangeListener(listener);
}
public void
addVetoableChangeListener(VetoableChangeListener listener) {
mVcs.addVetoableChangeListener(listener);
}
public void
removeVetoableChangeListener(VetoableChangeListener listener) {
mVcs.removeVetoableChangeListener(listener);
}
}
方法
一个bean的方法是它能够做的事情。不是定义属性的任何公共方法都是bean的方法。当您在一个像NetBeans这样的构建器工具中使用bean时,您可以将bean的方法作为应用程序的一部分使用。例如,您可以创造一个按钮通过鼠标点击它来调用bean的一个方法。
事件
一个bean类可以触发任何类型的事件,包括自定义事件。与属性一样,事件由方法名的特定模式标识。
public void add<Event>Listener(<Event>Listener a)
public void remove<Event>Listener(<Event>Listener a)
侦听器的类型必须是java.util.EventListener的子类。
例如,Swing JButton是一个当用户单击它时触发动作事件的bean。JButton包含以下方法(实际上继承自AbstractButton类),它们是bean的事件的标识:
public void addActionListener(ActionListener l);
public void removeActionListener(ActionListener l);
Bean事件由构建器工具识别,并可用于将组件连接在一起。例如,您可以连接按钮的操作事件来实现某些事情,比如调用另一个bean的方法。