Substance API

View all API methods.

View all client properties.


API method

public static FontPolicy getFontPolicy()

Description

Looks up and retrieves the FontPolicy used by the Substance family.

Returns:

  • The FontPolicy set for Substance

See also


Sample code

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.FontUIResource;

import org.pushingpixels.substance.api.SubstanceLookAndFeel;
import org.pushingpixels.substance.api.fonts.FontPolicy;
import org.pushingpixels.substance.api.fonts.FontSet;
import org.pushingpixels.substance.api.skin.BusinessBlackSteelSkin;

/**
 * Test application that shows the use of the
 {@link SubstanceLookAndFeel#getFontPolicy()} API.
 
 @author Kirill Grouchnikov
 @see SubstanceLookAndFeel#getFontPolicy()
 */
public class GetFontPolicy 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 GetFontPolicy() {
    super("Get 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(-330);
    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 {
                GetFontPolicy.this
                    .setCursor(Cursor
                        .getPredefinedCursor(Cursor.WAIT_CURSOR));
                // set the new font policy
                SubstanceLookAndFeel
                    .setFontPolicy(newFontPolicy);
                GetFontPolicy.this.setCursor(Cursor
                    .getDefaultCursor());
              catch (Exception exc) {
                exc.printStackTrace();
              }
            }
          });
        }
      }
    });
    panel.add(fontSizeSlider);

    JButton jb = new JButton("Show font info");
    jb.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        FontPolicy fontPolicy = SubstanceLookAndFeel.getFontPolicy();
        FontSet fontSet = fontPolicy.getFontSet("Substance"null);
        String[] infoArray = new String[] {
            "Control: " + fontSet.getControlFont(),
            "Menu: " + fontSet.getMenuFont(),
            "Message: " + fontSet.getMessageFont(),
            "Small: " + fontSet.getSmallFont(),
            "Title: " + fontSet.getTitleFont(),
            "Window title: " + fontSet.getWindowTitleFont() };
        JList infoList = new JList(infoArray);
        JDialog infoDialog = new JDialog(GetFontPolicy.this,
            "Font set info"true);
        infoDialog.setLayout(new BorderLayout());
        infoDialog.add(infoList, BorderLayout.CENTER);
        infoDialog.pack();
        infoDialog.setLocationRelativeTo(GetFontPolicy.this);
        infoDialog.setVisible(true);
      }
    });
    panel.add(jb);

    this.add(panel, BorderLayout.CENTER);

    this.setSize(400200);
    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 GetFontPolicy().setVisible(true);
      }
    });
  }
}

The screenshot below shows application frame under default font size - this method has not been called:

Here is the listing of all the fonts in the returned (default) font policy:

The screenshot below shows application frame after the font policy that adds 2 pixels to all fonts has been set (note how it affects all UI elements):

Here is the listing of all the fonts in the returned font policy:

The screenshot below shows application frame after the font policy that subtracts 2 pixels from all fonts has been set (note how it affects all UI elements):

Here is the listing of all the fonts in the returned font policy: