package example; import java.awt.*; import java.awt.event.*; import java.beans.*; import javax.swing.*; import javax.swing.border.EmptyBorder; /** * Select a font */ public class FontChooser extends JPanel implements PropertyChangeListener, ItemListener { protected Font specifiedFont = new Font ("Serif", Font.PLAIN, 10); protected JComboBox name; protected JCheckBox bold, italic; protected NumberChooser size; protected static String[] availableFonts = null; public FontChooser () { setLayout (new GridLayout (2, 2)); if (availableFonts == null){ GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); availableFonts = ge.getAvailableFontFamilyNames(); } name = new JComboBox (availableFonts); name.setSelectedItem (specifiedFont.getName ()); name.addItemListener (this); add(name); size = new NumberChooser(1, 128, specifiedFont.getSize()); add (size); size.setColumns (3); size.addPropertyChangeListener (this); add (bold = new JCheckBox ("bold")); bold.setSelected (specifiedFont.isBold ()); bold.addItemListener (this); add (italic = new JCheckBox ("italic")); italic.setSelected (specifiedFont.isItalic ()); italic.addItemListener (this); } public void setSpecifiedFont(Font f) { name.setSelectedItem (f.getName ()); bold.setSelected (f.isBold ()); italic.setSelected (f.isItalic ()); size.setValue (f.getSize ()); fireStateChange (); } public Font getSpecifiedFont () { return new Font ((String)name.getSelectedItem (), (bold.isSelected() ? Font.BOLD: 0) | (italic.isSelected() ? Font.ITALIC: 0), size.getValue()); } public void itemStateChanged (ItemEvent e) { fireStateChange(); } public void propertyChange (PropertyChangeEvent e) { fireStateChange(); } protected PropertyChangeSupport listeners = new PropertyChangeSupport (this); public void addPropertyChangeListener(PropertyChangeListener l) { listeners.addPropertyChangeListener (l); } public void removePropertyChangeListener(PropertyChangeListener l) { listeners.removePropertyChangeListener (l); } /** update our internal font, then tell everyone about it */ protected void fireStateChange() { Font oldFont = specifiedFont; specifiedFont = getSpecifiedFont(); listeners.firePropertyChange ("style", oldFont, specifiedFont); } /** Put up a frame containing a font chooser to make it easy for a script * to play with. */ public static void main(String[] args) { final JFrame frame = new JFrame("Font Chooser unit test"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { frame.dispose(); } }); final JPanel panel = new JPanel(new BorderLayout()); //panel.setBorder(new EmptyBorder(10, 10, 10, 10)); String text = "The quick brown fox jumped over the lazy dog"; FontChooser chooser = new FontChooser(); panel.add(chooser, BorderLayout.NORTH); final JLabel label = new JLabel(text); panel.add(label, BorderLayout.CENTER); label.setFont(chooser.getSpecifiedFont()); frame.getContentPane().add(panel); ((JPanel)frame.getContentPane()).setBorder(new EmptyBorder(4,4,4,4)); // Position the frame away from the screen edge to avoid stupid // toolbars and such frame.setLocation(new Point(50, 50)); frame.setSize(400, 300); frame.pack(); Dimension s1 = panel.getPreferredSize(); Dimension s2 = frame.getPreferredSize(); final int hoff = s2.height - s1.height; final int width = s2.width; chooser.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent ev) { label.setFont((Font)ev.getNewValue()); if (frame != null) { Dimension size = panel.getPreferredSize(); size.height += hoff; size.width = width; frame.setSize(size); } } }); frame.show(); } }