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属性的变化。 |