Bootstrap

Java Beans 介绍

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

绑定属性

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

  1. bean类包含addPropertyChangeListener()和removePropertyChangeListener()方法用于管理bean的监听器。
  2. 当绑定的属性发生更改时,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的方法。

;