Substance look and feel - documentation
Author: substance.dev.java.net
Description: Substance look and feel
Keywords: java, look, feel, skins, plaf, swing, ui, pluggable, substance

# Substance API

View all API methods.

View all client properties.

API method | `public static void setFontPolicy(FontPolicy fontPolicy)`
Description | Sets the `FontPolicy` to be used with Substance family. If the specified policy is `null`, the default will be reset. Parameters: `fontPolicy` - The `FontPolicy` to be used with Substance family, or `null` to reset to the default.
See also | getFontPolicy() API.
Sample code | `import java.awt.*; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.FontUIResource; import org.jvnet.substance.SubstanceLookAndFeel; import org.jvnet.substance.fonts.FontPolicy; import org.jvnet.substance.fonts.FontSet; import org.jvnet.substance.skin.BusinessBlackSteelSkin; /** * Test application that shows the use of the * {@link SubstanceLookAndFeel#setFontPolicy(FontPolicy)} API. * * @author Kirill Grouchnikov * @see SubstanceLookAndFeel#setFontPolicy(FontPolicy) */ public class SetFontPolicy extends JFrame { /** * Wrapper around the base Substance font set. Is used to create larger / * smaller font sets. * * @author Kirill Grouchnikov */ private static class WrapperFontSet implements FontSet { /** * Extra size in pixels. Can be positive or negative. */ private int extra; /** * The base Substance font set. */ private FontSet delegate; /** * Creates a wrapper font set. * * @param delegate * The base Substance font set. * @param extra * Extra size in pixels. Can be positive or negative. */ public WrapperFontSet(FontSet delegate, int extra) { super(); this.delegate = delegate; this.extra = extra; } /** * Returns the wrapped font. * * @param systemFont * Original font. * @return Wrapped font. */ private FontUIResource getWrappedFont(FontUIResource systemFont) { return new FontUIResource(systemFont.getFontName(), systemFont .getStyle(), systemFont.getSize() + this.extra); } public FontUIResource getControlFont() { return this.getWrappedFont(this.delegate.getControlFont()); } public FontUIResource getMenuFont() { return this.getWrappedFont(this.delegate.getMenuFont()); } public FontUIResource getMessageFont() { return this.getWrappedFont(this.delegate.getMessageFont()); } public FontUIResource getSmallFont() { return this.getWrappedFont(this.delegate.getSmallFont()); } public FontUIResource getTitleFont() { return this.getWrappedFont(this.delegate.getTitleFont()); } public FontUIResource getWindowTitleFont() { return this.getWrappedFont(this.delegate.getWindowTitleFont()); } } /** * Creates the main frame for <code>this</code> sample. */ public SetFontPolicy() { super("Set font policy"); this.setLayout(new BorderLayout()); JPanel panel = new JPanel(new FlowLayout()); // create a slider to control the font size. final JSlider fontSizeSlider = new JSlider(-3, 3, 0); fontSizeSlider.setPaintLabels(true); fontSizeSlider.setMajorTickSpacing(1); fontSizeSlider.setToolTipText("Controls the global font set size"); fontSizeSlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { // if the value is adjusting - ignore. This is done // to make CPU usage better. if (!fontSizeSlider.getModel().getValueIsAdjusting()) { final int newValue = fontSizeSlider.getValue(); SwingUtilities.invokeLater(new Runnable() { public void run() { // reset the base font policy to null - this // restores the original font policy (default size). SubstanceLookAndFeel.setFontPolicy(null); // Get the default font set final FontSet substanceCoreFontSet = SubstanceLookAndFeel .getFontPolicy().getFontSet("Substance", null); // Create the wrapper font set FontPolicy newFontPolicy = new FontPolicy() { public FontSet getFontSet(String lafName, UIDefaults table) { return new WrapperFontSet( substanceCoreFontSet, newValue); } }; try { SetFontPolicy.this .setCursor(Cursor .getPredefinedCursor(Cursor.WAIT_CURSOR)); // set the new font policy SubstanceLookAndFeel .setFontPolicy(newFontPolicy); SetFontPolicy.this.setCursor(Cursor .getDefaultCursor()); } catch (Exception exc) { exc.printStackTrace(); } } }); } } }); panel.add(fontSizeSlider); panel.add(new JButton("button")); panel.add(new JComboBox(new Object[] { "item1", "item2" })); this.add(panel, BorderLayout.CENTER); this.setSize(400, 200); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } /** * The main method for <code>this</code> sample. The arguments are ignored. * * @param args * Ignored. */ public static void main(String[] args) { JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); SwingUtilities.invokeLater(new Runnable() { public void run() { SubstanceLookAndFeel.setSkin(new BusinessBlackSteelSkin()); new SetFontPolicy().setVisible(true); } }); } }` In the example, note how the global font policy is set to `null` - this restores the default policy. After the default policy is restored, we get the default font set and wrap it with extra pixel value. The screenshot below shows application frame under default font size - this method has not been called: The screenshot below shows application frame after this method has been called with font policy that adds 2 pixels to all fonts (note how it affects all UI elements): The screenshot below shows application frame after this method has been called with font policy that subtracts 2 pixels from all fonts (note how it affects all UI elements):