Substance 3.1 Honolulu - new features


Support for skins

A skin is a collection of theme, watermark, painters and other settings. In order to set a skin, you can either call the SubstanceSkin.set method or invoke the following API available on the org.jvnet.substance.SubstanceLookAndFeel class:

  /**
   * Sets the specified skin.
   
   @param skin
   *            Skin to set.
   @return <code>true</code> if the specified skin has been set
   *         successfully, <code>false</code> otherwise.
   @since version 3.1
   */
  public static boolean setSkin(SubstanceSkin skin) {

  /**
   * Sets the specified skin.
   
   @param skinClassName
   *            Skin to set.
   @return <code>true</code> if the specified skin has been set
   *         successfully, <code>false</code> otherwise.
   @since version 3.1
   */
  public static boolean setSkin(String skinClassName) {

Four toned-down core skins are available:

Business available in the org.jvnet.substance.skin.BusinessSkin. In addition, the org.jvnet.substance.skin.SubstanceBusinessLookAndFeel can be used with one of the following options:

  • -Dswing.defaultlaf=org.jvnet.substance.skin.SubstanceBusinessLookAndFeel
  • UIManager.setLookAndFeel(new SubstanceBusinessLookAndFeel())
  • UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceBusinessLookAndFeel");

Business Business

Creme available in the org.jvnet.substance.skin.CremeSkin. In addition, the org.jvnet.substance.skin.SubstanceCremeLookAndFeel can be used with one of the following options:

  • -Dswing.defaultlaf=org.jvnet.substance.skin.SubstanceCremeLookAndFeel
  • UIManager.setLookAndFeel(new SubstanceCremeLookAndFeel())
  • UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceCremeLookAndFeel");

Creme Creme

Sahara available in the org.jvnet.substance.skin.SaharaSkin. In addition, the org.jvnet.substance.skin.SubstanceSaharaLookAndFeel can be used with one of the following options:

  • -Dswing.defaultlaf=org.jvnet.substance.skin.SubstanceSaharaLookAndFeel
  • UIManager.setLookAndFeel(new SubstanceSaharaLookAndFeel())
  • UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceSaharaLookAndFeel");

Sahara Sahara

Moderate available in the org.jvnet.substance.skin.ModerateSkin. In addition, the org.jvnet.substance.skin.SubstanceModerateLookAndFeel can be used with one of the following options:

  • -Dswing.defaultlaf=org.jvnet.substance.skin.SubstanceModerateLookAndFeel
  • UIManager.setLookAndFeel(new SubstanceModerateLookAndFeel())
  • UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceModerateLookAndFeel");

Moderate Moderate


Support for color-blind mode

The org.jvnet.substance.theme.SubstanceTritanopiaTheme provides support for previewing your application in tritanopia color blindness mode. Use the SubstanceTheme.tritanopia API to apply this mode to any Substance theme. Here is an example of application under Mango theme (regular viewing) and under the same Mango theme in tritanopia simulation mode:

Moderate Moderate

The org.jvnet.substance.theme.SubstanceProtanopiaTheme provides support for previewing your application in protanopia color blindness mode. Use the SubstanceTheme.protanopia API to apply this mode to any Substance theme. Here is an example of application under Mango theme (regular viewing) and under the same Mango theme in protanopia simulation mode:

Moderate Moderate

The org.jvnet.substance.theme.SubstanceDeuteranopiaTheme provides support for previewing your application in deuteranopia color blindness mode. Use the SubstanceTheme.deuteranopia API to apply this mode to any Substance theme. Here is an example of application under Mango theme (regular viewing) and under the same Mango theme in deuteranopia simulation mode:

Moderate Moderate

Animations on lists, tables and trees

Lists, tables and trees provide out-of-the-box animation effects on rollover and selection. The maximum selection opacity is 70%, the maximum rollover opacity is 40% - for all controls.


Support for multi-mixed themes

The org.jvnet.substance.theme.SubstanceMixTheme deprecates the org.jvnet.substance.theme.SubstanceMixBiTheme (which is still supported) to provide multi-mixed themes. Examples of regular buttons under multi-mixed themes:

Larger screenshot of Bottle Green - Lime Green - Bottle Green:

Larger screenshot of Brown - Sunglare - Orange:

Larger screenshot of Barby Pink - Purple - Raspberry:


Scrollbar buttons location

The SubstanceLookAndFeel.SCROLL_PANE_BUTTONS_POLICY client property specifies the location for scrollbar buttons. The value should be one of the SubstanceConstants.ScrollPaneButtonPolicyKind enum. Available values:

  • NONE - no buttons are shown.
  • OPPOSITE - the default policy. The decrease button is on one side of the scroll bar, the increase button is on another side of the scroll bar.
  • ADJACENT - the decrease button is right next to the increase button of the scroll bar.
  • MULTIPLE - the combination of two. There are two decrease buttons, one on each side of the scroll bar (one of them is right next to the increase button).
  • MULTIPLE_BOTH - Two pairs of decrease / increase buttons on each side of the scroll bar.

The following screenshot shows horizontal scrollbar under different policies and orientations. The first scrollbar is under the default OPPOSITE policy. The second scrollbar is under the ADJACENT policy in LTR application. The third scrollbar is under the MULTIPLE policy in LTR application. The fourth scrollbar is under the ADJACENT policy in RTL application. The fifth scrollbar is under the MULTIPLE policy in RTL application. The sixth scrollbar is under the NONE policy. The seventh scrollbar is under the MULTIPLE_BOTH policy.

The following screenshot shows vertical scrollbar under different policies. The first scrollbar is under the default OPPOSITE policy. The second scrollbar is under the ADJACENT policy. The third scrollbar is under the MULTIPLE policy. The fourth scrollbar is under the NONE policy. The fifth scrollbar is under the MULTIPLE_BOTH policy.


Support for flat scrollbar buttons

Setting the SubstanceLookAndFeel.BUTTON_PAINT_NEVER_PROPERTY to Boolean.TRUE on a JScrollPane will result in the scroll buttons being permanently flat (only displaying the arrow - no background).

Setting the SubstanceLookAndFeel.FLAT_PROPERTY to Boolean.TRUE on a JScrollPane will result in the scroll buttons being flat (displaying background only on rollover / press).

The screenshot shows a scrollbar in regular mode (scroll button shows the background) and in flat mode (scroll button doesn't show the background):


Improved micro-design of text components

The text components, comboboxes and spinners are consistent and have the same default height, insets and layout for internal buttons. Screenshot of these components under Substance 3.0 shows that combo is 6 pixels higher than all other components and the spinner buttons are drawn over the borders:

Screenshot of the same application under Substance 3.1 shows the components having the same height, consistent insets and the spinner buttons under the same layout as the combobox button:


Icons on context edit menus on text components

Using Tango icons on context edit menus on text components (in laf-widget project):


Negated themes

Added support for negated themes. In order to enable negated themes, use one of

  • UIManager.put(SubstanceLookAndFeel.ENABLE_NEGATED_THEMES, Boolean.TRUE)
  • -Dsubstancelaf.enableNegatedThemes VM flag

When negated themes are enabled, the SubstanceLookAndFeel.getAllThemes() function returns negated themes for all bright and cold themes. The matching theme kind is ThemeKind.NEGATED. All the colors of the original theme are negated, effectively making the non-active colors dark. Note that unlike the inverted themes, the negated themes are the exact negation of the original theme.

On the left is the screenshot of negated Aqua theme, and on the right is the screenshot of inverted Aqua theme

On the left is the screenshot of negated Sunset theme, and on the right is the screenshot of inverted Sunset theme


Native icons in filechooser dialog

The filechooser dialog uses native icons:


New dark themes

Two new core dark themes have been added, Jade Forest and Ultramarine:


Support for hue-shifted themes

The org.jvnet.substance.theme.SubstanceHueShiftTheme provides support hue-shifted themes. Use SubstanceTheme.hueShift API. The original theme maintains the same saturation and brightness but has a different (shifted) hue. Here is a screenshot of the original theme (complex Green Magic):

The same theme shifted by 10% (factor of 0.1):

The same theme shifted by 50% (factor of 0.5):


Option for separate watermark theme on complex themes

The SubstanceComplexTheme has a new option to specify the watermark theme. When no watermark theme is specified, the default theme of the complex theme is used to paint the watermark. Screenshot of a complex theme that has Ebony as a default theme, which is also used for the wateramrk theme (no separate watermark theme specified):

The same complex theme, but with a watermark theme (Inverted Barby Pink):


Selective theme saturation

The SubstanceTheme.saturate has a new version that gets a boolean parameter that specifies if the entire theme should be saturated. If this parameter is false, only the components in active visual state will be saturated / desaturated. This API is better suited for simple themes.

Screenshot of the original theme (Complex Mango):

The saturated version of the same theme using the old API - note that all components (and the watermark) are saturated:

The saturated version of the same theme using the new API - note that aonly active components are saturated:


New gradient painters

Three new gradient painters were added (two are based on the soft-clipping technique). Screenshot of a button under new Gradient Wave (note that the bottom part of the button is slightly hue-shifted):

Screenshot of the same button under new Specular Wave (note that the bottom part of the button is slightly hue-shifted):

Screenshot of the same button under new Subdued:


Additional animation effects

Fade animation effects have been added on:

  • Menus and menu items
  • Text components (text field, formatted text field, editor pane, password field, text area)
  • Button text on complex themes that have active and default of opposite darkness
  • Progress bar

Support for open sides on buttons

The new SubstanceLookAndFeel.BUTTON_OPEN_SIDE_PROPERTY client property can be set on a button to specify open side(s). An open side will not have the border and have extended gradient painting. Internally, this property is used to paint scrollbar and spinner buttons that blend seamlessly with other visual parts of the relevant control.

The value of the property can be one of the following (where Side enum is defined in the org.jvnet.substance.utils.SubstanceConstants class):

  • Set<Side> - allows defining multiple open sides.
  • String - should correspond to one of the values of the Side enum.
  • String[] - each value should correspond to one of the values of the Side enum. Allows defining multiple open sides.
  • Side.
  • Side[] - allows defining multiple open sides.

The screenshot below shows buttons with different open (and straight) sides as compared to the same buttons with no open sides:


Extended customization of tabbed panes

The SubstanceLookAndFeel.PAINT_ACTIVE_PROPERTY client property can be set on either the specific tab component or on the tabbed pane. In the first case, the tab will be painted in active theme as long as it's enabled. In the second case, all enabled tabs will be painted in active theme. Example of a tabbed pane with the second, fifth and seventh tabs marked with this property:

The SubstanceLookAndFeel.THEME_PROPERTY client property can be set on either the specific tab component or on the tabbed pane. In the first case, the tab will be painted using the specified theme. In the second case, all enabled tabs will be painted using the specified theme. Setting a complex theme can make the selected and rolled over tabs appear in one color, the enabled tabs in another color and disabled tabs in yet another color.

Example of the same tabbed pane with a complex theme set (the complex theme uses Bottle Green for active controls, Lime Green for default controls and Purple for disabled controls):


Support for "pinning" internal frames

The title pane of internal frames has additional button that allows "pinning" the internal frame (moving and resizing are disabled). In addition, the SubstanceLookAndFeel.PERMANENTLY_PINNED property can be set on a JInternalFrame to indicate that the internal frame is permanently pinned (until this property is reset) - value should be Boolean.TRUE in this case.

The following screenshot shows an internal frame in six different states:

  1. Unpinned - the default.
  2. Pinned - user clicked on the pin button and it is selected.
  3. Permanently pinned - using the property above. The pin button can't be clicked.
  4. Unpinned with additional custom buttons (using SubstanceLookAndFeel.setRootPaneCustomTitleButtons API).
  5. Pinned with additional custom buttons (using SubstanceLookAndFeel.setRootPaneCustomTitleButtons API).
  6. Permanently pinned with additional custom buttons (using SubstanceLookAndFeel.setRootPaneCustomTitleButtons API).

Support for custom background composites

The SubstanceLookAndFeel.BACKGROUND_COMPOSITE client property can be set on a JScrollPane, JTabbedPane and JToolBar. The value should be an instance of org.jvnet.substance.painter.ControlBackgroundComposite interface. At runtime it defines the background composite of scrollbar buttons and tabs. A useful core implementation is in the org.jvnet.substance.painter.AlphaControlBackgroundComposite that provides a simple alpha-based translucency. Here is a screenshot of the same scrollbar under default (none) composite background, a 75% translucent, 50% translucent and 25% translucent composite backgrounds:

If this property is set on a JToolBar and the toolbar has the SubstanceLookAndFeel.TOOLBAR_BUTTON_FLAT client property set to Boolean.FALSE, the toolbar buttons can have arbitrary translucency.