Package org.pushingpixels.substance.api

# Class SubstanceLookAndFeel

java.lang.Object
javax.swing.LookAndFeel
javax.swing.plaf.basic.BasicLookAndFeel
org.pushingpixels.substance.api.SubstanceLookAndFeel

All Implemented Interfaces:
  `Serializable`

Direct Known Subclasses:
  `SubstanceAutumnLookAndFeel`, `SubstanceBusinessBlackSteelLookAndFeel`, `SubstanceBusinessBlueSteelLookAndFeel`, `SubstanceBusinessLookAndFeel`, `SubstanceCeruleanLookAndFeel`, `SubstanceChallengerDeepLookAndFeel`, `SubstanceCremeCoffeeLookAndFeel`, `SubstanceCremeLookAndFeel`, `SubstanceDustCoffeeLookAndFeel`, `SubstanceDustLookAndFeel`, `SubstanceEmeraldDuskLookAndFeel`, `SubstanceGeminiLookAndFeel`, `SubstanceGraphiteAquaLookAndFeel`, `SubstanceGraphiteGlassLookAndFeel`, `SubstanceGraphiteLookAndFeel`, `SubstanceMagellanLookAndFeel`, `SubstanceMarinerLookAndFeel`, `SubstanceMistAquaLookAndFeel`, `SubstanceMistSilverLookAndFeel`, `SubstanceModerateLookAndFeel`, `SubstanceNebulaBrickWallLookAndFeel`, `SubstanceNebulaLookAndFeel`, `SubstanceOfficeBlack2007LookAndFeel`, `SubstanceOfficeBlue2007LookAndFeel`, `SubstanceOfficeSilver2007LookAndFeel`, `SubstanceRavenLookAndFeel`, `SubstanceSaharaLookAndFeel`, `SubstanceTwilightLookAndFeel`

public abstract class SubstanceLookAndFeel extends BasicLookAndFeel

Main class for Substance look and feel. All static methods in this class should be called when Substance is the currently set look and feel unless explicitly stated otherwise.

Since version 5.0 this class is abstract. There are three options to use Substance:

- Use one of the core skin-based look-and-feels in the `org.pushingpixels.substance.skin` package.
- Extend this class and pass a skin instance to the `SubstanceLookAndFeel(SubstanceSkin)` constructor.
- Call `setSkin(String)` or `setSkin(SubstanceSkin)` static methods. These methods do not require Substance to be the current look-and-feel.

See Also:
  - Serialized Form

## Field Summary

Fields
Modifier and Type
Field
Description
`static final String`
`BUTTON_NO_MIN_SIZE_PROPERTY`
Client property name for ignoring the default (minimum) dimension for a single button.
`static final String`
`BUTTON_OPEN_SIDE_PROPERTY`
Client property name for specifying an open side for a single button.
`static final String`
`BUTTON_PAINT_NEVER_PROPERTY`
Client property name for specifying that a single button / all application buttons should not paint the background.
`static final String`
`BUTTON_SHAPER_PROPERTY`
Property name for specifying outline shaper.
`static final String`
`BUTTON_SIDE_PROPERTY`
Client property name for specifying a straight side for a single button.
`static final String`
`COLORIZATION_FACTOR`
Client property name for specifying the colorization amount applied to the background and foreground of the current color scheme and the specific control.
`static final String`
`COMBO_BOX_POPUP_FLYOUT_ORIENTATION`
Client property name for specifying combo popup flyout orientation.
`static final String`
`COMBO_POPUP_PROTOTYPE`
Property name for specifying the combobox popup prototype display value which is used to compute the width of the popup at runtime.
`static final String`
`CORNER_RADIUS`
Client property name for specifying the corner radius for buttons.
`protected KeyboardFocusManager`
`currentKeyboardFocusManager`
The current keyboard focus manager - fix for defect 208.
`static final String`
`FLAT_PROPERTY`
Property name for specifying that the component should be painted flat (no background / border) when it's inactive.
`static final String`
`FOCUS_KIND`
Client property name for specifying the kind of focus indication on buttons, check boxes and radio buttons.
`protected PropertyChangeListener`
`focusOwnerChangeListener`
Change listener on keyboard focus manager - fix for defect 208.
`static final String`
`HEAP_STATUS_TRACE_FILE`
VM property name for specifying the heap status trace file.
`protected static final Set<LocaleChangeListener>`
`localeChangeListeners`
List of all listeners on changing locales.
`static final String`
`MENU_GUTTER_FILL_KIND`
Property name for specifying menu gutter fill kind.
`protected String`
`name`
The name of this look-and-feel instance.
`static final String`
`PASSWORD_ECHO_PER_CHAR`
Client property name for specifying the number of echo characters for each password character.
`static final String`
`PLUGIN_XML`
The name of plugin configuration XML resource name.
`static final String`
`SCROLL_PANE_BUTTONS_POLICY`
Client property name for specifying scroll pane button policy.
`static final String`
`SHOW_EXTRA_WIDGETS`
Property name for specifying that extra UI elements (such as menu items in system menu or lock borders) should be shown.
`protected SubstanceSkin`
`skin`
The skin of this look-and-feel instance.
`static final String`
`SKIN_PROPERTY`
Property name for specifying a skin to be used on the specific root pane.
`protected static final Set<SkinChangeListener>`
`skinChangeListeners`
List of all listeners on skin changes.
`protected static final String`
`SUBSTANCE_FONT_POLICY_KEY`
Internal client property name for storing application-specific font policy.
`protected static final String`
`SUBSTANCE_INPUT_MAP_SET_KEY`
Internal client property name for storing application-specific input map set.
`static final String`
`TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION`
Client property name for specifying that only the close button of a marked-as-modified tab component should pulsate.
`static final String`
`TABBED_PANE_CLOSE_BUTTONS_PROPERTY`
Client property name for adding close buttons on tabs.
`static final String`
`TABBED_PANE_CLOSE_CALLBACK`
Client property name for specifying the callback for deciding on the tab close type.
`static final String`
`TABBED_PANE_CONTENT_BORDER_KIND`
Client property name for specifying the content pane border kind.
`static final String`
`TABBED_PANE_ROTATE_SIDE_TABS`
Client property name for specifying wheter tabs shown on the left or right will be rotated vertically.
`static final String`
`TABLE_LEADING_VERTICAL_LINE`
Client property name for specifying the leading vertical line on a table.
`static final String`
`TABLE_TRAILING_VERTICAL_LINE`
Client property name for specifying the trailing verticle line on a table.
`static final String`
`TRACE_FILE`
VM property name for specifying the trace file.
`static final org.pushingpixels.lafwidget.animation.AnimationFacet`
`TREE_SMART_SCROLL_ANIMATION_KIND`
Smart tree scroll animation facet.
`static final String`
`USE_THEMED_DEFAULT_ICONS`
Client property name for specifying that icons on controls such as buttons, toggle buttons, labels, tabs and menu items should match the color of the current color scheme when they are in default state.
`static final String`
`WATERMARK_VISIBLE`
Client property name for requesting that watermark should be painted on the component and its descendants.
`static final String`
`WINDOW_AUTO_DEACTIVATE`
UIManager property name for specifying that whether any JRootPane with Substance window decorations should be attentive to the active or selected state of the respective JFrame or JInternalFrame.
`static final String`
`WINDOW_MODIFIED`
Client property name for specifying that contents of a frame, dialog, internal frame, desktop icon or tab have been modified and not saved.
`static final String`
`WINDOW_ROUNDED_CORNERS`
Client property name for specifying that whether any JRootPane with Substance window decorations should be drawn with rounded corners in it's decoration frame.
`static final String`
`WINDOW_ROUNDED_CORNERS_PROPERTY`
VM property name for specifying that whether any JRootPane with Substance window decorations should be drawn with rounded corners in it's decoration frame.

## Constructor Summary

