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:

See Also:
  • 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:
    • 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:
    • 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:
    • 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:
    • 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:

      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

      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:

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

      JButton button = new JButton("text");
      Set openSides = EnumSet.of(Side.TOP, Side.WEST);
      button.putClientProperty(SubstanceLookAndFeel.BUTTON_OPEN_SIDE_PROPERTY,
        openSides);
      Since:
      version 3.1
      See Also:
    • 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:
    • 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:
    • 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:
    • 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:
    • 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:
    • 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:
    • 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:
    • 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

      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_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:
    • 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:
    • 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:
    • 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:
    • 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:
    • 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 Integers below:

      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:
    • 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:
    • 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:
    • 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:

      Since:
      2.2
      See Also:
    • 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:

      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:
    • 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:
    • 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:
    • 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:
    • 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:
    • 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:
    • 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:
    • 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:
    • 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:
    • 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