# 如何使用旋转器

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

旋转器类似于[组合框](combobox.html)和[列出](list.html)，因为它们允许用户从一系列值中进行选择。与可编辑的组合框一样，微调器允许用户键入值。与组合框不同，微调器没有可以覆盖其他组件的下拉列表。因为微调器不显示可能的值 - 只有当前值可见 - 当可能值的集合非常大时，通常使用它们而不是组合框或列表。但是，只有在可能的值及其顺序明显时才应使用微调器。

微调器是具有三个子组件的复合组件：两个小按钮和一个 _ 编辑器 _。编辑器可以是任何`JComponent`，但默认情况下它是作为包含[格式的文本字段](formattedtextfield.html)的面板实现的。微调器的可能值和当前值由其 _ 模型 _ 管理。

这是一个名为`SpinnerDemo`的应用程序的图片，其中有三个用于指定日期的微调器：

<center>![SpinnerDemo shows 3 kinds of spinners](img/ecd4f967f5d41b9703a520eeed91bafd.jpg)</center>

主类的代码可以在 [`SpinnerDemo.java`](../examples/components/SpinnerDemoProject/src/components/SpinnerDemo.java) 中找到。 Month 微调器显示用户区域设置中第一个月的名称。使用字符串数组指定此微调器的可能值。 Year 微调器显示一个整数范围的值，初始化为当前年份。另一个日期微调器以自定义格式显示`Date`对象范围内的一个值（最初是当前日期），仅显示一个月和一年。

* * *

**Try this:** 