Constructors
Modifier
Constructor
Description
`protected`
`SubstanceLookAndFeel(SubstanceSkin skin)`
Creates a new skin-based Substance look-and-feel.

## Method Summary

Modifier and Type
Method
Description
`static Map<String,SkinInfo>`
`getAllSkins()`
Returns all available skins.
`static Set<BaseTabCloseListener>`
`getAllTabCloseListeners()`
Returns the set of all listeners registered on tab-close events on all tabbed panes.
`static Set<BaseTabCloseListener>`
`getAllTabCloseListeners(JTabbedPane tabbedPane)`
Returns all listeners registered on tab closing of the specified tabbed pane.
`static SubstanceSkin`
`getCurrentSkin()`
Returns the current global skin.
`static SubstanceSkin`
`getCurrentSkin(Component c)`
Returns the current skin for the specified component.
`static DecorationAreaType`
`getDecorationType(Component comp)`
Returns the decoration area type of the specified component.
`UIDefaults`
`getDefaults()`
`String`
`getDescription()`
`Icon`
`getDisabledIcon(JComponent component, Icon icon)`
`static FontPolicy`
`getFontPolicy()`
Looks up and retrieves the `FontPolicy` used by the Substance family.
`String`
`getID()`
`static DecorationAreaType`
`getImmediateDecorationType(Component comp)`
Returns the immediate decoration area type of the specified component.
`static InputMapSet`
`getInputMapSet()`
Looks up and retrieves the `InputMapSet` used by the Substance family.
`static ResourceBundle`
`getLabelBundle()`
Retrieves the current label bundle.
`static ResourceBundle`
`getLabelBundle(Locale locale)`
Retrieves the label bundle for the specified locale.
`static Set<LocaleChangeListener>`
`getLocaleListeners()`
Returns all listeners registered on locale change.
`String`
`getName()`
`boolean`
`getSupportsWindowDecorations()`
`static JComponent`
`getTitlePaneComponent(Window window)`
Returns the title pane of the specified top-level window.
`protected void`
`initClassDefaults(UIDefaults table)`
`protected void`
`initComponentDefaults(UIDefaults table)`
`void`
`initialize()`
`protected static void`
`initPluginsIfNecessary()`
Initializes the plugins if necessary.
`static boolean`
`isCurrentLookAndFeel()`
Checks whether Substance is the current look-and-feel.
`boolean`
`isNativeLookAndFeel()`
`boolean`
`isSupportedLookAndFeel()`
`static boolean`
`isToUseConstantThemesOnDialogs()`
Checks whether the `JOptionPane`s created with predefined message types should use constant color schemes for the icons.
`static void`
`registerLocaleChangeListener(LocaleChangeListener localeListener)`
Registers a new listener on locale change.
`static void`
`registerSkinChangeListener(SkinChangeListener skinChangeListener)`
Registers a new listener on skin change.
`static void`
`registerTabCloseChangeListener(JTabbedPane tabbedPane, BaseTabCloseListener tabCloseListener)`
Registers the specified listener on tab-close events on the specified tabbed pane.
`static void`
`registerTabCloseChangeListener(BaseTabCloseListener tabCloseListener)`
Registers the specified listener on tab-close events on all tabbed panes.
`static void`
`resetLabelBundle()`
Resets the current label bundle.
`static void`
`setDecorationType(JComponent comp, DecorationAreaType type)`
Sets the decoration type of the specified component and all its children.
`static void`
`setFontPolicy(FontPolicy fontPolicy)`
Sets the `FontPolicy` to be used with Substance family.
`static void`
`setInputMapSet(InputMapSet inputMapSet)`
Sets the `InputMapSet` to be used with Substance family.
`static void`
`setLabelBundleClassLoader(ClassLoader labelBundleClassLoader)`
Sets the class loader for `LABEL_BUNDLE`.
`static boolean`
`setSkin(String skinClassName)`
Sets the specified skin.
`static boolean`
`setSkin(SubstanceSkin newSkin)`
Sets the specified skin.
`static void`
`setToUseConstantThemesOnDialogs(boolean toUseConstantThemesOnDialogs)`
Sets the new setting for the icons of the `JOptionPane`s created with predefined message types.
`static void`
`setWidgetVisible(JRootPane rootPane, boolean visible, SubstanceConstants.SubstanceWidgetType... substanceWidgets)`
Sets the visibility of the specified widget kind(s).
`void`
`uninitialize()`
`static void`
`unregisterLocaleChangeListener(LocaleChangeListener localeListener)`
Unregisters a listener on locale change.
`static void`
`unregisterSkinChangeListener(SkinChangeListener skinChangeListener)`
Unregisters a listener on skin change.
`static void`
`unregisterTabCloseChangeListener(JTabbedPane tabbedPane, BaseTabCloseListener tabCloseListener)`
Unregisters the specified listener on tab-close events on the specified tabbed pane.
`static void`
`unregisterTabCloseChangeListener(BaseTabCloseListener tabCloseListener)`
Unregisters the specified listener on tab-close events on all tabbed panes.

### Methods inherited from class javax.swing.plaf.basic.BasicLookAndFeel

`createAudioAction, getAudioActionMap, initSystemColorDefaults, loadSystemColors, playSound`

### Methods inherited from class javax.swing.LookAndFeel

`getDesktopPropertyValue, getDisabledSelectedIcon, getLayoutStyle, installBorder, installColors, installColorsAndFont, installProperty, loadKeyBindings, makeComponentInputMap, makeIcon, makeInputMap, makeKeyBindings, provideErrorFeedback, toString, uninstallBorder`

### Methods inherited from class java.lang.Object

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

## Field Details

### PLUGIN_XML

public static final String PLUGIN_XML
The name of plugin configuration XML resource name. This is used for the laf-plugin support layer of third-party components.

See Also:
  - Constant Field Values

### skinChangeListeners

protected static final Set<SkinChangeListener> skinChangeListeners
List of all listeners on skin changes.

### localeChangeListeners

protected static final Set<LocaleChangeListener> localeChangeListeners
List of all listeners on changing locales.

### focusOwnerChangeListener

protected PropertyChangeListener focusOwnerChangeListener
Change listener on keyboard focus manager - fix for defect 208.

### currentKeyboardFocusManager

protected KeyboardFocusManager currentKeyboardFocusManager
The current keyboard focus manager - fix for defect 208.

### TREE_SMART_SCROLL_ANIMATION_KIND

public static final org.pushingpixels.lafwidget.animation.AnimationFacet TREE_SMART_SCROLL_ANIMATION_KIND
Smart tree scroll animation facet. Disabled by default, use `AnimationConfigurationManager.allowAnimations(AnimationFacet)` to enable.

Smart tree scroll is relevant for scroll panes containing a tree. When enabled, it automatically scrolls the tree horizontally when the viewport shows mainly empty area (especially relevant for multi-level trees with narrow viewports).

Since:
  4.0

### WATERMARK_VISIBLE

public static final String WATERMARK_VISIBLE
Client property name for requesting that watermark should be painted on the component and its descendants. This property can be set either as client property on some component or as global property on `UIManager`. The value should be either `Boolean.TRUE` or `Boolean.FALSE`.

In order to compute whether the current watermark should be painted on a given component, its hierarchy is traversed bottom up. The first component that has this property set defines the watermark visibility. If neither component nor its ancestors define this property, the global setting on `UIManager` is checked. If there is no global setting, the watermark is not ignored (it is painted).

There is special default setting for trees, tables, lists and text components. These show watermark only when this property is explicitly set to `Boolean.TRUE` on the component itself, one of its ancestors or the `UIManager`.

Since:
  version 5.0
See Also:
  - Constant Field Values

### BUTTON_NO_MIN_SIZE_PROPERTY

public static final String BUTTON_NO_MIN_SIZE_PROPERTY
Client property name for ignoring the default (minimum) dimension for a single button. This property can be set either on the specific button or as a global setting on `UIManager`. The value should be either `Boolean.TRUE` or `Boolean.FALSE`.

