Spinner (JavaFX 27)
Description: declaration: module: javafx.controls, package: javafx.scene.control, class: Spinner

# Class Spinner<T>

java.lang.Object
javafx.scene.Node
javafx.scene.Parent
javafx.scene.layout.Region
javafx.scene.control.Control
javafx.scene.control.Spinner<T>

Type Parameters:
  `T` - The type of all values that can be iterated through in the Spinner. Common types include Integer and String.

All Implemented Interfaces:
  `Styleable, EventTarget, Skinnable`

public class Spinner<T> extends Control
A single line text field that lets the user select a number or an object value from an ordered sequence. Spinners typically provide a pair of tiny arrow buttons for stepping through the elements of the sequence. The keyboard up/down arrow keys also cycle through the elements. The user may also be allowed to type a (legal) value directly into the spinner. Although combo boxes provide similar functionality, spinners are sometimes preferred because they don't require a drop down list that can obscure important data, and also because they allow for features such as `wrapping` and simpler specification of 'infinite' data models (the `SpinnerValueFactory`, rather than using a `ObservableList` data model like many other JavaFX UI controls.

A Spinner's sequence value is defined by its `SpinnerValueFactory`. The value factory can be specified as a constructor argument and changed with the `value factory property`. SpinnerValueFactory classes for some common types are provided with JavaFX, including:

- `SpinnerValueFactory.IntegerSpinnerValueFactory`
- `SpinnerValueFactory.DoubleSpinnerValueFactory`
- `SpinnerValueFactory.ListSpinnerValueFactory`

A Spinner has a TextField child component that is responsible for displaying and potentially changing the current `value` of the Spinner, which is called the `editor`. By default the Spinner is non-editable, but input can be accepted if the `editable property` is set to true. The Spinner editor stays in sync with the value factory by listening for changes to the `value property` of the value factory. If the user has changed the value displayed in the editor it is possible for the Spinner `value` to differ from that of the editor. To make sure the model has the same value as the editor, the user must commit the edit using the Enter key.

Example:

    Spinner spinner = new Spinner(0, 10, 5);

Since:
  JavaFX 8u40
See Also:
  - `SpinnerValueFactory`

- ## Property Summary

  Properties
  Type
  Property
  Description
  `final BooleanProperty`
  `editable`
  The editable property is used to specify whether user input is able to be typed into the Spinner `editor`.
  `final ReadOnlyObjectProperty<TextField>`
  `editor`
  The editor used by the Spinner control.
  `final ObjectProperty<Duration>`
  `initialDelay`
  The duration that the mouse has to be pressed on an arrow button before the next value steps.
  `final StringProperty`
  `promptText`
  The prompt text to display in the `Spinner`, or `null` if no prompt text is displayed.
  `final ObjectProperty<Duration>`
  `repeatDelay`
  The duration that the mouse has to be pressed for each successive step after the first value steps.
  `final ObjectProperty<SpinnerValueFactory<T>>`
  `valueFactory`
  The value factory is the model behind the JavaFX Spinner control - without a value factory installed a Spinner is unusable.
  `final ReadOnlyObjectProperty<T>`
  `value`
  The value property on Spinner is a read-only property, as it is bound to the SpinnerValueFactory `value property`.

  ### Properties declared in class Control

  `contextMenu, skin, tooltip`

  ### Properties declared in class Region

  `background, border, cacheShape, centerShape, height, insets, maxHeight, maxWidth, minHeight, minWidth, opaqueInsets, padding, prefHeight, prefWidth, scaleShape, shape, snapToPixel, width`

  ### Properties declared in class Parent

  `needsLayout`

  ### Properties declared in class Node

  `accessibleHelp, accessibleRoleDescription, accessibleRole, accessibleText, blendMode, boundsInLocal, boundsInParent, cacheHint, cache, clip, cursor, depthTest, disabled, disable, effectiveNodeOrientation, effect, eventDispatcher, focused, focusTraversable, focusVisible, focusWithin, hover, id, inputMethodRequests, layoutBounds, layoutX, layoutY, localToParentTransform, localToSceneTransform, managed, mouseTransparent, nodeOrientation, onContextMenuRequested, onDragDetected, onDragDone, onDragDropped, onDragEntered, onDragExited, onDragOver, onInputMethodTextChanged, onKeyPressed, onKeyReleased, onKeyTyped, onMouseClicked, onMouseDragDone, onMouseDragEntered, onMouseDragExited, onMouseDragged, onMouseDragOver, onMouseDragReleased, onMouseEntered, onMouseExited, onMouseMoved, onMousePressed, onMouseReleased, onRotate, onRotationFinished, onRotationStarted, onScrollFinished, onScroll, onScrollStarted, onSwipeDown, onSwipeLeft, onSwipeRight, onSwipeUp, onTouchMoved, onTouchPressed, onTouchReleased, onTouchStationary, onZoomFinished, onZoom, onZoomStarted, opacity, parent, pickOnBounds, pressed, rotate, rotationAxis, scaleX, scaleY, scaleZ, scene, style, translateX, translateY, translateZ, viewOrder, visible`

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `static final String`
  `STYLE_CLASS_ARROWS_ON_LEFT_HORIZONTAL`
  The arrows are placed on the left of the Spinner, pointing horizontally (i.e.
  `static final String`
  `STYLE_CLASS_ARROWS_ON_LEFT_VERTICAL`
  The arrows are placed on the left of the Spinner, pointing vertically (i.e.
  `static final String`
  `STYLE_CLASS_ARROWS_ON_RIGHT_HORIZONTAL`
  The arrows are placed on the right of the Spinner, pointing horizontally (i.e.
  `static final String`
  `STYLE_CLASS_SPLIT_ARROWS_HORIZONTAL`
  The decrement arrow is placed on the left of the Spinner, and the increment on the right.
  `static final String`
  `STYLE_CLASS_SPLIT_ARROWS_VERTICAL`
  The arrows are placed above and beneath the spinner, stretching to take the entire width.

  ### Fields declared in class Region

  `USE_COMPUTED_SIZE, USE_PREF_SIZE`

  ### Fields declared in class Node

  `BASELINE_OFFSET_SAME_AS_HEIGHT`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `Spinner()`
  Constructs a default Spinner instance, with the default 'spinner' style class and a non-editable editor.
  `Spinner(double min, double max, double initialValue)`
  Creates a Spinner instance with the `value factory` set to be an instance of `SpinnerValueFactory.DoubleSpinnerValueFactory`.
  `Spinner(double min, double max, double initialValue, double amountToStepBy)`
  Creates a Spinner instance with the `value factory` set to be an instance of `SpinnerValueFactory.DoubleSpinnerValueFactory`.
  `Spinner(int min, int max, int initialValue)`
  Creates a Spinner instance with the `value factory` set to be an instance of `SpinnerValueFactory.IntegerSpinnerValueFactory`.
  `Spinner(int min, int max, int initialValue, int amountToStepBy)`
  Creates a Spinner instance with the `value factory` set to be an instance of `SpinnerValueFactory.IntegerSpinnerValueFactory`.
  `Spinner(ObservableList<T> items)`
  Creates a Spinner instance with the `value factory` set to be an instance of `SpinnerValueFactory.ListSpinnerValueFactory`.
  `Spinner(SpinnerValueFactory<T> valueFactory)`
  Creates a Spinner instance with the given value factory set.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `final void`
  `cancelEdit()`
  If the Spinner is `editable`, calling this method will attempt to replace the editor text with the last committed `value`.
  `final void`
  `commitValue()`
  If the Spinner is `editable`, calling this method will attempt to commit the current text and convert it to a `value`.
  `void`
  `decrement()`
  Attempts to decrement the `value factory` by one step, by calling the `SpinnerValueFactory.decrement(int)` method with an argument of one.
  `void`
  `decrement(int steps)`
  Attempts to decrement the `value factory` by the given number of steps, by calling the `SpinnerValueFactory.decrement(int)` method and forwarding the steps argument to it.
  `final BooleanProperty`
  `editableProperty()`
  The editable property is used to specify whether user input is able to be typed into the Spinner `editor`.
  `final ReadOnlyObjectProperty<TextField>`
  `editorProperty()`
  The editor used by the Spinner control.
  `static List<CssMetaData<? extends Styleable, ?>>`
  `getClassCssMetaData()`
  Gets the `CssMetaData` associated with this class, which may include the `CssMetaData` of its superclasses.
  `List<CssMetaData<? extends Styleable, ?>>`
  `getControlCssMetaData()`
  Gets the unmodifiable list of the control's CSS-styleable properties.
  `final TextField`
  `getEditor()`
  Gets the value of the `editor` property.
  `final Duration`
  `getInitialDelay()`
  Gets the value of the `initialDelay` property.
  `final String`
  `getPromptText()`
  Gets the value of the `promptText` property.
  `final Duration`
  `getRepeatDelay()`
  Gets the value of the `repeatDelay` property.
  `final T`
  `getValue()`
  Gets the value of the `value` property.
  `final SpinnerValueFactory<T>`
  `getValueFactory()`
  Gets the value of the `valueFactory` property.
  `void`
  `increment()`
  Attempts to increment the `value factory` by one step, by calling the `SpinnerValueFactory.increment(int)` method with an argument of one.
  `void`
  `increment(int steps)`
  Attempts to increment the `value factory` by the given number of steps, by calling the `SpinnerValueFactory.increment(int)` method and forwarding the steps argument to it.
  `final ObjectProperty<Duration>`
  `initialDelayProperty()`
  The duration that the mouse has to be pressed on an arrow button before the next value steps.
  `final boolean`
  `isEditable()`
  Gets the value of the `editable` property.
  `final StringProperty`
  `promptTextProperty()`
  The prompt text to display in the `Spinner`, or `null` if no prompt text is displayed.
  `final ObjectProperty<Duration>`
  `repeatDelayProperty()`
  The duration that the mouse has to be pressed for each successive step after the first value steps.
  `final void`
  `setEditable(boolean value)`
  Sets the value of the `editable` property.
  `final void`
  `setInitialDelay(Duration value)`
  Sets the value of the `initialDelay` property.
  `final void`
  `setPromptText(String value)`
  Sets the value of the `promptText` property.
  `final void`
  `setRepeatDelay(Duration value)`
  Sets the value of the `repeatDelay` property.
  `final void`
  `setValueFactory(SpinnerValueFactory<T> value)`
  Sets the value of the `valueFactory` property.
  `final ObjectProperty<SpinnerValueFactory<T>>`
  `valueFactoryProperty()`
  The value factory is the model behind the JavaFX Spinner control - without a value factory installed a Spinner is unusable.
  `final ReadOnlyObjectProperty<T>`
  `valueProperty()`
  The value property on Spinner is a read-only property, as it is bound to the SpinnerValueFactory `value property`.

  ### Methods declared in class Control

  `computeMaxHeight, computeMaxWidth, computeMinHeight, computeMinWidth, contextMenuProperty, createDefaultSkin, getContextMenu, getCssMetaData, getInitialFocusTraversable, getSkin, getTooltip, isResizable, setContextMenu, setSkin, setTooltip, skinProperty, tooltipProperty`

  ### Methods declared in class Region

  `backgroundProperty, borderProperty, cacheShapeProperty, centerShapeProperty, computePrefHeight, computePrefWidth, getBackground, getBorder, getHeight, getInsets, getMaxHeight, getMaxWidth, getMinHeight, getMinWidth, getOpaqueInsets, getPadding, getPrefHeight, getPrefWidth, getShape, getUserAgentStylesheet, getWidth, heightProperty, insetsProperty, isCacheShape, isCenterShape, isScaleShape, isSnapToPixel, layoutInArea, layoutInArea, layoutInArea, layoutInArea, maxHeight, maxHeightProperty, maxWidth, maxWidthProperty, minHeight, minHeightProperty, minWidth, minWidthProperty, opaqueInsetsProperty, paddingProperty, positionInArea, positionInArea, prefHeight, prefHeightProperty, prefWidth, prefWidthProperty, resize, scaleShapeProperty, setBackground, setBorder, setCacheShape, setCenterShape, setHeight, setMaxHeight, setMaxSize, setMaxWidth, setMinHeight, setMinSize, setMinWidth, setOpaqueInsets, setPadding, setPrefHeight, setPrefSize, setPrefWidth, setScaleShape, setShape, setSnapToPixel, setWidth, shapeProperty, snappedBottomInset, snappedLeftInset, snappedRightInset, snappedTopInset, snapPosition, snapPositionX, snapPositionY, snapSize, snapSizeX, snapSizeY, snapSpace, snapSpaceX, snapSpaceY, snapToPixelProperty, widthProperty`

  ### Methods declared in class Parent

  `getBaselineOffset, getChildren, getChildrenUnmodifiable, getManagedChildren, getStylesheets, isNeedsLayout, layout, layoutChildren, needsLayoutProperty, requestLayout, requestParentLayout, setNeedsLayout, updateBounds`

  ### Methods declared in class Node

  `accessibleHelpProperty, accessibleRoleDescriptionProperty, accessibleRoleProperty, accessibleTextProperty, addEventFilter, addEventHandler, applyCss, autosize, blendModeProperty, boundsInLocalProperty, boundsInParentProperty, buildEventDispatchChain, cacheHintProperty, cacheProperty, clipProperty, computeAreaInScreen, contains, contains, cursorProperty, depthTestProperty, disabledProperty, disableProperty, effectiveNodeOrientationProperty, effectProperty, eventDispatcherProperty, executeAccessibleAction, fireEvent, focusedProperty, focusTraversableProperty, focusVisibleProperty, focusWithinProperty, getAccessibleHelp, getAccessibleRole, getAccessibleRoleDescription, getAccessibleText, getBlendMode, getBoundsInLocal, getBoundsInParent, getCacheHint, getClip, getContentBias, getCursor, getDepthTest, getEffect, getEffectiveNodeOrientation, getEventDispatcher, getId, getInitialCursor, getInputMethodRequests, getLayoutBounds, getLayoutX, getLayoutY, getLocalToParentTransform, getLocalToSceneTransform, getNodeOrientation, getOnContextMenuRequested, getOnDragDetected, getOnDragDone, getOnDragDropped, getOnDragEntered, getOnDragExited, getOnDragOver, getOnInputMethodTextChanged, getOnKeyPressed, getOnKeyReleased, getOnKeyTyped, getOnMouseClicked, getOnMouseDragDone, getOnMouseDragEntered, getOnMouseDragExited, getOnMouseDragged, getOnMouseDragOver, getOnMouseDragReleased, getOnMouseEntered, getOnMouseExited, getOnMouseMoved, getOnMousePressed, getOnMouseReleased, getOnRotate, getOnRotationFinished, getOnRotationStarted, getOnScroll, getOnScrollFinished, getOnScrollStarted, getOnSwipeDown, getOnSwipeLeft, getOnSwipeRight, getOnSwipeUp, getOnTouchMoved, getOnTouchPressed, getOnTouchReleased, getOnTouchStationary, getOnZoom, getOnZoomFinished, getOnZoomStarted, getOpacity, getParent, getProperties, getPseudoClassStates, getRotate, getRotationAxis, getScaleX, getScaleY, getScaleZ, getScene, getStyle, getStyleableParent, getStyleClass, getTransforms, getTranslateX, getTranslateY, getTranslateZ, getTypeSelector, getUserData, getViewOrder, hasProperties, hoverProperty, idProperty, inputMethodRequestsProperty, intersects, intersects, isCache, isDisable, isDisabled, isFocused, isFocusTraversable, isFocusVisible, isFocusWithin, isHover, isManaged, isMouseTransparent, isPickOnBounds, isPressed, isVisible, layoutBoundsProperty, layoutXProperty, layoutYProperty, localToParent, localToParent, localToParent, localToParent, localToParent, localToParentTransformProperty, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToSceneTransformProperty, localToScreen, localToScreen, localToScreen, localToScreen, localToScreen, lookup, lookupAll, managedProperty, mouseTransparentProperty, nodeOrientationProperty, notifyAccessibleAttributeChanged, onContextMenuRequestedProperty, onDragDetectedProperty, onDragDoneProperty, onDragDroppedProperty, onDragEnteredProperty, onDragExitedProperty, onDragOverProperty, onInputMethodTextChangedProperty, onKeyPressedProperty, onKeyReleasedProperty, onKeyTypedProperty, onMouseClickedProperty, onMouseDragDoneProperty, onMouseDragEnteredProperty, onMouseDragExitedProperty, onMouseDraggedProperty, onMouseDragOverProperty, onMouseDragReleasedProperty, onMouseEnteredProperty, onMouseExitedProperty, onMouseMovedProperty, onMousePressedProperty, onMouseReleasedProperty, onRotateProperty, onRotationFinishedProperty, onRotationStartedProperty, onScrollFinishedProperty, onScrollProperty, onScrollStartedProperty, onSwipeDownProperty, onSwipeLeftProperty, onSwipeRightProperty, onSwipeUpProperty, onTouchMovedProperty, onTouchPressedProperty, onTouchReleasedProperty, onTouchStationaryProperty, onZoomFinishedProperty, onZoomProperty, onZoomStartedProperty, opacityProperty, parentProperty, parentToLocal, parentToLocal, parentToLocal, parentToLocal, parentToLocal, pickOnBoundsProperty, pressedProperty, pseudoClassStateChanged, queryAccessibleAttribute, relocate, removeEventFilter, removeEventHandler, requestFocus, requestFocusTraversal, resizeRelocate, rotateProperty, rotationAxisProperty, scaleXProperty, scaleYProperty, scaleZProperty, sceneProperty, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, screenToLocal, screenToLocal, screenToLocal, setAccessibleHelp, setAccessibleRole, setAccessibleRoleDescription, setAccessibleText, setBlendMode, setCache, setCacheHint, setClip, setCursor, setDepthTest, setDisable, setDisabled, setEffect, setEventDispatcher, setEventHandler, setFocused, setFocusTraversable, setHover, setId, setInputMethodRequests, setLayoutX, setLayoutY, setManaged, setMouseTransparent, setNodeOrientation, setOnContextMenuRequested, setOnDragDetected, setOnDragDone, setOnDragDropped, setOnDragEntered, setOnDragExited, setOnDragOver, setOnInputMethodTextChanged, setOnKeyPressed, setOnKeyReleased, setOnKeyTyped, setOnMouseClicked, setOnMouseDragDone, setOnMouseDragEntered, setOnMouseDragExited, setOnMouseDragged, setOnMouseDragOver, setOnMouseDragReleased, setOnMouseEntered, setOnMouseExited, setOnMouseMoved, setOnMousePressed, setOnMouseReleased, setOnRotate, setOnRotationFinished, setOnRotationStarted, setOnScroll, setOnScrollFinished, setOnScrollStarted, setOnSwipeDown, setOnSwipeLeft, setOnSwipeRight, setOnSwipeUp, setOnTouchMoved, setOnTouchPressed, setOnTouchReleased, setOnTouchStationary, setOnZoom, setOnZoomFinished, setOnZoomStarted, setOpacity, setPickOnBounds, setPressed, setRotate, setRotationAxis, setScaleX, setScaleY, setScaleZ, setStyle, setTranslateX, setTranslateY, setTranslateZ, setUserData, setViewOrder, setVisible, snapshot, snapshot, startDragAndDrop, startFullDrag, styleProperty, toBack, toFront, toString, translateXProperty, translateYProperty, translateZProperty, usesMirroring, viewOrderProperty, visibleProperty`

  ### Methods declared in class Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

  ### Methods declared in interface Styleable

  `getStyleableNode`

- ## Property Details

  - ### value

    public final ReadOnlyObjectProperty<T> valueProperty
    The value property on Spinner is a read-only property, as it is bound to the SpinnerValueFactory `value property`. Should the `value factory` change, this value property will be unbound from the old value factory and bound to the new one.

    If developers wish to modify the value property, they may do so with code in the following form:

        Object newValue = ...;
        spinner.getValueFactory().setValue(newValue);

    See Also:
      - `getValue()`
      - `valueProperty()`

  - ### valueFactory

    public final ObjectProperty<SpinnerValueFactory<T>> valueFactoryProperty
    The value factory is the model behind the JavaFX Spinner control - without a value factory installed a Spinner is unusable. It is the role of the value factory to handle almost all aspects of the Spinner, including:
    - Representing the current state of the `value`,
    - `Incrementing` and `decrementing` the value, with one or more steps per call,
    - `Converting` text input from the user (via the Spinner `editor`,
    - Converting `objects to user-readable strings` for display on screen
    See Also:
      - `getValueFactory()`
      - `setValueFactory(SpinnerValueFactory)`
      - `valueFactoryProperty()`

  - ### editable

    public final BooleanProperty editableProperty
    The editable property is used to specify whether user input is able to be typed into the Spinner `editor`. If editable is true, user input will be received once the user types and presses the Enter key. At this point the input is passed to the SpinnerValueFactory `converter` `StringConverter.fromString(String)` method. The returned value from this call (of type T) is then sent to the `SpinnerValueFactory.setValue(Object)` method. If the value is valid, it will remain as the value. If it is invalid, the value factory will need to react accordingly and back out this change.
    Default value:
      `false`
    See Also:
      - `isEditable()`
      - `setEditable(boolean)`
      - `editableProperty()`

  - ### editor

    public final ReadOnlyObjectProperty<TextField> editorProperty
    The editor used by the Spinner control.
    See Also:
      - `getEditor()`
      - `editorProperty()`

  - ### promptText

    public final StringProperty promptTextProperty
    The prompt text to display in the `Spinner`, or `null` if no prompt text is displayed.
    Default value:
      Empty string
    Since:
      9
    See Also:
      - `getPromptText()`
      - `setPromptText(String)`
      - `promptTextProperty()`

  - ### initialDelay

    public final ObjectProperty<Duration> initialDelayProperty
    The duration that the mouse has to be pressed on an arrow button before the next value steps. Successive step duration is set using `repeat delay`.
    Default value:
      300ms
    Since:
      11
    See Also:
      - `getInitialDelay()`
      - `setInitialDelay(Duration)`
      - `initialDelayProperty()`

  - ### repeatDelay

    public final ObjectProperty<Duration> repeatDelayProperty
    The duration that the mouse has to be pressed for each successive step after the first value steps. Initial step duration is set using `initial delay`.
    Default value:
      60ms
    Since:
      11
    See Also:
      - `getRepeatDelay()`
      - `setRepeatDelay(Duration)`
      - `repeatDelayProperty()`

- ## Field Details

  - ### STYLE_CLASS_ARROWS_ON_RIGHT_HORIZONTAL

    public static final String STYLE_CLASS_ARROWS_ON_RIGHT_HORIZONTAL
    The arrows are placed on the right of the Spinner, pointing horizontally (i.e. left and right).
    See Also:
      - Constant Field Values

  - ### STYLE_CLASS_ARROWS_ON_LEFT_VERTICAL

    public static final String STYLE_CLASS_ARROWS_ON_LEFT_VERTICAL
    The arrows are placed on the left of the Spinner, pointing vertically (i.e. up and down).
    See Also:
      - Constant Field Values

  - ### STYLE_CLASS_ARROWS_ON_LEFT_HORIZONTAL

    public static final String STYLE_CLASS_ARROWS_ON_LEFT_HORIZONTAL
    The arrows are placed on the left of the Spinner, pointing horizontally (i.e. left and right).
    See Also:
      - Constant Field Values

  - ### STYLE_CLASS_SPLIT_ARROWS_VERTICAL

    public static final String STYLE_CLASS_SPLIT_ARROWS_VERTICAL
    The arrows are placed above and beneath the spinner, stretching to take the entire width.
    See Also:
      - Constant Field Values

  - ### STYLE_CLASS_SPLIT_ARROWS_HORIZONTAL

    public static final String STYLE_CLASS_SPLIT_ARROWS_HORIZONTAL
    The decrement arrow is placed on the left of the Spinner, and the increment on the right.
    See Also:
      - Constant Field Values

- ## Constructor Details

  - ### Spinner

    public Spinner()
    Constructs a default Spinner instance, with the default 'spinner' style class and a non-editable editor.

  - ### Spinner

    public Spinner(int min, int max, int initialValue)
    Creates a Spinner instance with the `value factory` set to be an instance of `SpinnerValueFactory.IntegerSpinnerValueFactory`. Note that if this constructor is called, the only valid generic type for the Spinner instance is Integer, i.e. Spinner<Integer>.
    Parameters:
      `min` - The minimum allowed integer value for the Spinner.
      `max` - The maximum allowed integer value for the Spinner.
      `initialValue` - The value of the Spinner when first instantiated, must be within the bounds of the min and max arguments, or else the min value will be used.

  - ### Spinner

    public Spinner(int min, int max, int initialValue, int amountToStepBy)
    Creates a Spinner instance with the `value factory` set to be an instance of `SpinnerValueFactory.IntegerSpinnerValueFactory`. Note that if this constructor is called, the only valid generic type for the Spinner instance is Integer, i.e. Spinner<Integer>.
    Parameters:
      `min` - The minimum allowed integer value for the Spinner.
      `max` - The maximum allowed integer value for the Spinner.
      `initialValue` - The value of the Spinner when first instantiated, must be within the bounds of the min and max arguments, or else the min value will be used.
      `amountToStepBy` - The amount to increment or decrement by, per step.

  - ### Spinner

    public Spinner(double min, double max, double initialValue)
    Creates a Spinner instance with the `value factory` set to be an instance of `SpinnerValueFactory.DoubleSpinnerValueFactory`. Note that if this constructor is called, the only valid generic type for the Spinner instance is Double, i.e. Spinner<Double>.
    Parameters:
      `min` - The minimum allowed double value for the Spinner.
      `max` - The maximum allowed double value for the Spinner.
      `initialValue` - The value of the Spinner when first instantiated, must be within the bounds of the min and max arguments, or else the min value will be used.

  - ### Spinner

    public Spinner(double min, double max, double initialValue, double amountToStepBy)
    Creates a Spinner instance with the `value factory` set to be an instance of `SpinnerValueFactory.DoubleSpinnerValueFactory`. Note that if this constructor is called, the only valid generic type for the Spinner instance is Double, i.e. Spinner<Double>.
    Parameters:
      `min` - The minimum allowed double value for the Spinner.
      `max` - The maximum allowed double value for the Spinner.
      `initialValue` - The value of the Spinner when first instantiated, must be within the bounds of the min and max arguments, or else the min value will be used.
      `amountToStepBy` - The amount to increment or decrement by, per step.

  - ### Spinner

    public Spinner(ObservableList<T> items)
    Creates a Spinner instance with the `value factory` set to be an instance of `SpinnerValueFactory.ListSpinnerValueFactory`. The Spinner `value property` will be set to the first element of the list, if an element exists, or null otherwise.
    Parameters:
      `items` - A list of items that will be stepped through in the Spinner.

  - ### Spinner

    public Spinner(SpinnerValueFactory<T> valueFactory)
    Creates a Spinner instance with the given value factory set.
    Parameters:
      `valueFactory` - The `value factory` to use.

- ## Method Details

  - ### increment

    public void increment()
    Attempts to increment the `value factory` by one step, by calling the `SpinnerValueFactory.increment(int)` method with an argument of one. If the value factory is null, an IllegalStateException is thrown.
    Throws:
      `IllegalStateException` - if the value factory returned by calling `getValueFactory()` is null.

  - ### increment

    public void increment(int steps)
    Attempts to increment the `value factory` by the given number of steps, by calling the `SpinnerValueFactory.increment(int)` method and forwarding the steps argument to it. If the value factory is null, an IllegalStateException is thrown.
    Parameters:
      `steps` - The number of increments that should be performed on the value.
    Throws:
      `IllegalStateException` - if the value factory returned by calling `getValueFactory()` is null.

  - ### decrement

    public void decrement()
    Attempts to decrement the `value factory` by one step, by calling the `SpinnerValueFactory.decrement(int)` method with an argument of one. If the value factory is null, an IllegalStateException is thrown.
    Throws:
      `IllegalStateException` - if the value factory returned by calling `getValueFactory()` is null.

  - ### decrement

    public void decrement(int steps)
    Attempts to decrement the `value factory` by the given number of steps, by calling the `SpinnerValueFactory.decrement(int)` method and forwarding the steps argument to it. If the value factory is null, an IllegalStateException is thrown.
    Parameters:
      `steps` - The number of decrements that should be performed on the value.
    Throws:
      `IllegalStateException` - if the value factory returned by calling `getValueFactory()` is null.

  - ### commitValue

    public final void commitValue()
    If the Spinner is `editable`, calling this method will attempt to commit the current text and convert it to a `value`.
    Since:
      9

  - ### cancelEdit

    public final void cancelEdit()
    If the Spinner is `editable`, calling this method will attempt to replace the editor text with the last committed `value`.
    Since:
      9

  - ### getValue

    public final T getValue()
    Gets the value of the `value` property.
    Property description:
      The value property on Spinner is a read-only property, as it is bound to the SpinnerValueFactory `value property`. Should the `value factory` change, this value property will be unbound from the old value factory and bound to the new one.

      If developers wish to modify the value property, they may do so with code in the following form:

          Object newValue = ...;
          spinner.getValueFactory().setValue(newValue);

    Returns:
      the value of the `value` property
    See Also:
      - `valueProperty()`

  - ### valueProperty

    public final ReadOnlyObjectProperty<T> valueProperty()
    The value property on Spinner is a read-only property, as it is bound to the SpinnerValueFactory `value property`. Should the `value factory` change, this value property will be unbound from the old value factory and bound to the new one.

    If developers wish to modify the value property, they may do so with code in the following form:

        Object newValue = ...;
        spinner.getValueFactory().setValue(newValue);

    Returns:
      the `value` property
    See Also:
      - `getValue()`

  - ### setValueFactory

    public final void setValueFactory(SpinnerValueFactory<T> value)
    Sets the value of the `valueFactory` property.
    Property description:
      The value factory is the model behind the JavaFX Spinner control - without a value factory installed a Spinner is unusable. It is the role of the value factory to handle almost all aspects of the Spinner, including:
      - Representing the current state of the `value`,
      - `Incrementing` and `decrementing` the value, with one or more steps per call,
      - `Converting` text input from the user (via the Spinner `editor`,
      - Converting `objects to user-readable strings` for display on screen
    Parameters:
      `value` - the value for the `valueFactory` property
    See Also:
      - `getValueFactory()`
      - `valueFactoryProperty()`

  - ### getValueFactory

    public final SpinnerValueFactory<T> getValueFactory()
    Gets the value of the `valueFactory` property.
    Property description:
      The value factory is the model behind the JavaFX Spinner control - without a value factory installed a Spinner is unusable. It is the role of the value factory to handle almost all aspects of the Spinner, including:
      - Representing the current state of the `value`,
      - `Incrementing` and `decrementing` the value, with one or more steps per call,
      - `Converting` text input from the user (via the Spinner `editor`,
      - Converting `objects to user-readable strings` for display on screen
    Returns:
      the value of the `valueFactory` property
    See Also:
      - `setValueFactory(SpinnerValueFactory)`
      - `valueFactoryProperty()`

  - ### valueFactoryProperty

    public final ObjectProperty<SpinnerValueFactory<T>> valueFactoryProperty()
    The value factory is the model behind the JavaFX Spinner control - without a value factory installed a Spinner is unusable. It is the role of the value factory to handle almost all aspects of the Spinner, including:
    - Representing the current state of the `value`,
    - `Incrementing` and `decrementing` the value, with one or more steps per call,
    - `Converting` text input from the user (via the Spinner `editor`,
    - Converting `objects to user-readable strings` for display on screen
    Returns:
      the `valueFactory` property
    See Also:
      - `getValueFactory()`
      - `setValueFactory(SpinnerValueFactory)`

  - ### setEditable

    public final void setEditable(boolean value)
    Sets the value of the `editable` property.
    Property description:
      The editable property is used to specify whether user input is able to be typed into the Spinner `editor`. If editable is true, user input will be received once the user types and presses the Enter key. At this point the input is passed to the SpinnerValueFactory `converter` `StringConverter.fromString(String)` method. The returned value from this call (of type T) is then sent to the `SpinnerValueFactory.setValue(Object)` method. If the value is valid, it will remain as the value. If it is invalid, the value factory will need to react accordingly and back out this change.
    Default value:
      `false`
    Parameters:
      `value` - the value for the `editable` property
    See Also:
      - `isEditable()`
      - `editableProperty()`

  - ### isEditable

    public final boolean isEditable()
    Gets the value of the `editable` property.
    Property description:
      The editable property is used to specify whether user input is able to be typed into the Spinner `editor`. If editable is true, user input will be received once the user types and presses the Enter key. At this point the input is passed to the SpinnerValueFactory `converter` `StringConverter.fromString(String)` method. The returned value from this call (of type T) is then sent to the `SpinnerValueFactory.setValue(Object)` method. If the value is valid, it will remain as the value. If it is invalid, the value factory will need to react accordingly and back out this change.
    Default value:
      `false`
    Returns:
      the value of the `editable` property
    See Also:
      - `setEditable(boolean)`
      - `editableProperty()`

  - ### editableProperty

    public final BooleanProperty editableProperty()
    The editable property is used to specify whether user input is able to be typed into the Spinner `editor`. If editable is true, user input will be received once the user types and presses the Enter key. At this point the input is passed to the SpinnerValueFactory `converter` `StringConverter.fromString(String)` method. The returned value from this call (of type T) is then sent to the `SpinnerValueFactory.setValue(Object)` method. If the value is valid, it will remain as the value. If it is invalid, the value factory will need to react accordingly and back out this change.
    Default value:
      `false`
    Returns:
      the `editable` property
    See Also:
      - `isEditable()`
      - `setEditable(boolean)`

  - ### editorProperty

    public final ReadOnlyObjectProperty<TextField> editorProperty()
    The editor used by the Spinner control.
    Returns:
      the editor property
    See Also:
      - `getEditor()`

  - ### getEditor

    public final TextField getEditor()
    Gets the value of the `editor` property.
    Property description:
      The editor used by the Spinner control.
    Returns:
      the value of the `editor` property
    See Also:
      - `editorProperty()`

  - ### promptTextProperty

    public final StringProperty promptTextProperty()
    The prompt text to display in the `Spinner`, or `null` if no prompt text is displayed.
    Default value:
      Empty string
    Returns:
      the prompt text property
    Since:
      9
    See Also:
      - `getPromptText()`
      - `setPromptText(String)`

  - ### getPromptText

    public final String getPromptText()
    Gets the value of the `promptText` property.
    Property description:
      The prompt text to display in the `Spinner`, or `null` if no prompt text is displayed.
    Default value:
      Empty string
    Returns:
      the value of the `promptText` property
    Since:
      9
    See Also:
      - `setPromptText(String)`
      - `promptTextProperty()`

  - ### setPromptText

    public final void setPromptText(String value)
    Sets the value of the `promptText` property.
    Property description:
      The prompt text to display in the `Spinner`, or `null` if no prompt text is displayed.
    Default value:
      Empty string
    Parameters:
      `value` - the value for the `promptText` property
    Since:
      9
    See Also:
      - `getPromptText()`
      - `promptTextProperty()`

  - ### initialDelayProperty

    public final ObjectProperty<Duration> initialDelayProperty()
    The duration that the mouse has to be pressed on an arrow button before the next value steps. Successive step duration is set using `repeat delay`.
    Default value:
      300ms
    Returns:
      initial delay property
    Since:
      11
    See Also:
      - `getInitialDelay()`
      - `setInitialDelay(Duration)`

  - ### setInitialDelay

    public final void setInitialDelay(Duration value)
    Sets the value of the `initialDelay` property.
    Property description:
      The duration that the mouse has to be pressed on an arrow button before the next value steps. Successive step duration is set using `repeat delay`.
    Default value:
      300ms
    Parameters:
      `value` - the value for the `initialDelay` property
    Since:
      11
    See Also:
      - `getInitialDelay()`
      - `initialDelayProperty()`

  - ### getInitialDelay

    public final Duration getInitialDelay()
    Gets the value of the `initialDelay` property.
    Property description:
      The duration that the mouse has to be pressed on an arrow button before the next value steps. Successive step duration is set using `repeat delay`.
    Default value:
      300ms
    Returns:
      the value of the `initialDelay` property
    Since:
      11
    See Also:
      - `setInitialDelay(Duration)`
      - `initialDelayProperty()`

  - ### repeatDelayProperty

    public final ObjectProperty<Duration> repeatDelayProperty()
    The duration that the mouse has to be pressed for each successive step after the first value steps. Initial step duration is set using `initial delay`.
    Default value:
      60ms
    Returns:
      repeat delay property
    Since:
      11
    See Also:
      - `getRepeatDelay()`
      - `setRepeatDelay(Duration)`

  - ### setRepeatDelay

    public final void setRepeatDelay(Duration value)
    Sets the value of the `repeatDelay` property.
    Property description:
      The duration that the mouse has to be pressed for each successive step after the first value steps. Initial step duration is set using `initial delay`.
    Default value:
      60ms
    Parameters:
      `value` - the value for the `repeatDelay` property
    Since:
      11
    See Also:
      - `getRepeatDelay()`
      - `repeatDelayProperty()`

  - ### getRepeatDelay

    public final Duration getRepeatDelay()
    Gets the value of the `repeatDelay` property.
    Property description:
      The duration that the mouse has to be pressed for each successive step after the first value steps. Initial step duration is set using `initial delay`.
    Default value:
      60ms
    Returns:
      the value of the `repeatDelay` property
    Since:
      11
    See Also:
      - `setRepeatDelay(Duration)`
      - `repeatDelayProperty()`

  - ### getClassCssMetaData

    public static List<CssMetaData<? extends Styleable, ?>> getClassCssMetaData()
    Gets the `CssMetaData` associated with this class, which may include the `CssMetaData` of its superclasses.
    Returns:
      the `CssMetaData`
    Since:
      11

  - ### getControlCssMetaData

    public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData()
    Description copied from class: `Control`
    Gets the unmodifiable list of the control's CSS-styleable properties.
    Overrides:
      `getControlCssMetaData` in class `Control`
    Returns:
      the unmodifiable list of the control's CSS-styleable properties