1.  单击“启动”按钮以使用 [Java™Web Start](http://www.oracle.com/technetwork/java/javase/javawebstart/index.html) （[下载 JDK 7 或更高版本](http://www.oracle.com/technetwork/java/javase/downloads/index.html)）运行 SpinnerDemo。或者，要自己编译并运行示例，请参考[示例索引](../examples/components/index.html#SpinnerDemo)。 [![Launches the SpinnerDemo Application](img/4707a69a17729d71c56b2bdbbb4cc61c.jpg)](https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/SpinnerDemoProject/SpinnerDemo.jnlp) 

2.  使用 Month 微调器，使用箭头按钮或键可以向前和向后循环显示可能的值。
    请注意，最低值是一年中的第一个月（例如，1 月），最高值是最后一个月（例如，12 月）。确切的值取决于您的区域设置。另请注意，值不会循环 - 您不能使用向上箭头按钮或键从 12 月直接到 1 月 - 因为标准微调器模型不支持循环。
3.  为您的语言环境键入有效的月份名称 - 例如，7 月。
    请注意，微调器自动完成月份名称。
4.  转到 Year 微调器，尝试键入超过 100 年前的一年 - 例如，1800 - 然后单击另一个微调器或按 Tab 键将焦点移出微调器。
    因为该程序将微调器的模型限制在当年 100 年内的数字，1800 无效。当焦点移出微调器时，显示的文本将变回最后一个有效值。
5.  移动到另一个日期微调器，使用箭头按钮或键更改日期。
    请注意，默认情况下，日期的第一部分 - 在本例中为月份编号 - 会发生变化。您可以通过单击鼠标或使用箭头键移动到日期的另一部分来更改日期的哪个部分更改。

* * *

要创建微调器，首先创建其模型，然后将模型传递给 [JSpinner](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.html) 构造函数。例如：

```
String[] monthStrings = getMonthStrings(); //get month names
SpinnerListModel monthModel = new SpinnerListModel(monthStrings);
JSpinner spinner = new JSpinner(monthModel);

```

本节的其余部分包括以下主题：

*   [使用标准微调器模型和编辑器](#standard)
*   [指定微调器格式](#format)
*   [创建自定义微调器模型和编辑器](#model)
*   [检测微调值变化](#change)
*   [Spinner API](#api)
*   [使用旋转器的例子](#eg)

Swing API 提供了三个微调器模型：

[SpinnerListModel](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerListModel.html)

The `SpinnerListModel` is a model whose values are defined by an array of objects or a `List` object. The Month spinner in the `SpinnerDemo` example uses this model, initialized with an array derived from the value returned by the `getMonths` method of the `java.text.DateFormatSymbols` class. See [`SpinnerDemo.java`](../examples/components/SpinnerDemoProject/src/components/SpinnerDemo.java) for details.

[SpinnerNumberModel](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerNumberModel.html)

The `SpinnerNumberModel` supports sequences of numbers which can be expressed as `double` objects, `int` objects, or `Number` objects. You can specify the minimum and maximum allowable values, as well as the _step size_ — the amount of each increment or decrement. The Year spinner uses this model, created with the following code:

```
SpinnerModel model =
        new SpinnerNumberModel(currentYear, //initial value
                               currentYear - 100, //min
                               currentYear + 100, //max
                               1);                //step

```

[SpinnerDateModel](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerDateModel.html)

The `SpinnerDateModel` supports sequences of `Date` objects. You can specify the minimum and maximum dates, as well as the field (such as `Calendar.YEAR`) to increment or decrement. Note, however, that some types of look and feel ignore the specified field, and instead change the field that appears selected. The Another Date spinner uses this model, created with the following code:

```
Date initDate = calendar.getTime();
calendar.add(Calendar.YEAR, -100);
Date earliestDate = calendar.getTime();
calendar.add(Calendar.YEAR, 200);
Date latestDate = calendar.getTime();
model = new SpinnerDateModel(initDate,
                             earliestDate,
                             latestDate,
                             Calendar.YEAR);

```

设置微调器的模型时，将自动设置微调器的编辑器。 Swing API 提供了与上面列出的三个模型类中的每一个相对应的编辑器类。这些类 - [JSpinner.ListEditor](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.ListEditor.html) ， [JSpinner.NumberEditor](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.NumberEditor.html) 和 [JSpinner.DateEditor](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.DateEditor.html) - 都是 [JSpinner.DefaultEditor](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.DefaultEditor.html) 类的子类，功能可编辑格式的文本字段。如果您使用的模型没有与之关联的编辑器，则编辑器默认为`JSpinner.DefaultEditor`实例，其中包含不可编辑的格式化文本字段。

要更改标准微调编辑器中使用的格式，您可以自己创建和设置编辑器。

`JSpinner.NumberEditor`和`JSpinner.DateEditor`类具有构造函数，允许您创建以特定方式格式化其数据的编辑器。例如，下面的代码设置了另一个日期微调器，以便它不是使用默认的日期格式，它是长的并包含时间，它以紧凑的方式显示一个月和一年。

```
spinner.setEditor(new JSpinner.DateEditor(spinner, "MM/yyyy"));

```

* * *

**Note:** 

您可以通过运行`ComboBoxDemo2`示例来播放日期格式。单击“启动”按钮以使用 [Java™Web Start](http://www.oracle.com/technetwork/java/javase/javawebstart/index.html) （[下载 JDK 7 或更高版本](http://www.oracle.com/technetwork/java/javase/downloads/index.html)）运行 ComboBoxDemo2。或者，要自己编译并运行示例，请参考[示例索引](../examples/components/index.html#ComboBoxDemo2)。

[![Launches the ComboBoxDemo2 Application](img/4707a69a17729d71c56b2bdbbb4cc61c.jpg)](https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/ComboBoxDemo2Project/ComboBoxDemo2.jnlp)

有关格式字符串的信息，请参阅国际化路径的[格式化](../../i18n/format/index.html)课程。

* * *

要在使用默认编辑器时更改格式，可以获取编辑器的格式化文本字段并在其上调用方法。您可以使用`JSpinner.DefaultEditor`类中定义的`getTextField`方法调用这些方法。请注意，Swing 提供的编辑器不是格式化文本字段。相反，它们是包含格式化文本字段的`JPanel`实例。以下是在编辑器的格式化文本字段上获取和调用方法的示例：

```
//Tweak the spinner's formatted text field.
ftf = getTextField(spinner);
if (ftf != null ) {
    ftf.setColumns(8); //specify more width than we need
    ftf.setHorizontalAlignment(JTextField.RIGHT);
}
...

public JFormattedTextField getTextField(JSpinner spinner) {
    JComponent editor = spinner.getEditor();
    if (editor instanceof JSpinner.DefaultEditor) {
        return ((JSpinner.DefaultEditor)editor).getTextField();
    } else {
        System.err.println("Unexpected editor type: "
                           + spinner.getEditor().getClass()
                           + " isn't a descendant of DefaultEditor");
        return null;
    }
}

```

如果现有的微调模型或编辑器不能满足您的需求，您可以创建自己的模型或编辑器。

创建自定义微调器模型的最简单方法是创建现有`AbstractSpinnerModel`子类的子类，该子类已经完成了您所需的大部分工作。另一种方法是通过扩展 [`AbstractSpinnerModel`](https://docs.oracle.com/javase/8/docs/api/javax/swing/AbstractSpinnerModel.html) 类来实现自己的类，该类实现所有微调器模型所需的事件通知。

`SpinnerListModel`的以下子类实现了一个循环遍历对象数组的微调器模型。它还允许您指定第二个微调器模型，该模型将在循环再次开始时更新。例如，如果对象数组是月份列表，则链接的模型可以用于显示年份的微调器。当月份从 12 月到 1 月翻转时，年份会增加。同样，当月份从 1 月到 12 月翻转时，年份会减少。

```
public class CyclingSpinnerListModel extends SpinnerListModel {
    Object firstValue, lastValue;
    SpinnerModel linkedModel = null;

    public CyclingSpinnerListModel(Object[] values) {
        super(values);
        firstValue = values[0];
        lastValue = values[values.length - 1];
    }

    public void setLinkedModel(SpinnerModel linkedModel) {
        this.linkedModel = linkedModel;
    }

    public Object getNextValue() {
        Object value = super.getNextValue();
        if (value == null) {
            value = firstValue;
            if (linkedModel != null) {
                linkedModel.setValue(linkedModel.getNextValue());
            }
        }
        return value;
    }

    public Object getPreviousValue() {
        Object value = super.getPreviousValue();
        if (value == null) {
            value = lastValue;
            if (linkedModel != null) {
                linkedModel.setValue(linkedModel.getPreviousValue());
            }
        }
        return value;
    }
}

```

`CyclingSpinnerListModel`模型用于`SpinnerDemo2`示例中的 Month 微调器，这个示例几乎与`SpinnerDemo`相同。单击“启动”按钮以使用 [Java™Web Start](http://www.oracle.com/technetwork/java/javase/javawebstart/index.html) （[下载 JDK 7 或更高版本](http://www.oracle.com/technetwork/java/javase/downloads/index.html)）运行 SpinnerDemo2。或者，要自己编译并运行示例，请参考[示例索引](../examples/components/index.html#SpinnerDemo2)。

[![Launches the SpinnerDemo2 Application](img/4707a69a17729d71c56b2bdbbb4cc61c.jpg)](https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/SpinnerDemo2Project/SpinnerDemo2.jnlp)

如前所述，如果实现不从`SpinnerListModel`，`SpinnerNumberModel`或`SpinnerDateModel`下降的微调器模型，则微调器的默认编辑器是`JSpinner.DefaultEditor`的不可编辑实例。正如您已经看到的，您可以在设置了微调器的模型属性后通过在微调器上调用`setEditor`方法来设置微调器的编辑器。使用`setEditor`的另一种方法是创建`JSpinner`类的子类并覆盖其`createEditor`方法，以便在微调器模型属于某种类型时返回特定类型的编辑器。

至少在理论上，您可以使用任何`JComponent`实例作为编辑器。可能性包括使用标准组件的子类，如`JLabel`，或从头开始实现的组件，或`JSpinner.DefaultEditor`的子类。唯一的要求是必须更新编辑器以反映微调器值的变化，并且它必须具有合理的首选大小。编辑器通常还应将其工具提示文本设置为为微调器指定的任何工具提示文本。下一节将提供实现编辑器的示例。

您可以通过在微调器或其模型上注册更改侦听器来检测微调器的值已更改。以下是实现此类更改侦听器的示例。此示例来自`SpinnerDemo3`，它基于`SpinnerDemo`并使用更改侦听器更改某些文本的颜色以匹配 Another Date 微调器的值。单击“启动”按钮以使用 [Java™Web Start](http://www.oracle.com/technetwork/java/javase/javawebstart/index.html) （[下载 JDK 7 或更高版本](http://www.oracle.com/technetwork/java/javase/downloads/index.html)）运行 SpinnerDemo3。或者，要自己编译并运行示例，请参考[示例索引](../examples/components/index.html#SpinnerDemo3)。

[![Launches the SpinnerDemo3 Application](img/4707a69a17729d71c56b2bdbbb4cc61c.jpg)](https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/SpinnerDemo3Project/SpinnerDemo3.jnlp)

```
public class SpinnerDemo3 extends JPanel
                          implements ChangeListener {
    protected Calendar calendar;
    protected JSpinner dateSpinner;
    ...
    public SpinnerDemo3() {
        ...
        SpinnerDateModel dateModel = ...;
        ...
        setSeasonalColor(dateModel.getDate()); //initialize color

        //Listen for changes on the date spinner.
        dateSpinner.addChangeListener(this);
        ...
    }

    public void stateChanged(ChangeEvent e) {
        SpinnerModel dateModel = dateSpinner.getModel();
        if (dateModel instanceof SpinnerDateModel) {
            setSeasonalColor(((SpinnerDateModel)dateModel).getDate());
        }
    }

    protected void setSeasonalColor(Date date) {
        calendar.setTime(date);
        int month = calendar.get(Calendar.MONTH);
        JFormattedTextField ftf = getTextField(dateSpinner);
        if (ftf == null) return;

        //Set the color to match northern hemisphere seasonal conventions.
        switch (month) {
            case 2:  //March
            case 3:  //April
            case 4:  //May
                     ftf.setForeground(SPRING_COLOR);
                     break;
            ...
            default: //December, January, February
                     ftf.setForeground(WINTER_COLOR);
        }
    }
    ...
}

```

下面的示例实现了一个具有更改侦听器的编辑器，以便它可以反映微调器的当前值。这个特殊的编辑器显示灰色的纯色，范围从白色到黑色。单击“启动”按钮以使用 [Java™Web Start](http://www.oracle.com/technetwork/java/javase/javawebstart/index.html) （[下载 JDK 7 或更高版本](http://www.oracle.com/technetwork/java/javase/downloads/index.html)）运行 SpinnerDemo4。或者，要自己编译并运行示例，请参考[示例索引](../examples/components/index.html#SpinnerDemo4)。

[![Launches the SpinnerDemo4 Application](img/4707a69a17729d71c56b2bdbbb4cc61c.jpg)](https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/SpinnerDemo4Project/SpinnerDemo4.jnlp)

```
...//Where the components are created:
JSpinner spinner = new JSpinner(new GrayModel(170));
spinner.setEditor(new GrayEditor(spinner));

class GrayModel extends SpinnerNumberModel {
    ...
}

class GrayEditor extends JLabel
                 implements ChangeListener {
    public GrayEditor(JSpinner spinner) {
        setOpaque(true);
        ...
        //Get info from the model.
        GrayModel myModel = (GrayModel)(spinner.getModel());
        setBackground(myModel.getColor());
        spinner.addChangeListener(this);
        ...
        updateToolTipText(spinner);
    }

    protected void updateToolTipText(JSpinner spinner) {
        String toolTipText = spinner.getToolTipText();
        if (toolTipText != null) {
            //JSpinner has tool tip text.  Use it.
            if (!toolTipText.equals(getToolTipText())) {
                setToolTipText(toolTipText);
            }
        } else {
            //Define our own tool tip text.
            GrayModel myModel = (GrayModel)(spinner.getModel());
            int rgb = myModel.getIntValue();
            setToolTipText("(" + rgb + "," + rgb + "," + rgb + ")");
        }
    }

    public void stateChanged(ChangeEvent e) {
            JSpinner mySpinner = (JSpinner)(e.getSource());
            GrayModel myModel = (GrayModel)(mySpinner.getModel());
            setBackground(myModel.getColor());
            updateToolTipText(mySpinner);
    }
}

```

下表列出了一些常用的使用微调器的 API。如果您需要直接处理编辑器的格式化文本字段，您还应该看到 [FormattedTextField API](formattedtextfield.html#api) 。您可能使用的其他方法列在 [JComponent 类](jcomponent.html#api)的 API 表中。

*   [与纺纱厂相关的课程](#newclassesapi)
*   [有用的 JSpinner 构造函数和方法](#jspinnerapi)
*   [有用的编辑器构造函数和方法](#editorapi)
*   [SpinnerListModel 方法](#listapi)
*   [SpinnerDateModel 方法](#dateapi)
*   [SpinnerNumberModel 方法](#numberapi)

<caption></caption>
| 类或接口 | 目的 |
| :-- | :-- |
| [JSpinner](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.html) | 单行输入字段，允许用户从有序序列中选择数字或对象值。 |
| [SpinnerModel](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerModel.html) | 所有微调器模型实现的接口。 |
| [AbstractSpinnerModel](https://docs.oracle.com/javase/8/docs/api/javax/swing/AbstractSpinnerModel.html) | 旋转模型实现的常用超类。 |
| [SpinnerListModel](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerListModel.html) | `AbstractSpinnerModel`的子类，其值由数组或`List`定义。 |
| [SpinnerDateModel](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerDateModel.html) | `AbstractSpinnerModel`的子类，支持`Date`实例的序列。 |
| [SpinnerNumberModel](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerNumberModel.html) | `AbstractSpinnerModel`的子类，支持数字序列。 |
| [JSpinner.DefaultEditor](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.DefaultEditor.html) | 实现一个显示微调器值的不可编辑组件。此类的子类通常更专业（和可编辑）。 |
| [JSpinner.ListEditor](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.ListEditor.html) | `JSpinner.DefaultEditor`的子类，其值由数组或`List`定义。 |
| [JSpinner.DateEditor](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.DateEditor.html) | `JSpinner.DefaultEditor`的子类，支持`Date`实例的序列。 |
| [JSpinner.NumberEditor](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.NumberEditor.html) | `JSpinner.DefaultEditor`的子类，支持数字序列。 |

<caption></caption>
| 构造函数或方法 | 目的 |
| :-- | :-- |
| [JSpinner（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.html#JSpinner--)
[JSpinner（SpinnerModel）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.html#JSpinner-javax.swing.SpinnerModel-) | 创建一个新的`JSpinner`。无参数构造函数创建一个整数`SpinnerNumberModel`的微调器，初始值为 0，没有最小或最大限制。第二个构造函数的可选参数允许您指定自己的`SpinnerModel`。 |
| [void setValue（java.lang.Object）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.html#setValue-java.lang.Object-)
[Object getValue（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.html#getValue--) | 设置或获取序列的当前显示元素。 |
| [Object getNextValue（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.html#getNextValue--)
[Object getPreviousValue（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.html#getPreviousValue--) | 获取`getValue`方法返回的对象之前或之后的序列中的对象。 |
| [SpinnerModel getModel（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.html#getModel--)
[void setModel（SpinnerModel）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.html#setModel-javax.swing.SpinnerModel-) | 获取或设置微调器的模型。 |
| [JComponent getEditor（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.html#getEditor--)
[void setEditor（JComponent）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.html#setEditor-javax.swing.JComponent-) | 获取或设置微调器的编辑器，它通常是`JSpinner.DefaultEditor`类型的对象。 |
| [保护 JComponent createEditor（SpinnerModel）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.html#createEditor-javax.swing.SpinnerModel-) | 由`JSpinner`构造函数调用以创建微调器的编辑器。重写此方法以将编辑器与特定类型的模型相关联。 |

<caption></caption>
| 构造函数或方法 | 目的 |
| :-- | :-- |
| [JSpinner.NumberEditor（JSpinner，String）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.NumberEditor.html#JSpinner.NumberEditor-javax.swing.JSpinner-java.lang.String-) | 创建一个`JSpinner.NumberEditor`实例，该实例显示并允许编辑指定微调器的数值。字符串参数指定用于显示数字的格式。有关十进制格式字符串的信息，请参阅 [DecimalFormat](https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html) 的 API 文档。 |
| [JSpinner.DateEditor（JSpinner，String）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.DateEditor.html#JSpinner.DateEditor-javax.swing.JSpinner-java.lang.String-) | 创建一个`JSpinner.DateEditor`实例，显示并允许编辑指定微调器的`Date`值。字符串参数指定用于显示日期的格式。有关日期格式字符串的信息，请参阅 [SimpleDateFormat](https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html) 的 API 文档。 |
| [JFormattedTextField getTextField（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSpinner.DefaultEditor.html#getTextField--)
_（在`JSpinner.DefaultEditor`中定义）_ | 获取格式化文本字段，该字段提供此编辑器的主 GUI。 |

<caption></caption>
| 方法 | 目的 |
| :-- | :-- |
| [void setList（List）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerListModel.html#setList-java.util.List-)
[List getList（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerListModel.html#getList--) | 设置或获取定义此模型序列的`List`。 |

<caption></caption>
| 方法 | 目的 |
| :-- | :-- |
|  |
| [void setValue（Object）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerDateModel.html#setValue-java.lang.Object-)
[Date getDate（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerDateModel.html#getDate--)
[Object getValue（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerDateModel.html#getValue--) | 设置或获取此序列的当前`Date`。 |
| [void setStart（Comparable）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerDateModel.html#setStart-java.lang.Comparable-)
[Comparable getStart（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerDateModel.html#getStart--) | 设置或获取此序列中的第一个`Date`。使用`null`指定微调器没有下限。 |
| [void setEnd（Comparable）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerDateModel.html#setEnd-java.lang.Comparable-)
[Comparable getEnd（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerDateModel.html#getEnd--) | 设置或获取此序列中的最后一个`Date`。使用`null`指定微调器没有上限。 |
| [void setCalendarField（int）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerDateModel.html#setCalendarField-int-)
[int getCalendarField（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerDateModel.html#getCalendarField--) | 设置或获取`getNextValue`和`getPreviousValue`方法使用的日期值增量的大小。当用户明确增加或减少该值时，此属性为 _ 而不是 _;相反，格式化文本字段的所选部分递增或递减。指定的参数必须是以下常量之一，在`Calendar`中定义：`ERA`，`YEAR`，`MONTH`，`WEEK_OF_YEAR`，`WEEK_OF_MONTH`，`DAY_OF_MONTH`，`DAY_OF_YEAR`，`DAY_OF_WEEK`，`DAY_OF_WEEK_IN_MONTH`，`AM_PM`，`HOUR_OF_DAY`，`MINUTE`，`SECOND`，`MILLISECOND`。 |

<caption></caption>
| 方法 | 目的 |
| :-- | :-- |
|  |
| [void setValue（Object）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerNumberModel.html#setValue-java.lang.Object-)
[Number getNumber（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerNumberModel.html#getNumber--) | 设置或获取此序列的当前值。 |
| [void setMaximum（Comparable）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerNumberModel.html#setMaximum-java.lang.Comparable-)
[Comparable getMaximum（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerNumberModel.html#getMaximum--) | 设置或获取此序列中数字的上限。如果最大值为`null`，则没有上限。 |
| [void setMinimum（Comparable）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerNumberModel.html#setMinimum-java.lang.Comparable-)
[Comparable getMinimum（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerNumberModel.html#getMinimum--) | 设置或获取此序列中数字的下限。如果最小值是`null`，则没有下限。 |
| [void setStepSize（Number）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerNumberModel.html#setStepSize-java.lang.Number-)
[Number getStepSize（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerNumberModel.html#getStepSize--) | 设置或获取`getNextValue`和`getPreviousValue`方法使用的增量。 |

此表列出了使用微调器的示例，并指出了描述这些示例的位置。

| 例 | 在哪里描述 | 笔记 |
| :-- | :-- | :-- |
| [`SpinnerDemo`](../examples/components/index.html#SpinnerDemo) | 这个部分 | 使用所有三个标准微调器模型类。包含使用自定义微调器模型的代码，但默认情况下代码处于关闭状态。 |
| [`SpinnerDemo2`](../examples/components/index.html#SpinnerDemo2) | 这个部分 | 一个`SpinnerDemo`子类，它为其 Months 微调器使用自定义微调器模型。 |
| [`SpinnerDemo3`](../examples/components/index.html#SpinnerDemo3) | 这个部分 | 基于 SpinnerDemo，该应用程序显示了如何监听微调器值的变化。 |
| [`SpinnerDemo4`](../examples/components/index.html#SpinnerDemo4) | 这个部分 | 为显示灰色阴影的微调器实现自定义模型和自定义编辑器。 |