文档

Java™ 教程
隐藏目录
如何编写属性更改监听器
路径: 使用Swing创建GUI
课程: 编写事件监听器
章节: 实现常见事件的监听器

如何编写属性更改监听器

每当一个绑定属性的值对于一个符合JavaBeans™规范的bean(即一个组件)发生变化时,就会触发属性更改事件。你可以从Java教程的JavaBeansJavaBeans部分了解更多关于beans的信息。所有的Swing组件也都是beans。

JavaBeans属性通过其getset方法来访问。例如,JComponent具有属性font,可以通过getFontsetFont方法来访问。

除了getset方法之外,当绑定属性的值发生变化时,会触发属性更改事件。更多信息,请参见JavaBeans教程中的Bound Properties页面。

常见需要属性更改监听器的一些场景包括:

虽然这些是一些常见使用属性更改监听器的场景,但你可以在符合JavaBeans规范的任何组件的绑定属性上注册一个属性更改监听器。

有两种方法可以注册属性更改监听器。第一种方法是使用addPropertyChangeListener(PropertyChangeListener)方法。当以这种方式注册监听器时,你将收到该对象的每个绑定属性的每个更改的通知。在propertyChange方法中,你可以使用PropertyChangeEventgetPropertyName方法获取已更改的属性的名称,如下代码片段所示:

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属性的值发生变化时才会收到通知。它不会在transferHandleropaqueborder或任何其他属性的值发生变化时收到通知。

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

//...初始化时的代码:
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();
            ...
        }
        ...//重新计算付款并更新字段...
    }
}

属性更改监听器API

注册属性更改监听器

方法 目的
addPropertyChangeListener(PropertyChangeListener) 向监听器列表中添加一个属性更改监听器。
addPropertyChangeListener(String, PropertyChangeListener) 为特定属性添加一个属性更改监听器。只有当指定的属性发生变化时,才会调用该监听器。

PropertyChangeListener接口

因为PropertyChangeListener只有一个方法,所以它没有相应的适配器类。

方法 用途
propertyChange(PropertyChangeEvent) 当监听的bean更改绑定属性时调用。

PropertyChangeEvent类

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

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

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

示例 描述位置 备注
FormattedTextFieldDemo 如何使用格式化文本字段 在多个格式化文本字段上注册了一个属性更改监听器,以跟踪value属性的变化。
DialogDemo 如何创建对话框 CustomDialog类在选项面板上注册了一个属性更改监听器,以监听valueinputValue属性的变化。
FileChooserDemo2 如何使用文件选择器 ImagePreview类在文件选择器上注册了一个属性更改监听器,以监听directoryChangedselectedFileChanged属性的变化。
TrackFocusDemo 如何使用焦点子系统 在键盘焦点管理器上注册了一个属性更改监听器,以跟踪focusOwner属性的变化。

上一页: 如何编写鼠标滚轮监听器
下一页: 如何编写表格模型监听器