Properties

要在 bean 类中定义属性,请提供公共 getter 和 setter 方法。例如,以下方法定义了一个名为mouthWidthint属性:

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 方法。

boolean属性的特殊情况允许使用is而不是get定义访问器方法。例如,boolean属性running的访问器可以如下所示:

public boolean isRunning() {
    // ...
}

在以下各节中提供了基本属性的各种专门知识,并在其中进行了描述。

Indexed Properties

索引属性是一个数组,而不是单个值。在这种情况下,bean 类提供了一种获取和设置整个数组的方法。这是一个名为testGradesint[]属性的示例:

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;
}

Bound Properties

绑定属性的值更改时,它会通知侦听器。这有两个含义:

  • Bean 类包括用于 管理Bean 侦听器的addPropertyChangeListener()removePropertyChangeListener()方法。

  • 更改绑定属性后,bean 将PropertyChangeEvent发送到其已注册的侦听器。

PropertyChangeEventPropertyChangeListener位于java.beans包中。

java.beans包还包括一个类PropertyChangeSupport,该类负责绑定属性的大部分工作。这个方便的类跟踪属性侦听器,并包括一个方便的方法,可将属性更改事件触发到所有已注册的侦听器。

下面的示例说明如何使用PropertyChangeSupportmouthWidth属性设置为绑定属性。绑定属性的必要附加内容以粗体显示。

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 使您无需编写任何代码即可执行此操作。

Constrained Properties

约束属性是一种特殊的绑定属性。对于受约束的属性,Bean 会跟踪一组否决侦听器。当受约束的属性即将更改时,将向侦听器咨询有关更改的信息。任何一位 Listener 都有机会否决更改,在这种情况下,该属性保持不变。

否决侦听器与属性更改侦听器是分开的。幸运的是,java.beans包包括VetoableChangeSupport类,该类大大简化了受约束的属性。

mouthWidth示例的更改以粗体显示:

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);
    }
}

NetBeans 中的开发支持

用于创建 bean 属性的编码 Pattern 很简单,但是有时很难确定您是否正确。 NetBeans 支持属性 Pattern,因此您在编写代码时可以立即看到结果。

要利用此功能,请查看“导航器”窗格,该窗格通常位于 NetBeans 窗口的左下角。通常,此窗格处于“成员视图”Pattern,该 Pattern 显示当前类中定义的所有方法和字段。

单击组合框以切换到“beanPattern”视图。您将看到 NetBeans 可以从您的方法定义中推断出的属性的列表。 NetBeans 会在您键入时更新此列表,从而使您可以方便地检查工作。

在下面的示例中,NetBeans 找到了可读写的mouthWidth属性和可索引索引的testGrades属性。另外,NetBeans 已经认识到FaceBean允许同时注册PropertyChangeListenerVetoableChangeListener

NetBeans BeanPattern 导航器