文档

Java™ 教程-Java Tutorials 中文版
属性
Trail: JavaBeans(TM)
Lesson: Writing JavaBeans Components

属性

要在 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 (索引) 属性是数组而不是单个值。在这种情况下,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 (绑定) 属性在其值发生更改时通知监听器。这有两个含义:

  1. bean 类包括用于管理 bean 的监听器的 addPropertyChangeListener()removePropertyChangeListener() 方法。
  2. 当绑定属性发生更改时,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 (约束) 属性是一种特殊的绑定属性。对于约束属性,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);
    }
}

NetBeans 中的开发支持

用于创建 bean 属性的编码模式很简单,但有时很难判断你是否正确地使用了所有内容。NetBeans 支持属性模式,因此你可以在编写代码时立即看到结果。

要利用此功能,请查看 Navigator 窗格,该窗格通常位于 NetBeans 窗口的左下角。通常,此窗格处于 Members View 模式,该模式显示当前类中定义的所有方法和字段。

单击组合框以切换到 Bean Patterns 视图。你将看到 NetBeans 可以从方法定义推断出的属性列表。NetBeans 在你键入时更新此列表,使其成为检查你的工作的便捷方式。

在以下示例中,NetBeans 已找到读写 mouthWidth 属性和读写索引 testGrades 属性。此外,NetBeans 已经认识到 FaceBean 允许注册 PropertyChangeListenerVetoableChangeListener

NetBeans bean 模式 Navigator

Previous page: Writing JavaBeans Components
Next page: Methods