Note that `SubstanceButtonShaper` implementations are not required to respect this property. The current implementations of the default `StandardButtonShaper` and `ClassicButtonShaper` respect this property.

Example of marking a button to ignore minimum dimension settings:

`JButton button = new JButton("text");
button.putClientProperty(SubstanceLookAndFeel.BUTTON_NO_MIN_SIZE_PROPERTY,
Boolean.TRUE);`

Example of marking all application buttons to ignore minimum dimension settings:

`UIManager.put(SubstanceLookAndFeel.BUTTON_NO_MIN_SIZE_PROPERTY,
Boolean.TRUE);`

Since:
  version 2.1
See Also:
  - Constant Field Values

### BUTTON_PAINT_NEVER_PROPERTY

public static final String BUTTON_PAINT_NEVER_PROPERTY
Client property name for specifying that a single button / all application buttons should not paint the background. This property can be set on the specific button, its parent or as a global setting on `UIManager`. The value should be either `Boolean.TRUE` or `Boolean.FALSE`. Note that unlike the `FLAT_PROPERTY`, a button marked with this property will never show the background (will always be painted flat).

Example of marking a button to never paint background:

`JButton button = new JButton("text");
button.putClientProperty(SubstanceLookAndFeel.BUTTON_PAINT_NEVER_PROPERTY,
Boolean.TRUE);`

Example of marking all application buttons to never paint background:

`UIManager.put(SubstanceLookAndFeel.BUTTON_PAINT_NEVER_PROPERTY,
Boolean.TRUE);`

Since:
  version 2.3
See Also:
  - `FLAT_PROPERTY`
  - Constant Field Values

### BUTTON_SIDE_PROPERTY

public static final String BUTTON_SIDE_PROPERTY
Client property name for specifying a straight side for a single button. This property must be set on the specific button. The value can be:

- A value in `SubstanceConstants.Side` enum.
- Set of values in `SubstanceConstants.Side` enum.

Note that the `SubstanceButtonShaper` implementations are not required to respect this property. The default `StandardButtonShaper` and `ClassicButtonShaper` respect this property.

Example of marking a button to have straight north side:

`JButton button = new JButton("text");
button.putClientProperty(SubstanceLookAndFeel.BUTTON_SIDE_PROPERTY,
SubstanceConstants.Side.RIGHT);`

Since:
  version 2.1
See Also:
  - `BUTTON_OPEN_SIDE_PROPERTY`
  - Constant Field Values

### BUTTON_OPEN_SIDE_PROPERTY

public static final String BUTTON_OPEN_SIDE_PROPERTY
Client property name for specifying an open side for a single button. This property must be set on the specific button. The value can be:

- A value in `SubstanceConstants.Side` enum.
- Set of values in `SubstanceConstants.Side` enum.

Example of marking a button to have open top and west sides:

`JButton button = new JButton("text");
Set<Side> openSides = EnumSet.of(Side.TOP, Side.WEST);
button.putClientProperty(SubstanceLookAndFeel.BUTTON_OPEN_SIDE_PROPERTY,
openSides);`

Since:
  version 3.1
See Also:
  - `BUTTON_SIDE_PROPERTY`
  - Constant Field Values

### CORNER_RADIUS

public static final String CORNER_RADIUS
Client property name for specifying the corner radius for buttons. Currently, this property is respected only on toolbar buttons. This property can be set on the specific toolbar button, on the specific toolbar (will hold for all buttons in the toolbar) or as a global setting on `UIManager`. The value should be a positive `Float`.

Example of specifying a (toolbar) button to have corner radius of 5 pixels:

`JButton button = new JButton("text");
button.putClientProperty(SubstanceLookAndFeel.CORNER_RADIUS,
Float.valueOf(5.0f));`

Example of specifying all buttons of a toolbar to have corner radius of 3 pixels:

`JToolBar toolbar = new JToolBar("toolbar");
toolbar.putClientProperty(SubstanceLookAndFeel.CORNER_RADIUS,
Float.valueOf(3.0f));`

Example of specifying all toolbar buttons to have corner radius of 0 pixels:

`UIManager.put(SubstanceLookAndFeel.CORNER_RADIUS, Float.valueOf(0.0f));`

Since:
  version 3.0
See Also:
  - Constant Field Values

### FLAT_PROPERTY

public static final String FLAT_PROPERTY
Property name for specifying that the component should be painted flat (no background / border) when it's inactive. This property should be specified on a specific component or its parent and must have either `Boolean.TRUE` or `Boolean.FALSE` value.

Example how to mark a button to appear flat:

`JButton button = new JButton("text");
button.putClientProperty(SubstanceLookAndFeel.FLAT_PROPERTY,
Boolean.TRUE);`

Since:
  version 3.0
See Also:
  - `BUTTON_PAINT_NEVER_PROPERTY`
  - Constant Field Values

### HEAP_STATUS_TRACE_FILE

public static final String HEAP_STATUS_TRACE_FILE
VM property name for specifying the heap status trace file. The trace file will contain information on the status of heap. The property value is used as a filename for tracing the heap status. Example for specifying the trace file name:

`-Dsubstancelaf.heapStatusTraceFile=C:/temp/myApp.heap.log`

Since:
  version 5.0
See Also:
  - Constant Field Values

### WINDOW_MODIFIED

public static final String WINDOW_MODIFIED
Client property name for specifying that contents of a frame, dialog, internal frame, desktop icon or tab have been modified and not saved. The property can be set on:

- `JRootPane` - the close button of the title pane of the matching frame / dialog will be animated (in case that the frame / dialog have decorated title pane). In case the root pane belongs to a `JInternalFrame` and that frame is iconified (to a `JInternalFrame.JDesktopIcon`), the close button of the its desktop icon is animated as well.
- `JComponent` in a `JTabbedPane`. Based on the `TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION` property presence, either the entire tab or its close button area is animated. In this case, this property must be set on the tab component itself, not on one of its child components.

The animation cycles between red, orange and yellow color schemes. In most cases (all but tabs not marked with `TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION` property), the animation will be visible only when the mouse hovers over the close button of the matching container (frame, dialog, internal frame, desktop icon, tab). The tooltip of the close button is changed as well to reflect that the container contents are marked as modified.

Here is a sample text editing application that illustrates the use of this property. Once the contents of the text pane are changed, the frame is marked as modified. The Save button marks the frame as not-modified. In the real application, the listener on this button will need to persist the changes as well.

`public class Changer extends JFrame {
public Changer() {
super("Changer");
this.setLayout(new BorderLayout());
JTextPane textArea = new JTextPane();
this.add(textArea, BorderLayout.CENTER);
textArea.getDocument().addDocumentListener(new DocumentListener() {
private void handleChange() {
getRootPane().putClientProperty(
SubstanceLookAndFeel.WINDOW_MODIFIED, Boolean.TRUE);
}
public void changedUpdate(DocumentEvent e) {
handleChange();
}
public void insertUpdate(DocumentEvent e) {
handleChange();
}
public void removeUpdate(DocumentEvent e) {
handleChange();
}
});
JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
JButton saveButton = new JButton("Save");
saveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
getRootPane().putClientProperty(
SubstanceLookAndFeel.WINDOW_MODIFIED, Boolean.FALSE);
}
});
buttons.add(saveButton);
this.add(buttons, BorderLayout.SOUTH);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String ... args) {
try {
UIManager.setLookAndFeel(new SubstanceLookAndFeel());
}
catch (Exception exc) {}
JFrame.setDefaultLookAndFeelDecorated(true);
Changer ch = new Changer();
ch.setPreferredSize(new Dimension(200, 200));
ch.setSize(ch.getPreferredSize());
ch.setLocationRelativeTo(null);
ch.setVisible(true);
}
}`

Since:
  version 2.1
See Also:
  - Constant Field Values

### WINDOW_AUTO_DEACTIVATE

public static final String WINDOW_AUTO_DEACTIVATE

