Recipe 14.17 Program: Custom Font Chooser


Problem

You want to allow the user to select a font, but standard Java doesn't yet include a Font Chooser dialog.

Solution

Use my FontChooser dialog class.

Discussion

As we saw in Recipe 13.3, you can manually select a font by calling the java.awt.Font class constructor, passing in the name of the font, the type you want (plain, bold, italic, or bold+italic), and the point size:

Font f = new Font("Helvetica", Font.BOLD, 14); setfont(f);

This is not very flexible for interactive applications. You normally want the user to be able to choose fonts with the same ease as using a File Chooser dialog. Until the Java API catches up with this, you are more than welcome to use the Font Chooser that I wrote when faced with a similar need.

The source code is shown in Example 14-10; it ends, as many of my classes do, with a short main method that is both a test case and an example of using the class in action. The display is shown in Figure 14-16.

Example 14-10. FontChooser.java
import java.awt.*; import java.awt.event.*; import javax.swing.*; /** A font selection dialog. .  * <p>Note: can take a LONG time to start up on systems  * with (literally) hundreds of fonts.  */ public class FontChooser extends JDialog {     /** The font the user has chosen */     protected Font resultFont;     /** The resulting font name */     protected String resultName;     /** The resulting font size */     protected int resultSize;     /** The resulting boldness */     protected boolean isBold;     /** The resulting italicness */     protected boolean isItalic;     /** The list of Fonts */     protected String fontList[];     /** The font name chooser */     protected List fontNameChoice;     /** The font size chooser */     protected List fontSizeChoice;     /** The bold and italic choosers */     Checkbox bold, italic;     /** The list of font sizes */     protected String fontSizes[] = {         "8", "10", "11", "12", "14", "16", "18", "20", "24",         "30", "36", "40", "48", "60", "72"         };     /** The display area. Use a JLabel as the AWT label doesn't always      * honor setFont( ) in a timely fashion :-)      */     protected JLabel previewArea;     /** Construct a FontChooser -- Sets title and gets       * array of fonts on the system. Builds a GUI to let      * the user choose one font at one size.      */     public FontChooser(Frame f) {         super(f, "Font Chooser", true);         Container cp = this;    // or getContentPane( ) in Swing         Panel top = new Panel( );         top.setLayout(new FlowLayout( ));         fontNameChoice = new List(8);         top.add(fontNameChoice);         Toolkit toolkit = Toolkit.getDefaultToolkit( );         // For JDK 1.1: returns about 10 names (Serif, SansSerif, etc.)         // fontList = toolkit.getFontList( );         // For JDK 1.2: a much longer list; most of the names that come         // with your OS (e.g., Arial), plus the Sun/Java ones (Lucida,          // Lucida Bright, Lucida Sans...)         fontList = GraphicsEnvironment.getLocalGraphicsEnvironment( ).             getAvailableFontFamilyNames( );         for (int i=0; i<fontList.length; i++)             fontNameChoice.add(fontList[i]);         fontNameChoice.select(0);         fontSizeChoice = new List(8);         top.add(fontSizeChoice);         for (int i=0; i<fontSizes.length; i++)             fontSizeChoice.add(fontSizes[i]);         fontSizeChoice.select(5);         cp.add(top, BorderLayout.NORTH);         Panel attrs = new Panel( );         top.add(attrs);         attrs.setLayout(new GridLayout(0,1));         attrs.add(bold  =new Checkbox("Bold", false));         attrs.add(italic=new Checkbox("Italic", false));         previewArea = new JLabel("Qwerty Yuiop", JLabel.CENTER);         previewArea.setSize(200, 50);         cp.add(BorderLayout.CENTER, previewArea);         Panel bot = new Panel( );         Button okButton = new Button("Apply");         bot.add(okButton);         okButton.addActionListener(new ActionListener( ) {             public void actionPerformed(ActionEvent e) {                 previewFont( );                 dispose( );                 setVisible(false);             }         });         Button pvButton = new Button("Preview");         bot.add(pvButton);         pvButton.addActionListener(new ActionListener( ) {             public void actionPerformed(ActionEvent e) {                 previewFont( );             }         });         Button canButton = new Button("Cancel");         bot.add(canButton);         canButton.addActionListener(new ActionListener( ) {             public void actionPerformed(ActionEvent e) {                 // Set all values to null. Better: restore previous.                 resultFont = null;                 resultName = null;                 resultSize = 0;                 isBold = false;                 isItalic = false;                 dispose( );                 setVisible(false);             }         });         cp.add(BorderLayout.SOUTH, bot);         previewFont( ); // ensure view is up to date!         pack( );         setLocation(100, 100);     }     /** Called from the action handlers to get the font info,      * build a font, and set it.      */     protected void previewFont( ) {         resultName = fontNameChoice.getSelectedItem( );         String resultSizeName = fontSizeChoice.getSelectedItem( );         int resultSize = Integer.parseInt(resultSizeName);         isBold = bold.getState( );         isItalic = italic.getState( );         int attrs = Font.PLAIN;         if (isBold) attrs = Font.BOLD;         if (isItalic) attrs |= Font.ITALIC;         resultFont = new Font(resultName, attrs, resultSize);         // System.out.println("resultName = " + resultName + "; " +         //         "resultFont = " + resultFont);         previewArea.setFont(resultFont);         pack( );                // ensure Dialog is big enough.     }     /** Retrieve the selected font name. */     public String getSelectedName( ) {         return resultName;     }     /** Retrieve the selected size */     public int getSelectedSize( ) {         return resultSize;     }     /** Retrieve the selected font, or null */     public Font getSelectedFont( ) {         return resultFont;     }     /** Simple main program to start it running */     public static void main(String[] args) {         final JFrame f = new JFrame("Dummy");         final FontChooser fc = new FontChooser(f);         final Container cp = f.getContentPane( );         cp.setLayout(new GridLayout(0, 1));    // one vertical column         JButton theButton = new JButton("Change font");         cp.add(theButton);         final JLabel theLabel = new JLabel("Java is great!");         cp.add(theLabel);         // Now that theButton and theLabel are ready, make the action listener         theButton.addActionListener(new ActionListener( ) {             public void actionPerformed(ActionEvent e) {                 fc.setVisible(true);                 Font myNewFont = fc.getSelectedFont( );                 System.out.println("You chose " + myNewFont);                 theLabel.setFont(myNewFont);                 f.pack( );    // again                 fc.dispose( );             }         });         f.pack( );         f.setVisible(true);         f.addWindowListener(new WindowCloser(f, true));     } }

Figure 14-16. Font Chooser in action
figs/jcb2_1416.gif




Java Cookbook
Java Cookbook, Second Edition
ISBN: 0596007019
EAN: 2147483647
Year: 2003
Pages: 409
Authors: Ian F Darwin

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net