# Interface Skin<C extends Skinnable>

Type Parameters:
  `C` - A subtype of Skinnable that the Skin represents. This allows for Skin implementation to access the `Skinnable` implementation, which is usually a `Control` implementation.

All Known Implementing Classes:
  `AccordionSkin`, `ButtonBarSkin`, `ButtonSkin`, `CellSkinBase`, `CheckBoxSkin`, `ChoiceBoxSkin`, `CodeAreaSkin`, `ColorPickerSkin`, `ComboBoxBaseSkin`, `ComboBoxListViewSkin`, `ComboBoxPopupControl`, `ContextMenuSkin`, `DateCellSkin`, `DatePickerSkin`, `HTMLEditorSkin`, `HyperlinkSkin`, `LabeledSkinBase`, `LabelSkin`, `ListCellSkin`, `ListViewSkin`, `MenuBarSkin`, `MenuButtonSkin`, `MenuButtonSkinBase`, `PaginationSkin`, `ProgressBarSkin`, `ProgressIndicatorSkin`, `RadioButtonSkin`, `RichTextAreaSkin`, `ScrollBarSkin`, `ScrollPaneSkin`, `SeparatorSkin`, `SkinBase`, `SliderSkin`, `SpinnerSkin`, `SplitMenuButtonSkin`, `SplitPaneSkin`, `TableCellSkin`, `TableCellSkinBase`, `TableRowSkin`, `TableRowSkinBase`, `TableViewSkin`, `TableViewSkinBase`, `TabPaneSkin`, `TextAreaSkin`, `TextFieldSkin`, `TextInputControlSkin`, `TitledPaneSkin`, `ToggleButtonSkin`, `ToolBarSkin`, `TooltipSkin`, `TreeCellSkin`, `TreeTableCellSkin`, `TreeTableRowSkin`, `TreeTableViewSkin`, `TreeViewSkin`, `VirtualContainerBase`

public interface Skin<C extends Skinnable>
An interface for defining the visual representation of user interface controls.

A Skin implementation should generally avoid modifying its control outside of `install()` method. The life cycle of a Skin implementation is as follows:

- instantiation
- configuration, such as passing of dependencies and parameters
- when the skin is set on a `Skinnable`:
  - uninstalling of the old skin via its `dispose()` method
  - installing of the new skin via `install()`

Since:
  JavaFX 2.0

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `dispose()`
  Called when a previously installed skin is about to be removed from its associated control.
  `Node`
  `getNode()`
  Gets the Node which represents this Skin.
  `C`
  `getSkinnable()`
  Gets the Skinnable to which this Skin is assigned.
  `default void`
  `install()`
  Called once when `Skin` is set.

- ## Method Details

  - ### getSkinnable

    C getSkinnable()
    Gets the Skinnable to which this Skin is assigned. A Skin must be created for one and only one Skinnable. This value will only ever go from a non-null to null value when the Skin is removed from the Skinnable, and only as a consequence of a call to `dispose()`.

    The caller who constructs a Skinnable must also construct a Skin and properly establish the relationship between the Control and its Skin.

    Returns:
      A non-null Skinnable, or null value if disposed.

  - ### getNode

    Node getNode()
    Gets the Node which represents this Skin. This must never be null, except after a call to `dispose()`, and must never change except when changing to null.
    Returns:
      A non-null Node, except when the Skin has been disposed.

  - ### install

    default void install()
    Called once when `Skin` is set. This method is called after the previous skin, if any, has been uninstalled via its `dispose()` method. The skin can now safely make changes to its associated control, like registering listeners, adding child nodes, and modifying properties and event handlers.

    Application code must not call this method.

    The default implementation of this method does nothing.

    Implementation Note:
      Skins only need to implement `install` if they need to make direct changes to the control like overwriting properties or event handlers. Such skins should ensure these changes are undone in their `dispose()` method.
    Since:
      20

  - ### dispose

    void dispose()
    Called when a previously installed skin is about to be removed from its associated control. This allows the skin to do clean up, like removing listeners and bindings, and undo any changes to the control's properties. After this method completes, `getSkinnable()` and `getNode()` should return `null`.

    Calling `dispose()` more than once has no effect.