UIManager property name for specifying that whether any JRootPane with Substance window decorations should be attentive to the active or selected state of the respective JFrame or JInternalFrame. This property can only be specified in the `UIManager` for this release. The value should be either `Boolean.TRUE` or `Boolean.FALSE`. The initial value depends on the specific skin chosen and will be false if not specified.

When active this property will cause the title pane and borders of JFrames and JInternal frames to toggle between {DecorationAreaType#PRIMARY_TITLE_PANE} / {DecorationAreaType#PRIMARY_TITLE_PANE_INACTIVE} or {DecorationAreaType#SECONDARY_TITLE_PANE} / {DecorationAreaType#SECONDARY_TITLE_PANE_INACTIVE} respectively when the respective containers active or selected property changes. If the Title pane of the window decoration is change to any other DecorationAreaType, then the type will not be toggled.

`UIManager.put(SubstanceLookAndFeel.WINDOW_AUTO_DEACTIVATE,
Boolean.TRUE);
`

Since:
  version 6.3
See Also:
  - Constant Field Values

### WINDOW_ROUNDED_CORNERS_PROPERTY

public static final String WINDOW_ROUNDED_CORNERS_PROPERTY

VM property name for specifying that whether any JRootPane with Substance window decorations should be drawn with rounded corners in it's decoration frame. This property is specified globally in via a system property. The value will be parsed by {Boolean.valueOf}, unless it is unset or an empty string, then it will default to true. A true value only enables rounded windows, they can be turned off via the UIManager or client properties. A false value disables all rounded corners and is used to remove artifacts from legacy video cards. This value is read when the Substance look and feel is initialized, and is not consulted later.

When unset or set to true this property will cause the title pane and borders of JFrames and JInternal frames to be rounded.

`-Dsubstancelaf.windowRoundedCorners=False`

Since:
  version 7.1
See Also:
  - Constant Field Values

### WINDOW_ROUNDED_CORNERS

public static final String WINDOW_ROUNDED_CORNERS

Client property name for specifying that whether any JRootPane with Substance window decorations should be drawn with rounded corners in it's decoration frame. This property can be specified per-window or globally in the UIManager or via client properties. The value should be either `Boolean.TRUE` or `Boolean.FALSE`. This value is subject to being globally set to false if the system property is set to false. When unset it defauls to true.

When unset or set to true this property will cause the title pane and borders of JFrames and JInternal frames to be rounded. `UIManager.put(SubstanceLookAndFeel.WINDOW_ROUNDED_CORNERS,
Boolean.FALSE);
// OR
someFrameOrDialog.putClientProperty(SubstanceLookAndFeel.WINDOW_ROUNDED_CORNERS,
Boolean.FALSE);
// for specific JInternalFrames, JFrames, or JDialogs`

Since:
  version 7.1
See Also:
  - Constant Field Values

### TABBED_PANE_CLOSE_BUTTONS_PROPERTY

public static final String TABBED_PANE_CLOSE_BUTTONS_PROPERTY
Client property name for adding close buttons on tabs. This property can be specified on a single tab component, on a `JTabbedPane` itself (will hold for all tab components that don't define this property) or on `UIManager`. The value should be either `Boolean.TRUE` or `Boolean.FALSE`. By default, the close buttons are not displayed.

Example of setting that all tabs in the application will have close buttons:

`UIManager.put(SubstanceLookAndFeel.TABBED_PANE_CLOSE_BUTTONS_PROPERTY,
Boolean.TRUE);`

A more complex example:

`UIManager.put(SubstanceLookAndFeel.TABBED_PANE_CLOSE_BUTTONS_PROPERTY,
Boolean.TRUE);
JTabbedPane jtpMain = new JTabbedPane();
JTabbedPane jtpSecondary = new JTabbedPane();
jtpSecondary.putClientProperty(SubstanceLookAndFeel.TABBED_PANE_CLOSE_BUTTONS_PROPERTY,
Boolean.FALSE);
JPanel panelSecondary = new JPanel();
jtpMain.addTab(jtpSecondary);
jtpMain.addTab(panelSecondary);
JPanel tab1 = new JPanel();
JPanel tab2 = new JPanel();
tab2.putClientProperty(SubstanceLookAndFeel.TABBED_PANE_CLOSE_BUTTONS_PROPERTY,
Boolean.TRUE);
jtpSecondary.addTab(tab1);
jtpSecondary.addTab(tab2);`

In the example above, the first first-level child (jtpSecondary) doesn't have the close button (since it overrides the global setting). The second first-level child tab (panelSecondary) has close button (from the global UIManager setting). The first second-level tab doesn't have the close button (setting inherited from the parent jtpSecondary tab that overrides the global setting). The second second-level tab has the close button (since its setting overrides the parent setting).

Since:
  version 2.1
See Also:
  - `TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION`
  - `TABBED_PANE_CLOSE_CALLBACK`
  - Constant Field Values

### TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION

public static final String TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION
Client property name for specifying that only the close button of a marked-as-modified tab component should pulsate. This property can be specified on a single tab component, on a `JTabbedPane` itself (will hold for all tab components that don't define this property) or on `UIManager`. The value should be either `Boolean.TRUE` or `Boolean.FALSE`. By default, the animation on modified tabs is on the entire tab rectangle. Note that this setting is only relevant for tabs marked with `WINDOW_MODIFIED` property.

Example of setting that all tabs in the application will have modified animation on close button:

`UIManager.put(SubstanceLookAndFeel.TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION,
Boolean.TRUE);`

A more complex example:

`UIManager.put(SubstanceLookAndFeel.TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION,
Boolean.TRUE);
JTabbedPane jtpMain = new JTabbedPane();
JTabbedPane jtpSecondary = new JTabbedPane();
jtpSecondary.putClientProperty(SubstanceLookAndFeel.TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION,
Boolean.FALSE);
JPanel panelSecondary = new JPanel();
jtpMain.addTab(jtpSecondary);
jtpMain.addTab(panelSecondary);
JPanel tab1 = new JPanel();
JPanel tab2 = new JPanel();
tab2.putClientProperty(SubstanceLookAndFeel.TABBED_PANE_CLOSE_BUTTONS_MODIFIED_ANIMATION,
Boolean.TRUE);
jtpSecondary.addTab(tab1);
jtpSecondary.addTab(tab2);`

In the example above, the first first-level child (jtpSecondary) has the animation on the entire tab (since it overrides the global setting). The second first-level child tab (panelSecondary) has animation on the close button (from the global UIManager setting). The first second-level tab has the animation on the entire tab (setting inherited from the parent jtpSecondary tab that overrides the global setting). The second second-level tab has animation on the close button (since its setting overrides the parent setting).

Since:
  version 2.2
See Also:
  - `TABBED_PANE_CLOSE_BUTTONS_PROPERTY`
  - `TABBED_PANE_CLOSE_CALLBACK`
  - Constant Field Values

### TABBED_PANE_CLOSE_CALLBACK

public static final String TABBED_PANE_CLOSE_CALLBACK
Client property name for specifying the callback for deciding on the tab close type. This property can be specified on a single tab component, on a `JTabbedPane` itself (will hold for all tab components that don't define this property) or on `UIManager`. The value should be an instance of `TabCloseCallback`. Note that this setting is only relevant for tabs marked with `TABBED_PANE_CLOSE_BUTTONS_PROPERTY` property.

Example of custom tab close callback set on a tabbed pane:

`TabCloseCallback closeCallback = new TabCloseCallback() {
public TabCloseKind onAreaClick(JTabbedPane tabbedPane,
int tabIndex, MouseEvent mouseEvent) {
if (mouseEvent.getButton() != MouseEvent.BUTTON3)
return TabCloseKind.NONE;
if (mouseEvent.isShiftDown()) {
return TabCloseKind.ALL;
}
return TabCloseKind.THIS;
}
public TabCloseKind onCloseButtonClick(JTabbedPane tabbedPane,
int tabIndex, MouseEvent mouseEvent) {
if (mouseEvent.isAltDown()) {
return TabCloseKind.ALL_BUT_THIS;
}
if (mouseEvent.isShiftDown()) {
return TabCloseKind.ALL;
}
return TabCloseKind.THIS;
}
public String getAreaTooltip(JTabbedPane tabbedPane, int tabIndex) {
return null;
}
public String getCloseButtonTooltip(JTabbedPane tabbedPane,
int tabIndex) {
StringBuffer result = new StringBuffer();
result.append("<html><body>");
result.append("Mouse click closes <b>"
+ tabbedPane.getTitleAt(tabIndex) + "</b> tab");
result.append("<br><b>Alt</b>-Mouse click closes all tabs but <b>"
+ tabbedPane.getTitleAt(tabIndex) + "</b> tab");
result.append("<br><b>Shift</b>-Mouse click closes all tabs");
result.append("</body></html>");
return result.toString();
}
};
JTabbedPane jtp = new JTabbedPane();
jtp.putClientProperty(
SubstanceLookAndFeel.TABBED_PANE_CLOSE_CALLBACK,
closeCallback);`

Since:
  version 2.3
See Also:
  - Constant Field Values

### TABBED_PANE_CONTENT_BORDER_KIND

public static final String TABBED_PANE_CONTENT_BORDER_KIND
Client property name for specifying the content pane border kind. This property can be specified either on a single `JTabbedPane` or on `UIManager`. The value should be one of `SubstanceConstants.TabContentPaneBorderKind` enum. By default, the border kind is `SubstanceConstants.TabContentPaneBorderKind.DOUBLE_FULL`.

Example of setting that all tabbed panes in the application have single full border (default setting prior to version 4.1):

`UIManager.put(SubstanceLookAndFeel.TABBED_PANE_CONTENT_BORDER_KIND,
TabContentPaneBorderKind.SINGLE_FULL);`

Example of specifying that the specific tabbed pane has single full border (default setting prior to version 4.1):

`JTabbedPane jtpMain = new JTabbedPane();
jtpMain.putClientProperty(SubstanceLookAndFeel.TABBED_PANE_CONTENT_BORDER_KIND,
TabContentPaneBorderKind.SINGLE_FULL);`

Since:
  version 4.1
See Also:
  - Constant Field Values

### TABBED_PANE_ROTATE_SIDE_TABS

public static final String TABBED_PANE_ROTATE_SIDE_TABS
Client property name for specifying wheter tabs shown on the left or right will be rotated vertically. This property can be specified either on a single `JTabbedPane` or on * `UIManager`. The value should a Boolean. By default, the rotation is enabled.

Example of setting that all tabbed panes should not rotate the tabs:

`UIManager.put(SubstanceLookAndFeel.TABBED_PANE_ROTATE_SIDE_TABS,
Boolean.FALSE);`

Example of specifying that the specific tabbed pane tabbed panes should not rotate the tabs:

`JTabbedPane jtpMain = new JTabbedPane();
jtpMain.putClientProperty(SubstanceLookAndFeel.TABBED_PANE_ROTATE_SIDE_TABS,
Boolean.FALSE);`

Since:
  version 7.2
See Also:
  - Constant Field Values

### TABLE_LEADING_VERTICAL_LINE

public static final String TABLE_LEADING_VERTICAL_LINE
Client property name for specifying the leading vertical line on a table. Normally the presence of the leading vertical line on a table is driven by the presence or absence of a row header.

- The default `null` - The line is driven by the presence of row headers
- `true` - The line is always drawn.
- `false` - The line is never drawn.

`JTable jtable = new JTable();
jtable.putClientProperty(SubstanceLookAndFeel.TABLE_LEADING_VERTICAL_LINE,
false);`

Since:
  version 7.2
See Also:
  - Constant Field Values

### TABLE_TRAILING_VERTICAL_LINE

public static final String TABLE_TRAILING_VERTICAL_LINE
Client property name for specifying the trailing verticle line on a table. Normally the presence of the leading vertical line on a table is driven by the width of the table and the width of the children

- The default `null` - The line is driven by whether it fits within the view of the scroll pane (true) or not (false)
- `true` - The line is always drawn.
- `false` - The line is never drawn.

`JTable jtable = new JTable();
jtable.putClientProperty(SubstanceLookAndFeel.TABLE_TRAILING_VERTICAL_LINE,
false);`

Since:
  version 7.2
See Also:
  - Constant Field Values

### COMBO_BOX_POPUP_FLYOUT_ORIENTATION

public static final String COMBO_BOX_POPUP_FLYOUT_ORIENTATION
Client property name for specifying combo popup flyout orientation. This property can be set on either a specific `JComboBox` or globally on `UIManager`. The value should be one of the `Integer`s below:

- The default `SwingConstants.SOUTH` - the popup is displayed directly below the combo aligned to the left.
- `SwingConstants.NORTH` - the popup is displayed directly above the combo aligned to the left.
- `SwingConstants.EAST` - the popup is displayed to the left of the combo aligned to the top.
- `SwingConstants.WEST` - the popup is displayed to the right of the combo aligned to the top.
- `SwingConstants.CENTER` - the popup is displayed centered vertically over the combo aligned to the left.

Note that the combo arrow changes in accordance with the combo popup flyout orientation. Example of setting a combobox with a custom flyout orientation:

`JComboBox cb = new JComboBox(
new Object[] { "Ester", "Jordi", "Jordina", "Jorge", "Sergi" });
cb.putClientProperty(SubstanceLookAndFeel.COMBO_BOX_POPUP_FLYOUT_ORIENTATION,
SwingConstants.CENTER);`

Since:
  version 2.3
See Also:
  - `COMBO_POPUP_PROTOTYPE`
  - Constant Field Values

### SCROLL_PANE_BUTTONS_POLICY

public static final String SCROLL_PANE_BUTTONS_POLICY
Client property name for specifying scroll pane button policy. This property can be set on either a specific `JScrollPane` or globally on `UIManager`. The value should be one of the `SubstanceConstants.ScrollPaneButtonPolicyKind` enum. Example of setting a scroll pane with a custom button policy:

`JScrollPane jsp = new JScrollPane(new JPanel());
jsp.putClientProperty(SubstanceLookAndFeel.SCROLL_PANE_BUTTONS_POLICY,
ScrollPaneButtonPolicyKind.MULTIPLE);`

Since:
  version 3.1
See Also:
  - Constant Field Values

### SHOW_EXTRA_WIDGETS

public static final String SHOW_EXTRA_WIDGETS
Property name for specifying that extra UI elements (such as menu items in system menu or lock borders) should be shown. This property can be set as a global setting on `UIManager` or as a client property on a specific component. The value should be either `Boolean.TRUE` or `Boolean.FALSE`.

Example of setting this property on `UIManager`:

`UIManager.put(SubstanceLookAndFeel.SHOW_EXTRA_WIDGETS, Boolean.TRUE); SwingUtilities.updateComponentTree(myFrame);`

Since:
  version 5.0
See Also:
  - Constant Field Values

### MENU_GUTTER_FILL_KIND

public static final String MENU_GUTTER_FILL_KIND
Property name for specifying menu gutter fill kind. Menu gutter is the part of the menu where checkmarks and icons are painted. The value should be one of `SubstanceConstants.MenuGutterFillKind` enum. This property can be set globally on the `UIManager`. The default value is `SubstanceConstants.MenuGutterFillKind.HARD`.

Example of setting soft fill kind:

`UIManager.put(SubstanceLookAndFeel.MENU_GUTTER_FILL_KIND, MenuGutterFillKind.SOFT);`

Since:
  version 3.2
See Also:
  - Constant Field Values

### FOCUS_KIND

public static final String FOCUS_KIND
Client property name for specifying the kind of focus indication on buttons, check boxes and radio buttons. The value should be one of `SubstanceConstants.FocusKind` enum. This property can be set either on the specific component or as global property on `UIManager`.

In order to compute the kind of focus indication for some component, the component's hierarchy is traversed bottom up. The first component that has this property set, defines the focus indication kind. If neither component nor its ancestors define this property, the global setting on `UIManager` is checked. If there is no global setting, the default `SubstanceConstants.FocusKind.ALL_INNER` is used. Here is an example to illustrate the above:

`JPanel topPanel = new JPanel();
topPanel.putClientProperty(SubstanceLookAndFeel.FOCUS_KIND, FocusKind.UNDERLINE);
JPanel panel1 = new JPanel();
JButton b1 = new JButton("button1");
b1.putClientProperty(SubstanceLookAndFeel.FOCUS_KIND, FocusKind.TEXT);
JButton b2 = new JButton("button2");
JButton b3 = new JButton("button3");
b3.putClientProperty(SubstanceLookAndFeel.FOCUS_KIND, FocusKind.ALL_INNER);
panel1.add(b1);
panel1.add(b2);
topPanel.add(panel1);
topPanel.add(b3);
`

In the code above:

- Button b1 will have `SubstanceConstants.FocusKind.NONE` focus kind which is set directly on the button.
- Button b2 will have `SubstanceConstants.FocusKind.UNDERLINE` focus kind which is inherited from its topPanel parent.
- Button b3 will have `SubstanceConstants.FocusKind.ALL_INNER` focus kind which is set directly on the button.

Since:
  2.2
See Also:
  - `SubstanceConstants.FocusKind`
  - Constant Field Values

### COMBO_POPUP_PROTOTYPE

public static final String COMBO_POPUP_PROTOTYPE
Property name for specifying the combobox popup prototype display value which is used to compute the width of the popup at runtime. The property value should be one of:

- `ComboPopupPrototypeCallback` - will provide application-specific logic at runtime.
- `Object` - will point to the prototype entry itself.

This property can be set either on a specific `JComboBox` or globally on `UIManager`.

Here is an example of combo popup prototype set to a model element:

`JComboBox comboProto1 = new JComboBox(new Object[] { "aa", "aaaaa",
"aaaaaaaaaa", "this one is the one", "aaaaaaaaaaaaaaaaaaaaa" });
comboProto1.setPrototypeDisplayValue("aaaaa");
comboProto1.putClientProperty(SubstanceLookAndFeel.COMBO_POPUP_PROTOTYPE,
"this one is the one");`

Here is an example of combo popup prototype set to a dynamic callback. This callback always returns the last model element:

`JComboBox comboProto3 = new JComboBox(new Object[] { "aa", "aaaaa",
"this is not", "this one is not it",
"this one is it that is for the popup" });
comboProto3.setPrototypeDisplayValue("aaaaa");
comboProto3.putClientProperty(SubstanceLookAndFeel.COMBO_POPUP_PROTOTYPE,
new ComboPopupPrototypeCallback() {
public Object getPopupPrototypeDisplayValue(JComboBox jc) {
return jc.getModel().getElementAt(
jc.getModel().getSize() - 1);
}
});`

Since:
  version 3.0
See Also:
  - `COMBO_BOX_POPUP_FLYOUT_ORIENTATION`
  - Constant Field Values

### TRACE_FILE

public static final String TRACE_FILE
VM property name for specifying the trace file. The trace file will contain output of the memory analyser which can be used to pinpoint the memory leaks. The property value is used as a filename for tracing the memory allocations. Example for specifying the trace file name:

`-Dsubstancelaf.traceFile=C:/temp/myApp.substance.log`

Since:
  version 2.0
See Also:
  - Constant Field Values

### PASSWORD_ECHO_PER_CHAR

public static final String PASSWORD_ECHO_PER_CHAR
Client property name for specifying the number of echo characters for each password character. The value should be an instance of `Integer`, otherwise will be ignored. This property can be set either on a specific `JPasswordField` or globally on `UIManager`.

Example of having all password fields echo 3 characters per each typed user character:

`UIManager.put(SubstanceLookAndFeel.PASSWORD_ECHO_PER_CHAR,
new Integer(3));`

Example of having a specific password field echo 2 characters per each typed user character:

`JPasswordField jpf = new JPasswordField();
jpf.putClientProperty(SubstanceLookAndFeel.PASSWORD_ECHO_PER_CHAR,
new Integer(2));`

Since:
  version 2.2
See Also:
  - Constant Field Values

### USE_THEMED_DEFAULT_ICONS

public static final String USE_THEMED_DEFAULT_ICONS

Client property name for specifying that icons on controls such as buttons, toggle buttons, labels, tabs and menu items should match the color of the current color scheme when they are in default state. The control is in default state when it's not pressed, not selected, not armed and not rolled over. The value should be an instance of `Boolean`. By default, all controls show regular (full-color original) icons. The value can be set globally on `UIManager`.

Since:
  version 3.3
See Also:
  - Constant Field Values

### COLORIZATION_FACTOR

public static final String COLORIZATION_FACTOR

Client property name for specifying the colorization amount applied to the background and foreground of the current color scheme and the specific control. By default, when the application does not use any custom colors, all the controls are painted with the colors of the current color scheme / skin. The colors coming from the look-and-feel implement the marker `UIResource` interface which allows the UI delegates to differentiate between application-specific colors which are not changed, and the LAF-provide colors that are changed on LAF switch.

This new client property installs the "smart colorization" mode which uses the colors of the current color scheme and the custom background / foreground colors (when installed by application) to colorize the relevant portions of the control. For example, on checkbox the custom background color will be used to colorize the check box itself, while the custom foreground color will be applied to the check box text and the check mark.

The value of this property specifies the actual colorization amount. Value of 0.0 results in Substance completely ignoring the custom application background and foreground colors set on the components - no colorization. Values closer to 1.0 result in almost full usage of the custom application background and foreground colors set on the components. Note that in order to maintain the gradients (fill, border, etc), even value of 1.0 does not result in full custom color being applied to the relevant visuals of the control.

This property can be specified globally on `UIManager`, applying on all controls, or on the specific component / container. In the later case, the value will be applied to the component / container itself and all its children that do not specify a custom value for this property.

The default colorization amount (when this property is not set at all) is 0.5. This means that applications that install custom background / foreground colors on their UI controls will see them colorized with 50% "strength", even without setting this property.

The value should be an instance of `Double` in 0.0-1.0 range.

Example of marking a button to have a custom background color and colorizing it with 40%:

`JButton jb = new JButton("sample", myIcon);
jb.setBackground(Color.red);
jb.putClientProperty(SubstanceLookAndFeel.COLORIZATION_FACTOR,
new Double(0.4));`

Note that components in decoration areas registered on the current skin will ignore the colorization on custom background color. The background of such components is always painted by the skin's decoration painter to ensure consistent background painting of the relevant decoration area.

Since:
  version 4.2
See Also:
  - `Component.setBackground(Color)`
  - `Component.setForeground(Color)`
  - Constant Field Values

### SUBSTANCE_FONT_POLICY_KEY

protected static final String SUBSTANCE_FONT_POLICY_KEY
Internal client property name for storing application-specific font policy.

Since:
  version 3.3
See Also:
  - `setFontPolicy(FontPolicy)`
  - `getFontPolicy()`
  - Constant Field Values

### SUBSTANCE_INPUT_MAP_SET_KEY

protected static final String SUBSTANCE_INPUT_MAP_SET_KEY
Internal client property name for storing application-specific input map set.

Since:
  version 6.1
See Also:
  - `setInputMapSet(InputMapSet)`
  - `getInputMapSet()`
  - Constant Field Values

### BUTTON_SHAPER_PROPERTY

public static final String BUTTON_SHAPER_PROPERTY
Property name for specifying outline shaper. This property is used a client property that can be set on a specific control.

The value must be a `SubstanceButtonShaper` object.

Example of using a `SubstanceButtonShaper` object as client property value:

`JButton b = new JButton("text");
b.putClientProperty(SubstanceLookAndFeel.BUTTON_SHAPER_PROPERTY,
new ClassicButtonShaper());`

Since:
  version 2.1
See Also:
  - Constant Field Values

### SKIN_PROPERTY

public static final String SKIN_PROPERTY
Property name for specifying a skin to be used on the specific root pane. This property can only be installed on a `JRootPane` and will affect all the controls in that root pane. The value must be an instance of `SubstanceSkin`. After setting this property, call `SwingUtilities.updateComponentTreeUI(Component)` on the matching window.

Since:
  version 5.0
See Also:
  - `getCurrentSkin(Component)`
  - Constant Field Values

### skin

protected SubstanceSkin skin
The skin of this look-and-feel instance.

### name

protected String name
The name of this look-and-feel instance.

## Constructor Details

### SubstanceLookAndFeel

protected SubstanceLookAndFeel(SubstanceSkin skin)
Creates a new skin-based Substance look-and-feel. This is the only way to create an instance of `SubstanceLookAndFeel` class.

Parameters:
  `skin` - Skin.

## Method Details

### initPluginsIfNecessary

protected static void initPluginsIfNecessary()
Initializes the plugins if necessary.

### getLabelBundle

public static ResourceBundle getLabelBundle()
Retrieves the current label bundle.

Returns:
  The current label bundle.
See Also:
  - `resetLabelBundle()`

### getLabelBundle

public static ResourceBundle getLabelBundle(Locale locale)
Retrieves the label bundle for the specified locale.

Parameters:
  `locale` - Locale.
Returns:
  The label bundle for the specified locale.

### resetLabelBundle

public static void resetLabelBundle()
Resets the current label bundle. Useful when the application changes Locale at runtime.

See Also:
  - `getLabelBundle()`

### getCurrentSkin

public static SubstanceSkin getCurrentSkin()
Returns the current global skin. If the current look-and-feel is not Substance, this method returns `null`. This method is for internal use only. Applications should use the `getCurrentSkin(Component)`.

Returns:
  Current global skin.
See Also:
  - `getCurrentSkin(Component)`

### getCurrentSkin

public static SubstanceSkin getCurrentSkin(Component c)
Returns the current skin for the specified component. If the current look-and-feel is not Substance, this method returns `null`.

Parameters:
  `c` - Component. May be `null` - in this case the global current Substance skin will be returned.
Returns:
  Current skin for the specified component.
See Also:
  - `SKIN_PROPERTY`
  - `getCurrentSkin()`

### getDescription

public String getDescription()

Specified by:
  `getDescription` in class `LookAndFeel`

### getID

public String getID()

Specified by:
  `getID` in class `LookAndFeel`

### getName

public String getName()

Specified by:
  `getName` in class `LookAndFeel`

### isNativeLookAndFeel

public boolean isNativeLookAndFeel()

Specified by:
  `isNativeLookAndFeel` in class `LookAndFeel`

### isSupportedLookAndFeel

public boolean isSupportedLookAndFeel()

Specified by:
  `isSupportedLookAndFeel` in class `LookAndFeel`

### initClassDefaults

protected void initClassDefaults(UIDefaults table)

Overrides:
  `initClassDefaults` in class `BasicLookAndFeel`

### initComponentDefaults

protected void initComponentDefaults(UIDefaults table)

Overrides:
  `initComponentDefaults` in class `BasicLookAndFeel`

### setFontPolicy

public static void setFontPolicy(FontPolicy fontPolicy)
Sets the `FontPolicy` to be used with Substance family. If the specified policy is `null`, the default will be reset. This method does not require Substance to be the current look-and-feel, and will cause Substance to be set as the current application look-and-feel.

Parameters:
  `fontPolicy` - The `FontPolicy` to be used with Substance family, or `null` to reset to the default
See Also:
  - `getFontPolicy()`
  - `SUBSTANCE_FONT_POLICY_KEY`

### getFontPolicy

public static FontPolicy getFontPolicy()
Looks up and retrieves the `FontPolicy` used by the Substance family. If a `FontPolicy` has been set, it'll be returned. Otherwise, this method checks if a `FontPolicy` or `FontSet` is defined in the system properties or UIDefaults. If so, it is returned. If no `FontPolicy` has been set for this look, in the system properties or `UIDefaults`, the default Substance font policy will be returned.

Returns:
  the `FontPolicy` set for this Look&feel - if any, the `FontPolicy` specified in the system properties or `UIDefaults` - if any, or the default Substance font policy.
See Also:
  - `setFontPolicy(org.pushingpixels.substance.api.fonts.FontPolicy)`
  - `FontPolicies`
  - `FontPolicies.customSettingsPolicy(FontPolicy)`

### setInputMapSet

public static void setInputMapSet(InputMapSet inputMapSet)
Sets the `InputMapSet` to be used with Substance family. If the specified set is `null`, the default will be reset. This method does not require Substance to be the current look-and-feel, and will cause Substance to be set as the current application look-and-feel.

Parameters:
  `inputMapSet` - The `InputMapSet` to be used with Substance family, or `null` to reset to the default
See Also:
  - `getInputMapSet()`
  - `SUBSTANCE_INPUT_MAP_SET_KEY`

### getInputMapSet

public static InputMapSet getInputMapSet()
Looks up and retrieves the `InputMapSet` used by the Substance family. If a `InputMapSet` has been set, it'll be returned. If no `InputMapSet` has been set for this look, the default Substance input map set will be returned.

Returns:
  the `InputMapSet` set for this Look&feel - if any, or the default Substance input map set.
See Also:
  - `setInputMapSet(InputMapSet)`

### getDefaults

public UIDefaults getDefaults()

Overrides:
  `getDefaults` in class `BasicLookAndFeel`

### initialize

public void initialize()

Overrides:
  `initialize` in class `BasicLookAndFeel`

### uninitialize

public void uninitialize()

Overrides:
  `uninitialize` in class `BasicLookAndFeel`

### registerSkinChangeListener

public static void registerSkinChangeListener(SkinChangeListener skinChangeListener)
Registers a new listener on skin change.

Parameters:
  `skinChangeListener` - New listener on skin change.
See Also:
  - `setSkin(String)`
  - `setSkin(SubstanceSkin)`
  - `unregisterSkinChangeListener(SkinChangeListener)`

### unregisterSkinChangeListener

public static void unregisterSkinChangeListener(SkinChangeListener skinChangeListener)
Unregisters a listener on skin change.

Parameters:
  `skinChangeListener` - The listener to unregister.
See Also:
  - `setSkin(String)`
  - `setSkin(SubstanceSkin)`
  - `registerSkinChangeListener(SkinChangeListener)`

### registerTabCloseChangeListener

public static void registerTabCloseChangeListener(BaseTabCloseListener tabCloseListener)
Registers the specified listener on tab-close events on all tabbed panes.

Parameters:
  `tabCloseListener` - Listener to register.
See Also:
  - `registerTabCloseChangeListener(JTabbedPane, BaseTabCloseListener)`
  - `unregisterTabCloseChangeListener(BaseTabCloseListener)`
  - `unregisterTabCloseChangeListener(JTabbedPane, BaseTabCloseListener)`

### registerTabCloseChangeListener

public static void registerTabCloseChangeListener(JTabbedPane tabbedPane, BaseTabCloseListener tabCloseListener)
Registers the specified listener on tab-close events on the specified tabbed pane.

Parameters:
  `tabbedPane` - Tabbed pane. If `null`, the tab close listener is registered globally (for all tabbed panes).
  `tabCloseListener` - Listener to register.
See Also:
  - `registerTabCloseChangeListener(BaseTabCloseListener)`
  - `unregisterTabCloseChangeListener(BaseTabCloseListener)`
  - `unregisterTabCloseChangeListener(JTabbedPane, BaseTabCloseListener)`

### unregisterTabCloseChangeListener

public static void unregisterTabCloseChangeListener(BaseTabCloseListener tabCloseListener)
Unregisters the specified listener on tab-close events on all tabbed panes.

Parameters:
  `tabCloseListener` - Listener to unregister.
See Also:
  - `registerTabCloseChangeListener(BaseTabCloseListener)`
  - `registerTabCloseChangeListener(JTabbedPane, BaseTabCloseListener)`
  - `unregisterTabCloseChangeListener(JTabbedPane, BaseTabCloseListener)`

### unregisterTabCloseChangeListener

public static void unregisterTabCloseChangeListener(JTabbedPane tabbedPane, BaseTabCloseListener tabCloseListener)
Unregisters the specified listener on tab-close events on the specified tabbed pane.

Parameters:
  `tabbedPane` - Tabbed pane. If `null`, the tab close listener is unregistered globally (for all tabbed panes).
  `tabCloseListener` - Listener to unregister.
See Also:
  - `registerTabCloseChangeListener(BaseTabCloseListener)`
  - `registerTabCloseChangeListener(JTabbedPane, BaseTabCloseListener)`
  - `unregisterTabCloseChangeListener(BaseTabCloseListener)`

### getAllTabCloseListeners

public static Set<BaseTabCloseListener> getAllTabCloseListeners()
Returns the set of all listeners registered on tab-close events on all tabbed panes.

Returns:
  Set of all listeners registered on tab-close events on all tabbed panes.

### getAllTabCloseListeners

public static Set<BaseTabCloseListener> getAllTabCloseListeners(JTabbedPane tabbedPane)
Returns all listeners registered on tab closing of the specified tabbed pane.

Parameters:
  `tabbedPane` - A tabbed pane. If `null`, all globally registered tab close listeners are returned.
Returns:
  All listeners registered on tab closing of the specified tabbed pane.

### registerLocaleChangeListener

public static void registerLocaleChangeListener(LocaleChangeListener localeListener)
Registers a new listener on locale change.

Parameters:
  `localeListener` - New listener on locale change.

### unregisterLocaleChangeListener

public static void unregisterLocaleChangeListener(LocaleChangeListener localeListener)
Unregisters a listener on locale change.

Parameters:
  `localeListener` - The listener to unregister.

### getLocaleListeners

public static Set<LocaleChangeListener> getLocaleListeners()
Returns all listeners registered on locale change.

Returns:
  All listeners registered on locale change.

### setWidgetVisible

public static void setWidgetVisible(JRootPane rootPane, boolean visible, SubstanceConstants.SubstanceWidgetType... substanceWidgets)
Sets the visibility of the specified widget kind(s). If the first `rootPane` parameter is `null`, this call applies to all root panes. This method should not be called from inside the initialization sequence of your window. If the specific widget needs to be visible when the window is shown, wrap the call with `SwingUtilities.invokeLater(Runnable)`.

Parameters:
  `rootPane` - Root pane. May be `null`.
  `visible` - Visibility indication.
  `substanceWidgets` - Widget types.
Since:
  version 5.0

### isToUseConstantThemesOnDialogs

public static boolean isToUseConstantThemesOnDialogs()
Checks whether the `JOptionPane`s created with predefined message types should use constant color schemes for the icons.

Returns:
  `true` if the `JOptionPane`s created with predefined message types should use constant color schemes for the icons, `false` otherwise.
See Also:
  - `setToUseConstantThemesOnDialogs(boolean)`

### setToUseConstantThemesOnDialogs

public static void setToUseConstantThemesOnDialogs(boolean toUseConstantThemesOnDialogs)
Sets the new setting for the icons of the `JOptionPane`s created with predefined message types.

Parameters:
  `toUseConstantThemesOnDialogs` - if `true`, the `JOptionPane`s created with predefined message types should use constant color schemes for the icons.
See Also:
  - `isToUseConstantThemesOnDialogs()`

### setSkin

public static boolean setSkin(SubstanceSkin newSkin)
Sets the specified skin. If the current look-and-feel is not Substance, this method will create a new Substance look-and-feel based on the specified skin and set it on `UIManager`. This method does not require Substance to be the current look-and-feel. Calling this method will call `SwingUtilities.updateComponentTreeUI(Component)` on all open top-level windows.

Parameters:
  `newSkin` - Skin to set.
Returns:
  `true` if the specified skin has been set successfully, `false` otherwise.
Throws:
  `IllegalStateException` - When called outside the Event Dispatch Thread.
See Also:
  - `registerSkinChangeListener(SkinChangeListener)`
  - `unregisterSkinChangeListener(SkinChangeListener)`
  - `SubstanceSkin.isValid()`

### setSkin

public static boolean setSkin(String skinClassName)
Sets the specified skin. If the current look-and-feel is not Substance, this method will create a new Substance look-and-feel based on the specified skin and set it on `UIManager`. This method does not require Substance to be the current look-and-feel. Calling this method will call `SwingUtilities.updateComponentTreeUI(Component)` on all open top-level windows.

Parameters:
  `skinClassName` - Skin to set.
Returns:
  `true` if the specified skin has been set successfully, `false` otherwise.
Throws:
  `IllegalStateException` - When called outside the Event Dispatch Thread.
Since:
  version 3.1
See Also:
  - `setSkin(SubstanceSkin)`
  - `registerSkinChangeListener(SkinChangeListener)`
  - `unregisterSkinChangeListener(SkinChangeListener)`
  - `SubstanceSkin.isValid()`

### getAllSkins

public static Map<String,SkinInfo> getAllSkins()
Returns all available skins.

Returns:
  All available skins. Key - skin display name, value - skin information.

### getSupportsWindowDecorations

public boolean getSupportsWindowDecorations()

Overrides:
  `getSupportsWindowDecorations` in class `LookAndFeel`

### setLabelBundleClassLoader

public static void setLabelBundleClassLoader(ClassLoader labelBundleClassLoader)
Sets the class loader for `LABEL_BUNDLE`.

Parameters:
  `labelBundleClassLoader` - Class loader for `LABEL_BUNDLE`.
Since:
  version 3.1

### getTitlePaneComponent

public static JComponent getTitlePaneComponent(Window window)
Returns the title pane of the specified top-level window.

Parameters:
  `window` - Top-level window.
Returns:
  If the parameter is either `JFrame` or `JDialog` and has custom decorations, the result is the title pane, `null` otherwise.
Since:
  version 3.1

### setDecorationType

public static void setDecorationType(JComponent comp, DecorationAreaType type)
Sets the decoration type of the specified component and all its children.

Parameters:
  `comp` - Component.
  `type` - Decoration type of the component and all its children.

### getDecorationType

public static DecorationAreaType getDecorationType(Component comp)
Returns the decoration area type of the specified component. The component and its ancestor hierarchy are scanned for the registered decoration area type. If `setDecorationType(JComponent, DecorationAreaType)` has been called on the specified component, the matching decoration type is returned. Otherwise, the component hierarchy is scanned to find the closest ancestor that was passed to `setDecorationType(JComponent, DecorationAreaType)` - and its decoration type is returned. If neither the component, nor any one of its parent components has been passed to the setter method, `DecorationAreaType.NONE` is returned.

Parameters:
  `comp` - Component.
Returns:
  Decoration area type of the component.

### getImmediateDecorationType

public static DecorationAreaType getImmediateDecorationType(Component comp)
Returns the immediate decoration area type of the specified component. The component is checked for the registered decoration area type. If `setDecorationType(javax.swing.JComponent, DecorationAreaType)` was not called on this component, this method returns `null`.

Parameters:
  `comp` - Component.
Returns:
  Immediate decoration area type of the component.

### isCurrentLookAndFeel

public static boolean isCurrentLookAndFeel()
Checks whether Substance is the current look-and-feel. This method is for internal use only.

Returns:
  `true` if Substance is the current look-and-feel, `false` otherwise.

### getDisabledIcon

public Icon getDisabledIcon(JComponent component, Icon icon)

Overrides:
  `getDisabledIcon` in class `LookAndFeel`