Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
要在 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 方法。
boolean 属性的特殊情况允许使用 is 而不是 get 定义访问器方法。例如,boolean 属性 running 的访问器可能如下:
public boolean isRunning() {
    // ...
}
可以使用各种基本属性的特殊化,并在以下各节中进行介绍。
indexed (索引) 属性是数组而不是单个值。在这种情况下,bean 类提供了获取和设置整个数组的方法。以下是名为 testGrades 的 int[] 属性的示例:
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 (绑定) 属性在其值发生更改时通知监听器。这有两个含义:
addPropertyChangeListener() 和 removePropertyChangeListener() 方法。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 允许你在不编写任何代码的情况下执行此操作。
constrained (约束) 属性是一种特殊的绑定属性。对于约束属性,bean 会跟踪一组 veto 监听器。当约束属性即将更改时,将向监听器咨询有关更改的信息。任何一个监听器都有机会否决更改,在这种情况下,属性保持不变。
否决监听器与属性更改监听器是分开的。幸运的是,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);
    }
}
用于创建 bean 属性的编码模式很简单,但有时很难判断你是否正确地使用了所有内容。NetBeans 支持属性模式,因此你可以在编写代码时立即看到结果。
要利用此功能,请查看 Navigator 窗格,该窗格通常位于 NetBeans 窗口的左下角。通常,此窗格处于 Members View 模式,该模式显示当前类中定义的所有方法和字段。
单击组合框以切换到 Bean Patterns 视图。你将看到 NetBeans 可以从方法定义推断出的属性列表。NetBeans 在你键入时更新此列表,使其成为检查你的工作的便捷方式。
在以下示例中,NetBeans 已找到读写 mouthWidth 属性和读写索引 testGrades 属性。此外,NetBeans 已经认识到 FaceBean 允许注册 PropertyChangeListener 和 VetoableChangeListener。
