Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言功能的摘要,请参阅Java语言变化。
有关所有JDK版本的新功能、增强功能以及已删除或不推荐使用选项的信息,请参阅JDK发行说明。
每当一个绑定属性的值对于一个符合JavaBeans™规范的bean(即一个组件)发生变化时,就会触发属性更改事件。你可以从Java教程的JavaBeansJavaBeans部分了解更多关于beans的信息。所有的Swing组件也都是beans。
JavaBeans属性通过其get和set方法来访问。例如,JComponent
具有属性font,可以通过getFont
和setFont
方法来访问。
除了get和set方法之外,当绑定属性的值发生变化时,会触发属性更改事件。更多信息,请参见JavaBeans教程中的Bound Properties页面。
常见需要属性更改监听器的一些场景包括:
FormattedTextFieldDemo
示例中可以看到这个用法。DialogDemo
示例中可以看到在选项面板上注册属性更改监听器来监听value属性的变化。此外,你还可以在如何使用文件选择器中的FileChooserDemo2
示例中了解如何注册属性更改监听器来监听directoryChanged和selectedFileChanged属性的变化。TrackFocusDemo
和DragPictureDemo
示例中可以看到这个用法。虽然这些是一些常见使用属性更改监听器的场景,但你可以在符合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属性上注册属性更改监听器:
//...初始化时的代码: 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(); ... } ...//重新计算付款并更新字段... } }
方法 | 目的 |
---|---|
addPropertyChangeListener(PropertyChangeListener) | 向监听器列表中添加一个属性更改监听器。 |
addPropertyChangeListener(String, PropertyChangeListener) | 为特定属性添加一个属性更改监听器。只有当指定的属性发生变化时,才会调用该监听器。 |
因为PropertyChangeListener只有一个方法,所以它没有相应的适配器类。
方法 | 用途 |
---|---|
propertyChange(PropertyChangeEvent) | 当监听的bean更改绑定属性时调用。 |
方法 | 用途 |
---|---|
Object getNewValue() Object getOldValue() |
分别返回属性的新值或旧值。 |
String getPropertyName() | 返回已更改的属性的名称。 |
void setPropagationId() | 获取或设置传播ID值。保留以供将来使用。 |
下表列出了使用属性更改监听器的示例。
示例 | 描述位置 | 备注 |
---|---|---|
FormattedTextFieldDemo |
如何使用格式化文本字段 | 在多个格式化文本字段上注册了一个属性更改监听器,以跟踪value属性的变化。 |
DialogDemo |
如何创建对话框 | CustomDialog 类在选项面板上注册了一个属性更改监听器,以监听value和inputValue属性的变化。 |
FileChooserDemo2 |
如何使用文件选择器 | ImagePreview 类在文件选择器上注册了一个属性更改监听器,以监听directoryChanged和selectedFileChanged属性的变化。 |
TrackFocusDemo |
如何使用焦点子系统 | 在键盘焦点管理器上注册了一个属性更改监听器,以跟踪focusOwner属性的变化。 |