1 package example;
2
3 import java.awt;
4 import java.awt.event;
5 import java.beans;
6
7 import javax.swing;
8 import javax.swing.border.EmptyBorder;
9
10 /**
11 * Select a font
12 */
13
14 public class FontChooser extends JPanel
15 implements PropertyChangeListener, ItemListener {
16 protected Font specifiedFont = new Font ("Serif", Font.PLAIN, 10);
17 protected JComboBox name;
18 protected JCheckBox bold, italic;
19 protected NumberChooser size;
20 protected static String[] availableFonts = null;
21
22 public FontChooser () {
23 setLayout (new GridLayout (2, 2));
24 if (availableFonts == null){
25 GraphicsEnvironment ge =
26 GraphicsEnvironment.getLocalGraphicsEnvironment();
27 availableFonts = ge.getAvailableFontFamilyNames();
28 }
29 name = new JComboBox (availableFonts);
30 name.setSelectedItem (specifiedFont.getName ());
31 name.addItemListener (this);
32 add(name);
33 size = new NumberChooser(1, 128, specifiedFont.getSize());
34 add (size);
35 size.setColumns (3);
36 size.addPropertyChangeListener (this);
37 add (bold = new JCheckBox ("bold"));
38 bold.setSelected (specifiedFont.isBold ());
39 bold.addItemListener (this);
40 add (italic = new JCheckBox ("italic"));
41 italic.setSelected (specifiedFont.isItalic ());
42 italic.addItemListener (this);
43 }
44
45 public void setSpecifiedFont(Font f) {
46 name.setSelectedItem (f.getName ());
47 bold.setSelected (f.isBold ());
48 italic.setSelected (f.isItalic ());
49 size.setValue (f.getSize ());
50 fireStateChange ();
51 }
52
53 public Font getSpecifiedFont () {
54 return new Font ((String)name.getSelectedItem (),
55 (bold.isSelected() ? Font.BOLD: 0) |
56 (italic.isSelected() ? Font.ITALIC: 0),
57 size.getValue());
58 }
59
60 public void itemStateChanged (ItemEvent e) {
61 fireStateChange();
62 }
63
64 public void propertyChange (PropertyChangeEvent e) {
65 fireStateChange();
66 }
67
68 protected PropertyChangeSupport listeners =
69 new PropertyChangeSupport (this);
70
71 public void addPropertyChangeListener(PropertyChangeListener l) {
72 listeners.addPropertyChangeListener (l);
73 }
74
75 public void removePropertyChangeListener(PropertyChangeListener l) {
76 listeners.removePropertyChangeListener (l);
77 }
78
79 /** update our internal font, then tell everyone about it */
80 protected void fireStateChange() {
81 Font oldFont = specifiedFont;
82 specifiedFont = getSpecifiedFont();
83 listeners.firePropertyChange ("style", oldFont, specifiedFont);
84 }
85
86 /** Put up a frame containing a font chooser to make it easy for a script
87 * to play with.
88 */
89 public static void main(String[] args) {
90 final JFrame frame = new JFrame("Font Chooser unit test");
91 frame.addWindowListener(new WindowAdapter() {
92 public void windowClosing(WindowEvent e) {
93 frame.dispose();
94 }
95 });
96 final JPanel panel = new JPanel(new BorderLayout());
97 //panel.setBorder(new EmptyBorder(10, 10, 10, 10));
98 String text = "The quick brown fox jumped over the lazy dog";
99 FontChooser chooser = new FontChooser();
100 panel.add(chooser, BorderLayout.NORTH);
101 final JLabel label = new JLabel(text);
102 panel.add(label, BorderLayout.CENTER);
103 label.setFont(chooser.getSpecifiedFont());
104 frame.getContentPane().add(panel);
105 ((JPanel)frame.getContentPane()).setBorder(new EmptyBorder(4,4,4,4));
106
107 // Position the frame away from the screen edge to avoid stupid
108 // toolbars and such
109 frame.setLocation(new Point(50, 50));
110 frame.setSize(400, 300);
111 frame.pack();
112
113 Dimension s1 = panel.getPreferredSize();
114 Dimension s2 = frame.getPreferredSize();
115 final int hoff = s2.height - s1.height;
116 final int width = s2.width;
117 chooser.addPropertyChangeListener(new PropertyChangeListener() {
118 public void propertyChange(PropertyChangeEvent ev) {
119 label.setFont((Font)ev.getNewValue());
120 if (frame != null) {
121 Dimension size = panel.getPreferredSize();
122 size.height += hoff;
123 size.width = width;
124 frame.setSize(size);
125 }
126 }
127 });
128 frame.setVisible(true);
129 }
130 }
131