如何编写属性更改侦听器

每当“绑定”属性的值更改为* bean *(符合 JavaBeans™规范的组件)时,就会发生属性更改事件。您可以从 Java 教程的JavaBeans线索中找到有关 bean 的更多信息。所有的 Swing 组件也是 bean。

JavaBeans 属性通过其* get set 方法访问。例如,JComponent具有 font *属性,可通过getFontsetFont方法访问。

除了* get set *方法外,绑定属性在其值更改时还会触发一个属性更改事件。有关更多信息,请参见 JavaBeans 跟踪中的Bound Properties页面。

通常需要属性更改侦听器的一些方案包括:

  • 您已经实现了格式化的文本字段,并且需要一种检测用户何时 Importing 新值的方法。您可以在带格式的文本字段上注册属性更改侦听器,以侦听* value *属性上的更改。有关此示例,请参见如何使用格式化的文本字段中的FormattedTextFieldDemo

  • 您已经实现了对话框,并且需要知道用户何时单击对话框的按钮之一或更改对话框中的选择。有关在选项窗格上注册属性更改侦听器以监听对* value 属性的更改的示例,请参见如何制作对话框中的DialogDemo。您还可以在如何使用文件 selectors中检出FileChooserDemo2,以获取有关如何注册属性更改侦听器以侦听 directoryChanged selectedFileChanged *属性更改的示例。

  • 当具有焦点的组件发生更改时,需要通知您。您可以在键盘焦点 管理 器上注册属性更改侦听器,以侦听对* focusOwner *属性的更改。有关此示例,请参见如何使用 Focus 子系统中的TrackFocusDemoDragPictureDemo

尽管这些是属性更改侦听器的一些更常用的用法,但是您可以在符合 JavaBeans 规范的任何组件的绑定属性上注册属性更改侦听器。

您可以通过两种方式注册属性更改侦听器。第一种使用方法addPropertyChangeListener(PropertyChangeListener)。以这种方式注册侦听器时,系统会通知您该对象的每个绑定属性的每次更改。在propertyChange方法中,您可以使用PropertyChangeEvent getPropertyName方法获取已更改的属性的名称,如以下代码片段所示:

KeyboardFocusManager focusManager =
   KeyboardFocusManager.getCurrentKeyboardFocusManager();
focusManager.addPropertyChangeListener(new FocusManagerListener());
...
public FocusManagerListener implements PropertyChangeListener {
    public void propertyChange(PropertyChangeEvent e) {
        String propertyName = e.getPropertyName();
        if ("focusOwner".equals(propertyName) {
            ...
        } else if ("focusedWindow".equals(propertyName) {
            ...
        }
    }
    ...
}

注册属性更改侦听器的第二种方法是使用addPropertyChangeListener(String, PropertyChangeListener)String参数是属性的名称。使用此方法意味着仅当该特定属性发生更改时,您才会收到通知。因此,例如,如果您像这样注册了属性更改侦听器:

aComponent.addPropertyChangeListener("font",
                                     new FontListener());

FontListener仅在组件的* font 属性值更改时收到通知。当 transferHandler opaque border 或任何其他属性的值更改时,它不会不会*接收通知。

下面的示例演示如何使用两个参数的addPropertyChangeListener在格式化文本字段的* value *属性上注册属性更改侦听器:

//...where initialization occurs:
double amount;
JFormattedTextField amountField;
...
amountField.addPropertyChangeListener("value",
                                      new FormattedTextFieldListener());
...
class FormattedTextFieldListener implements PropertyChangeListener {
    public void propertyChanged(PropertyChangeEvent e) {
        Object source = e.getSource();
        if (source == amountField) {
            amount = ((Number)amountField.getValue()).doubleValue();
            ...
        }
        ...//re-compute payment and update field...
    }
}

属性更改侦听器 API

注册 PropertyChangeListener

MethodPurpose
addPropertyChangeListener(PropertyChangeListener)将属性更改侦听器添加到侦听器列表。
addPropertyChangeListener(String, PropertyChangeListener)为特定属性添加属性更改侦听器。仅当对指定属性进行更改时,才调用侦听器。

PropertyChangeListener interface

因为PropertyChangeListener只有一种方法,所以没有相应的适配器类.

MethodPurpose
propertyChange(PropertyChangeEvent)在被侦听的 Bean 更改绑定属性时调用。

PropertyChangeEvent 类

MethodPurpose
Object getNewValue()

Object getOldValue()
分别返回属性的新值或旧值。
String getPropertyName()返回已更改的属性的名称。
void setPropagationId()获取或设置传播 ID 值。保留以备将来使用。

使用属性更改侦听器的示例

下表列出了使用属性更改侦听器的示例。

ExampleWhere DescribedNotes
FormattedTextFieldDemo如何使用格式化的文本字段属性更改侦听器在几个格式化的文本字段上注册,以跟踪对* value *属性的更改。
DialogDemo如何制作对话框CustomDialog类在选项窗格上注册属性更改侦听器,以侦听* value inputValue *属性。
FileChooserDemo2如何使用文件 selectorsImagePreview类在文件 selectors 上注册了一个属性更改侦听器,以侦听* directoryChanged selectedFileChanged *属性。
TrackFocusDemo如何使用 Focus 子系统在键盘焦点 管理 器上注册了一个属性更改侦听器,以跟踪对* focusOwner *属性的更改。