# 如何编写变更监听器

> 原文： [https://docs.oracle.com/javase/tutorial/uiswing/events/changelistener.html](https://docs.oracle.com/javase/tutorial/uiswing/events/changelistener.html)

更改侦听器类似于[属性更改侦听器](propertychangelistener.html)。更改侦听器在对象上注册 - 通常是组件，但它可以是另一个对象，如模型 - 并且在对象更改时通知侦听器。与属性更改侦听器的最大区别在于，更改侦听器未通知已更改的内容，而只是源对象 _ 已更改 _。因此，当只需要知道对象何时以任何方式发生变化时，更改侦听器最有用。

几个 Swing 组件（包括 [JTabbedPane](../components/tabbedpane.html) ，JViewPort）依赖于基本功能的更改事件 - 滑块，颜色选择器和微调器。要了解[滑块](../components/slider.html)中的值何时更改，您需要注册更改侦听器。同样，您需要在[颜色选择器](../components/colorchooser.html)上注册更改侦听器，以便在用户选择新颜色时通知您。您在[微调器](../components/spinner.html)上注册更改侦听器，以便在微调器的值更改时得到通知。

以下是滑块的更改事件处理代码示例：

```
//...where initialization occurs:
framesPerSecond.addChangeListener(new SliderListener());
...
class SliderListener implements ChangeListener {
    public void stateChanged(ChangeEvent e) {
        JSlider source = (JSlider)e.getSource();
        if (!source.getValueIsAdjusting()) {
            int fps = (int)source.getValue();
            ...
        }    
    }
}

```

您可以在[使用 Swing 组件](../examples/components/index.html#SliderDemo)的示例索引中找到`SliderDemo`的源文件。

_ 因为`ChangeListener`只有一个方法，所以它没有相应的适配器类。_

| 方法 | 目的 |
| :-- | :-- |
| [stateChanged（ChangeEvent）](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/ChangeListener.html#stateChanged-javax.swing.event.ChangeEvent-) | 当被监听组件改变状态时调用。 |

| 方法 | 目的 |
| :-- | :-- |
| [对象 getSource（）](https://docs.oracle.com/javase/8/docs/api/java/util/EventObject.html#getSource--)
（`java.util.EventObject` 中的 _）_ | 返回触发事件的对象。 |

## 使用 Change Listeners 的示例

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

| 例 | 在哪里描述 | 笔记 |
| :-- | :-- | :-- |
| [`SliderDemo`](../examples/components/index.html#SliderDemo) 和
[`SliderDemo2`](../examples/components/index.html#SliderDemo2) | [如何使用滑块](../components/slider.html) | 在控制动画速度的滑块上注册更改侦听器。更改侦听器忽略更改事件，直到用户释放滑块。 |
| [`ColorChooserDemo`](../examples/components/index.html#ColorChooserDemo) 和
[`ColorChooserDemo2`](../examples/components/index.html#ColorChooserDemo2) | [如何使用颜色选择器](../components/colorchooser.html  ) | 在颜色选择器的选择模型上使用更改侦听器，以了解用户何时更改当前颜色。 |
| [`SpinnerDemo3`](../examples/components/index.html#SpinnerDemo3) | [在](../components/spinner.html#change)[中检测微调值变化](../components/spinner.html)如何使用微调器。 | 在日期字段微调器上使用更改侦听器，以在微调器的日期更改时更改文本的颜色。 |
| [`SpinnerDemo4`](../examples/components/index.html#SpinnerDemo4) | [在](../components/spinner.html#change)[中检测微调值变化](../components/spinner.html)如何使用微调器。 | 当微调器的值发生变化时，使用微调器上的更改侦听器循环显示灰度。 |
| [`ConverterRangeModel`](../examples/components/ConverterProject/src/components/ConverterRangeModel.java)
及其亚类，
[`FollowerRangeModel`](../examples/components/ConverterProject/src/components/FollowerRangeModel.java) | [如何使用型号](../components/model.html) | 为 [`Converter`](../examples/components/index.html#Converter) 演示中使用的滑块实现自定义模型。两种模型都在必要时明确触发更改事件。 |