文档

Java™ 教程
隐藏目录
属性
路径: JavaBeans(TM)
课程: 编写JavaBeans组件

属性

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

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

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

基本属性的各种特殊化可在下面的章节中找到并描述。

索引属性

一个索引属性是一个数组,而不是单个值。在这种情况下,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;
}

绑定属性

绑定属性在其值发生变化时通知侦听器。这有两个影响:

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

绑定属性可以直接与其他bean属性绑定,使用像NetBeans这样的构建工具。例如,您可以将滑块组件的value属性绑定到示例中显示的mouthWidth属性。NetBeans允许您在不编写任何代码的情况下完成此操作。

约束属性

约束属性是一种特殊类型的绑定属性。对于约束属性,bean会跟踪一组否决监听器。当约束属性即将更改时,监听器会就更改进行咨询。任何一个监听器都有机会否决更改,如果被否决,则属性保持不变。

否决监听器与属性更改监听器是分开的。幸运的是,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提供了对属性模式的支持,这样你在编写代码时可以立即看到结果。

要使用此功能,请查看NetBeans窗口左下角的导航器面板。通常,此面板处于成员视图模式,显示当前类中定义的所有方法和字段。

单击组合框切换到Bean模式视图。您将看到一个列表,其中列出了NetBeans可以根据您的方法定义推断出的属性。NetBeans在您键入时会更新此列表,这是一个方便的检查工具。

在下面的示例中,NetBeans找到了可读写的mouthWidth属性和可读写的索引testGrades属性。此外,NetBeans还识别出FaceBean允许注册PropertyChangeListenerVetoableChangeListener

NetBeans bean patterns Navigator

上一页:编写 JavaBeans 组件
下一页:方法