Java/Tiny Application

Материал из Java эксперт
Перейти к: навигация, поиск

Advanced Font Chooser

   <source lang="java">

import java.awt.BorderLayout; import java.awt.Color; import java.awt.ruponent; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Graphics; import java.awt.GraphicsEnvironment; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.ResultSet; import java.sql.SQLException; import javax.accessibility.AccessibleContext; import javax.accessibility.AccessibleRole; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.ListCellRenderer; import javax.swing.ListModel; import javax.swing.ToolTipManager; import javax.swing.border.rupoundBorder; import javax.swing.border.EtchedBorder; import javax.swing.border.LineBorder; import javax.swing.border.MatteBorder; import javax.swing.border.TitledBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.text.AttributeSet; import javax.swing.text.MutableAttributeSet; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; public class AdvancedFontChooser extends JDialog {

 protected int Closed_Option = JOptionPane.CLOSED_OPTION;
 protected InputList fontNameInputList = new InputList(fontNames, "Name:");
 protected InputList fontSizeInputList = new InputList(fontSizes, "Size:");
 protected MutableAttributeSet attributes;
 protected JCheckBox boldCheckBox = new JCheckBox("Bold");
 protected JCheckBox italicCheckBox = new JCheckBox("Italic");
 protected JCheckBox underlineCheckBox = new JCheckBox("Underline");
 protected JCheckBox strikethroughCheckBox = new JCheckBox("Strikethrough");
 protected JCheckBox subscriptCheckBox = new JCheckBox("Subscript");
 protected JCheckBox superscriptCheckBox = new JCheckBox("Superscript");
 protected ColorComboBox colorComboBox;
 protected FontLabel previewLabel;
 public static String[] fontNames;
 public static String[] fontSizes;
 public AdvancedFontChooser(JFrame owner) {
   super(owner, "Font Chooser", false);
   getContentPane().setLayout(
       new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
   JPanel p = new JPanel(new GridLayout(1, 2, 10, 2));
   p.setBorder(new TitledBorder(new EtchedBorder(), "Font"));
   p.add(fontNameInputList);
   fontNameInputList.setDisplayedMnemonic("n");
   fontNameInputList.setToolTipText("Font name");
   p.add(fontSizeInputList);
   fontSizeInputList.setDisplayedMnemonic("s");
   fontSizeInputList.setToolTipText("Font size");
   getContentPane().add(p);
   p = new JPanel(new GridLayout(2, 3, 10, 5));
   p.setBorder(new TitledBorder(new EtchedBorder(), "Effects"));
   boldCheckBox.setMnemonic("b");
   boldCheckBox.setToolTipText("Bold font");
   p.add(boldCheckBox);
   italicCheckBox.setMnemonic("i");
   italicCheckBox.setToolTipText("Italic font");
   p.add(italicCheckBox);
   underlineCheckBox.setMnemonic("u");
   underlineCheckBox.setToolTipText("Underline font");
   p.add(underlineCheckBox);
   strikethroughCheckBox.setMnemonic("r");
   strikethroughCheckBox.setToolTipText("Strikethrough font");
   p.add(strikethroughCheckBox);
   subscriptCheckBox.setMnemonic("t");
   subscriptCheckBox.setToolTipText("Subscript font");
   p.add(subscriptCheckBox);
   superscriptCheckBox.setMnemonic("p");
   superscriptCheckBox.setToolTipText("Superscript font");
   p.add(superscriptCheckBox);
   getContentPane().add(p);
   getContentPane().add(Box.createVerticalStrut(5));
   p = new JPanel();
   p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
   p.add(Box.createHorizontalStrut(10));
   JLabel lbl = new JLabel("Color:");
   lbl.setDisplayedMnemonic("c");
   p.add(lbl);
   p.add(Box.createHorizontalStrut(20));
   colorComboBox = new ColorComboBox();
   lbl.setLabelFor(colorComboBox);
   colorComboBox.setToolTipText("Font color");
   ToolTipManager.sharedInstance().registerComponent(colorComboBox);
   p.add(colorComboBox);
   p.add(Box.createHorizontalStrut(10));
   getContentPane().add(p);
   p = new JPanel(new BorderLayout());
   p.setBorder(new TitledBorder(new EtchedBorder(), "Preview"));
   previewLabel = new FontLabel("Preview Font");
   p.add(previewLabel, BorderLayout.CENTER);
   getContentPane().add(p);
   p = new JPanel(new FlowLayout());
   JPanel p1 = new JPanel(new GridLayout(1, 2, 10, 2));
   JButton btOK = new JButton("OK");
   btOK.setToolTipText("Save and exit");
   getRootPane().setDefaultButton(btOK);
   ActionListener actionListener = new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       Closed_Option = JOptionPane.OK_OPTION;
       dispose();
     }
   };
   btOK.addActionListener(actionListener);
   p1.add(btOK);
   JButton btCancel = new JButton("Cancel");
   btCancel.setToolTipText("Exit without save");
   actionListener = new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       Closed_Option = JOptionPane.CANCEL_OPTION;
       dispose();
     }
   };
   btCancel.addActionListener(actionListener);
   p1.add(btCancel);
   p.add(p1);
   getContentPane().add(p);
   pack();
   setResizable(false);
   ListSelectionListener listSelectListener = new ListSelectionListener() {
     public void valueChanged(ListSelectionEvent e) {
       updatePreview();
     }
   };
   fontNameInputList.addListSelectionListener(listSelectListener);
   fontSizeInputList.addListSelectionListener(listSelectListener);
   actionListener = new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       updatePreview();
     }
   };
   boldCheckBox.addActionListener(actionListener);
   italicCheckBox.addActionListener(actionListener);
   colorComboBox.addActionListener(actionListener);
 }
 public void setAttributes(AttributeSet a) {
   attributes = new SimpleAttributeSet(a);
   String name = StyleConstants.getFontFamily(a);
   fontNameInputList.setSelected(name);
   int size = StyleConstants.getFontSize(a);
   fontSizeInputList.setSelectedInt(size);
   boldCheckBox.setSelected(StyleConstants.isBold(a));
   italicCheckBox.setSelected(StyleConstants.isItalic(a));
   underlineCheckBox.setSelected(StyleConstants.isUnderline(a));
   strikethroughCheckBox.setSelected(StyleConstants.isStrikeThrough(a));
   subscriptCheckBox.setSelected(StyleConstants.isSubscript(a));
   superscriptCheckBox.setSelected(StyleConstants.isSuperscript(a));
   colorComboBox.setSelectedItem(StyleConstants.getForeground(a));
   updatePreview();
 }
 public AttributeSet getAttributes() {
   if (attributes == null)
     return null;
   StyleConstants.setFontFamily(attributes, fontNameInputList
       .getSelected());
   StyleConstants.setFontSize(attributes, fontSizeInputList
       .getSelectedInt());
   StyleConstants.setBold(attributes, boldCheckBox.isSelected());
   StyleConstants.setItalic(attributes, italicCheckBox.isSelected());
   StyleConstants.setUnderline(attributes, underlineCheckBox.isSelected());
   StyleConstants.setStrikeThrough(attributes, strikethroughCheckBox
       .isSelected());
   StyleConstants.setSubscript(attributes, subscriptCheckBox.isSelected());
   StyleConstants.setSuperscript(attributes, superscriptCheckBox
       .isSelected());
   StyleConstants.setForeground(attributes, (Color) colorComboBox
       .getSelectedItem());
   return attributes;
 }
 public int getOption() {
   return Closed_Option;
 }
 protected void updatePreview() {
   String name = fontNameInputList.getSelected();
   int size = fontSizeInputList.getSelectedInt();
   if (size <= 0)
     return;
   int style = Font.PLAIN;
   if (boldCheckBox.isSelected())
     style |= Font.BOLD;
   if (italicCheckBox.isSelected())
     style |= Font.ITALIC;
   Font fn = new Font(name, style, size);
   previewLabel.setFont(fn);
   Color c = (Color) colorComboBox.getSelectedItem();
   previewLabel.setForeground(c);
   previewLabel.repaint();
 }
 public static void main(String argv[]) {
   GraphicsEnvironment ge = GraphicsEnvironment
       .getLocalGraphicsEnvironment();
   fontNames = ge.getAvailableFontFamilyNames();
   fontSizes = new String[] { "8", "9", "10", "11", "12", "14", "16",
       "18", "20", "22", "24", "26", "28", "36", "48", "72" };
   AdvancedFontChooser dlg = new AdvancedFontChooser(new JFrame());
   SimpleAttributeSet a = new SimpleAttributeSet();
   StyleConstants.setFontFamily(a, "Monospaced");
   StyleConstants.setFontSize(a, 12);
   dlg.setAttributes(a);
   dlg.show();
 }

} class InputList extends JPanel implements ListSelectionListener, ActionListener {

 protected JLabel label = new JLabel();
 protected JTextField textfield;
 protected JList list;
 protected JScrollPane scroll;
 public InputList(String[] data, String title) {
   setLayout(null);
   add(label);
   textfield = new OpelListText();
   textfield.addActionListener(this);
   label.setLabelFor(textfield);
   add(textfield);
   list = new OpelListList(data);
   list.setVisibleRowCount(4);
   list.addListSelectionListener(this);
   scroll = new JScrollPane(list);
   add(scroll);
 }
 public InputList(String title, int numCols) {
   setLayout(null);
   label = new OpelListLabel(title, JLabel.LEFT);
   add(label);
   textfield = new OpelListText(numCols);
   textfield.addActionListener(this);
   label.setLabelFor(textfield);
   add(textfield);
   list = new OpelListList();
   list.setVisibleRowCount(4);
   list.addListSelectionListener(this);
   scroll = new JScrollPane(list);
   add(scroll);
 }
 public void setToolTipText(String text) {
   super.setToolTipText(text);
   label.setToolTipText(text);
   textfield.setToolTipText(text);
   list.setToolTipText(text);
 }
 public void setDisplayedMnemonic(char ch) {
   label.setDisplayedMnemonic(ch);
 }
 public void setSelected(String sel) {
   list.setSelectedValue(sel, true);
   textfield.setText(sel);
 }
 public String getSelected() {
   return textfield.getText();
 }
 public void setSelectedInt(int value) {
   setSelected(Integer.toString(value));
 }
 public int getSelectedInt() {
   try {
     return Integer.parseInt(getSelected());
   } catch (NumberFormatException ex) {
     return -1;
   }
 }
 public void valueChanged(ListSelectionEvent e) {
   Object obj = list.getSelectedValue();
   if (obj != null)
     textfield.setText(obj.toString());
 }
 public void actionPerformed(ActionEvent e) {
   ListModel model = list.getModel();
   String key = textfield.getText().toLowerCase();
   for (int k = 0; k < model.getSize(); k++) {
     String data = (String) model.getElementAt(k);
     if (data.toLowerCase().startsWith(key)) {
       list.setSelectedValue(data, true);
       break;
     }
   }
 }
 public void addListSelectionListener(ListSelectionListener lst) {
   list.addListSelectionListener(lst);
 }
 public Dimension getPreferredSize() {
   Insets ins = getInsets();
   Dimension labelSize = label.getPreferredSize();
   Dimension textfieldSize = textfield.getPreferredSize();
   Dimension scrollPaneSize = scroll.getPreferredSize();
   int w = Math.max(Math.max(labelSize.width, textfieldSize.width),
       scrollPaneSize.width);
   int h = labelSize.height + textfieldSize.height + scrollPaneSize.height;
   return new Dimension(w + ins.left + ins.right, h + ins.top + ins.bottom);
 }
 public Dimension getMaximumSize() {
   return getPreferredSize();
 }
 public Dimension getMinimumSize() {
   return getPreferredSize();
 }
 public void doLayout() {
   Insets ins = getInsets();
   Dimension size = getSize();
   int x = ins.left;
   int y = ins.top;
   int w = size.width - ins.left - ins.right;
   int h = size.height - ins.top - ins.bottom;
   Dimension labelSize = label.getPreferredSize();
   label.setBounds(x, y, w, labelSize.height);
   y += labelSize.height;
   Dimension textfieldSize = textfield.getPreferredSize();
   textfield.setBounds(x, y, w, textfieldSize.height);
   y += textfieldSize.height;
   scroll.setBounds(x, y, w, h - y);
 }
 public void appendResultSet(ResultSet results, int index,
     boolean toTitleCase) {
   textfield.setText("");
   DefaultListModel model = new DefaultListModel();
   try {
     while (results.next()) {
       String str = results.getString(index);
       if (toTitleCase) {
         str = Character.toUpperCase(str.charAt(0))
             + str.substring(1);
       }
       model.addElement(str);
     }
   } catch (SQLException ex) {
     System.err.println("appendResultSet: " + ex.toString());
   }
   list.setModel(model);
   if (model.getSize() > 0)
     list.setSelectedIndex(0);
 }
 class OpelListLabel extends JLabel {
   public OpelListLabel(String text, int alignment) {
     super(text, alignment);
   }
   public AccessibleContext getAccessibleContext() {
     return InputList.this.getAccessibleContext();
   }
 }
 class OpelListText extends JTextField {
   public OpelListText() {
   }
   public OpelListText(int numCols) {
     super(numCols);
   }
   public AccessibleContext getAccessibleContext() {
     return InputList.this.getAccessibleContext();
   }
 }
 class OpelListList extends JList {
   public OpelListList() {
   }
   public OpelListList(String[] data) {
     super(data);
   }
   public AccessibleContext getAccessibleContext() {
     return InputList.this.getAccessibleContext();
   }
 }
 // Accessibility Support
 public AccessibleContext getAccessibleContext() {
   if (accessibleContext == null)
     accessibleContext = new AccessibleOpenList();
   return accessibleContext;
 }
 protected class AccessibleOpenList extends AccessibleJComponent {
   public String getAccessibleName() {
     System.out.println("getAccessibleName: " + accessibleName);
     if (accessibleName != null)
       return accessibleName;
     return label.getText();
   }
   public AccessibleRole getAccessibleRole() {
     return AccessibleRole.LIST;
   }
 }

} class FontLabel extends JLabel {

 public FontLabel(String text) {
   super(text, JLabel.CENTER);
   setBackground(Color.white);
   setForeground(Color.black);
   setOpaque(true);
   setBorder(new LineBorder(Color.black));
   setPreferredSize(new Dimension(120, 40));
 }

} class ColorComboBox extends JComboBox {

 public ColorComboBox() {
   int[] values = new int[] { 0, 128, 192, 255 };
   for (int r = 0; r < values.length; r++)
     for (int g = 0; g < values.length; g++)
       for (int b = 0; b < values.length; b++) {
         Color c = new Color(values[r], values[g], values[b]);
         addItem(c);
       }
   setRenderer(new ColorComboRenderer1());
 }
 class ColorComboRenderer1 extends JPanel implements ListCellRenderer {
   protected Color m_c = Color.black;
   public ColorComboRenderer1() {
     super();
     setBorder(new CompoundBorder(new MatteBorder(2, 10, 2, 10,
         Color.white), new LineBorder(Color.black)));
   }
   public Component getListCellRendererComponent(JList list, Object obj,
       int row, boolean sel, boolean hasFocus) {
     if (obj instanceof Color)
       m_c = (Color) obj;
     return this;
   }
   public void paint(Graphics g) {
     setBackground(m_c);
     super.paint(g);
   }
 }

}


      </source>
   
  
 
  



Advanced Font Chooser revised by pole

   <source lang="java">

import java.awt.BorderLayout; import java.awt.Color; import java.awt.ruponent; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Graphics; import java.awt.GraphicsEnvironment; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.font.TextAttribute; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import javax.accessibility.AccessibleContext; import javax.accessibility.AccessibleRole; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ListCellRenderer; import javax.swing.ListModel; import javax.swing.ToolTipManager; import javax.swing.border.rupoundBorder; import javax.swing.border.EtchedBorder; import javax.swing.border.LineBorder; import javax.swing.border.MatteBorder; import javax.swing.border.TitledBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.text.AttributeSet; import javax.swing.text.MutableAttributeSet; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import static java.awt.font.TextAttribute.*; public class FontChooserWithPole extends JDialog {

 protected int Closed_Option = JOptionPane.CLOSED_OPTION;
 protected InputList fontNameInputList = new InputList(fontNames, "Name:");
 protected InputList fontSizeInputList = new InputList(fontSizes, "Size:");
 protected MutableAttributeSet attributes;
 protected JCheckBox boldCheckBox = new JCheckBox("Bold");
 protected JCheckBox italicCheckBox = new JCheckBox("Italic");
 protected JCheckBox underlineCheckBox = new JCheckBox("Underline");
 protected JCheckBox strikethroughCheckBox = new JCheckBox("Strikethrough");
 protected JCheckBox subscriptCheckBox = new JCheckBox("Subscript");
 protected JCheckBox superscriptCheckBox = new JCheckBox("Superscript");
 protected ColorComboBox colorComboBox;
 protected FontLabel previewLabel;
 public static String[] fontNames;
 public static String[] fontSizes;
 private static final String PREVIEW_TEXT = "Preview Font";
 public FontChooserWithPole(JFrame owner) {
   super(owner, "Font Chooser", false);
   getContentPane().setLayout(
       new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
   JPanel p = new JPanel(new GridLayout(1, 2, 10, 2));
   p.setBorder(new TitledBorder(new EtchedBorder(), "Font"));
   p.add(fontNameInputList);
   fontNameInputList.setDisplayedMnemonic("n");
   fontNameInputList.setToolTipText("Font name");
   p.add(fontSizeInputList);
   fontSizeInputList.setDisplayedMnemonic("s");
   fontSizeInputList.setToolTipText("Font size");
   getContentPane().add(p);
   p = new JPanel(new GridLayout(2, 3, 10, 5));
   p.setBorder(new TitledBorder(new EtchedBorder(), "Effects"));
   boldCheckBox.setMnemonic("b");
   boldCheckBox.setToolTipText("Bold font");
   p.add(boldCheckBox);
   italicCheckBox.setMnemonic("i");
   italicCheckBox.setToolTipText("Italic font");
   p.add(italicCheckBox);
   underlineCheckBox.setMnemonic("u");
   underlineCheckBox.setToolTipText("Underline font");
   p.add(underlineCheckBox);
   strikethroughCheckBox.setMnemonic("r");
   strikethroughCheckBox.setToolTipText("Strikethrough font");
   p.add(strikethroughCheckBox);
   subscriptCheckBox.setMnemonic("t");
   subscriptCheckBox.setToolTipText("Subscript font");
   p.add(subscriptCheckBox);
   superscriptCheckBox.setMnemonic("p");
   superscriptCheckBox.setToolTipText("Superscript font");
   p.add(superscriptCheckBox);
   getContentPane().add(p);
   getContentPane().add(Box.createVerticalStrut(5));
   p = new JPanel();
   p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
   p.add(Box.createHorizontalStrut(10));
   JLabel lbl = new JLabel("Color:");
   lbl.setDisplayedMnemonic("c");
   p.add(lbl);
   p.add(Box.createHorizontalStrut(20));
   colorComboBox = new ColorComboBox();
   lbl.setLabelFor(colorComboBox);
   colorComboBox.setToolTipText("Font color");
   ToolTipManager.sharedInstance().registerComponent(colorComboBox);
   p.add(colorComboBox);
   p.add(Box.createHorizontalStrut(10));
   getContentPane().add(p);
   p = new JPanel(new BorderLayout());
   p.setBorder(new TitledBorder(new EtchedBorder(), "Preview"));
   previewLabel = new FontLabel(PREVIEW_TEXT);
   p.add(previewLabel, BorderLayout.CENTER);
   getContentPane().add(p);
   p = new JPanel(new FlowLayout());
   JPanel p1 = new JPanel(new GridLayout(1, 2, 10, 2));
   JButton btOK = new JButton("OK");
   btOK.setToolTipText("Save and exit");
   getRootPane().setDefaultButton(btOK);
   ActionListener actionListener = new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       Closed_Option = JOptionPane.OK_OPTION;
       dispose();
     }
   };
   btOK.addActionListener(actionListener);
   p1.add(btOK);
   JButton btCancel = new JButton("Cancel");
   btCancel.setToolTipText("Exit without save");
   actionListener = new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       Closed_Option = JOptionPane.CANCEL_OPTION;
       dispose();
     }
   };
   btCancel.addActionListener(actionListener);
   p1.add(btCancel);
   p.add(p1);
   getContentPane().add(p);
   pack();
   setResizable(false);
   ListSelectionListener listSelectListener = new ListSelectionListener() {
     public void valueChanged(ListSelectionEvent e) {
       updatePreview();
     }
   };  fontNameInputList.addListSelectionListener(listSelectListener);
   fontSizeInputList.addListSelectionListener(listSelectListener);
   actionListener = new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       updatePreview();
     }
   };
   boldCheckBox.addActionListener(actionListener);
   italicCheckBox.addActionListener(actionListener);
   colorComboBox.addActionListener(actionListener);
   underlineCheckBox.addActionListener(actionListener);
   strikethroughCheckBox.addActionListener(actionListener);
   subscriptCheckBox.addActionListener(actionListener);
   superscriptCheckBox.addActionListener(actionListener);
 }
 public void setAttributes(AttributeSet a) {
   attributes = new SimpleAttributeSet(a);
   String name = StyleConstants.getFontFamily(a);
   fontNameInputList.setSelected(name);
   int size = StyleConstants.getFontSize(a);
   fontSizeInputList.setSelectedInt(size);
   boldCheckBox.setSelected(StyleConstants.isBold(a));
   italicCheckBox.setSelected(StyleConstants.isItalic(a));
   underlineCheckBox.setSelected(StyleConstants.isUnderline(a));
   strikethroughCheckBox.setSelected(StyleConstants.isStrikeThrough(a));
   subscriptCheckBox.setSelected(StyleConstants.isSubscript(a));
   superscriptCheckBox.setSelected(StyleConstants.isSuperscript(a));
   colorComboBox.setSelectedItem(StyleConstants.getForeground(a));
   updatePreview();
 }
 public AttributeSet getAttributes() {
   if (attributes == null)
     return null;
   StyleConstants.setFontFamily(attributes, fontNameInputList
       .getSelected());
   StyleConstants.setFontSize(attributes, fontSizeInputList
       .getSelectedInt());
   StyleConstants.setBold(attributes, boldCheckBox.isSelected());
   StyleConstants.setItalic(attributes, italicCheckBox.isSelected());
   StyleConstants.setUnderline(attributes, underlineCheckBox.isSelected());
   StyleConstants.setStrikeThrough(attributes, strikethroughCheckBox
       .isSelected());
   StyleConstants.setSubscript(attributes, subscriptCheckBox.isSelected());
   StyleConstants.setSuperscript(attributes, superscriptCheckBox
       .isSelected());
   StyleConstants.setForeground(attributes, (Color) colorComboBox.getSelectedItem());
   return attributes;
 }
 public int getOption() {
   return Closed_Option;
 }
 protected void updatePreview() {
   StringBuilder previewText = new StringBuilder(PREVIEW_TEXT);
   String name = fontNameInputList.getSelected();
   int size = fontSizeInputList.getSelectedInt();
   if (size <= 0)
     return;
   Map<TextAttribute, Object> attributes = new HashMap<TextAttribute, Object>();
   attributes.put(FAMILY, name);
   attributes.put(SIZE, (float)size);
   // Using HTML to force JLabel manage natively unsupported attributes
   if (underlineCheckBox.isSelected() || strikethroughCheckBox.isSelected()){
     previewText.insert(0,"<html>");
     previewText.append("</html>");
   }
   if (underlineCheckBox.isSelected()){
     attributes.put(UNDERLINE, UNDERLINE_LOW_ONE_PIXEL);
     previewText.insert(6,"");
     previewText.insert(previewText.length() - 7, "");
   }
   if (strikethroughCheckBox.isSelected()){
     attributes.put(STRIKETHROUGH, STRIKETHROUGH_ON);
     previewText.insert(6,"");
     previewText.insert(previewText.length() - 7, "");
   }
   if (boldCheckBox.isSelected())
     attributes.put(WEIGHT, WEIGHT_BOLD);
   if (italicCheckBox.isSelected())
     attributes.put(POSTURE, POSTURE_OBLIQUE);
   if (subscriptCheckBox.isSelected()){
     attributes.put(SUPERSCRIPT, SUPERSCRIPT_SUB);
   }
   if (superscriptCheckBox.isSelected())
     attributes.put(SUPERSCRIPT, SUPERSCRIPT_SUPER);
   superscriptCheckBox.setEnabled(!subscriptCheckBox.isSelected());
   subscriptCheckBox.setEnabled(!superscriptCheckBox.isSelected());
   Font fn = new Font(attributes);
   previewLabel.setText(previewText.toString());
   previewLabel.setFont(fn);
   Color c = (Color) colorComboBox.getSelectedItem();
   previewLabel.setForeground(c);
   previewLabel.repaint();
 }
 public static void main(String argv[]) {
   GraphicsEnvironment ge = GraphicsEnvironment
       .getLocalGraphicsEnvironment();
   fontNames = ge.getAvailableFontFamilyNames();
   fontSizes = new String[] { "8", "9", "10", "11", "12", "14", "16",
       "18", "20", "22", "24", "26", "28", "36", "48", "72" };
   FontChooserWithPole dlg = new FontChooserWithPole(new JFrame());
   SimpleAttributeSet a = new SimpleAttributeSet();
   StyleConstants.setFontFamily(a, "Monospaced");
   StyleConstants.setFontSize(a, 12);
   dlg.setAttributes(a);
   dlg.setVisible(true);
 }

} class InputList extends JPanel implements ListSelectionListener, ActionListener {

 protected JLabel label = new JLabel();
 protected JTextField textfield;
 protected JList list;
 protected JScrollPane scroll;
 public InputList(String[] data, String title) {
   setLayout(null);
   add(label);
   textfield = new OpelListText();
   textfield.addActionListener(this);
   label.setLabelFor(textfield);
   add(textfield);
   list = new OpelListList(data);
   list.setVisibleRowCount(4);
   list.addListSelectionListener(this);
   scroll = new JScrollPane(list);
   add(scroll);
 }
 public InputList(String title, int numCols) {
   setLayout(null);
   label = new OpelListLabel(title, JLabel.LEFT);
   add(label);
   textfield = new OpelListText(numCols);
   textfield.addActionListener(this);
   label.setLabelFor(textfield);
   add(textfield);
   list = new OpelListList();
   list.setVisibleRowCount(4);
   list.addListSelectionListener(this);
   scroll = new JScrollPane(list);
   add(scroll);
 }
 public void setToolTipText(String text) {
   super.setToolTipText(text);
   label.setToolTipText(text);
   textfield.setToolTipText(text);
   list.setToolTipText(text);
 }
 public void setDisplayedMnemonic(char ch) {
   label.setDisplayedMnemonic(ch);
 }
 public void setSelected(String sel) {
   list.setSelectedValue(sel, true);
   textfield.setText(sel);
 }
 public String getSelected() {
   return textfield.getText();
 }
 public void setSelectedInt(int value) {
   setSelected(Integer.toString(value));
 }
 public int getSelectedInt() {
   try {
     return Integer.parseInt(getSelected());
   } catch (NumberFormatException ex) {
     return -1;
   }
 }
 public void valueChanged(ListSelectionEvent e) {
   Object obj = list.getSelectedValue();
   if (obj != null)
     textfield.setText(obj.toString());
 }
 public void actionPerformed(ActionEvent e) {
   ListModel model = list.getModel();
   String key = textfield.getText().toLowerCase();
   for (int k = 0; k < model.getSize(); k++) {
     String data = (String) model.getElementAt(k);
     if (data.toLowerCase().startsWith(key)) {
       list.setSelectedValue(data, true);
       break;
     }
   }
 }
 public void addListSelectionListener(ListSelectionListener lst) {
   list.addListSelectionListener(lst);
 }
 public Dimension getPreferredSize() {
   Insets ins = getInsets();
   Dimension labelSize = label.getPreferredSize();
   Dimension textfieldSize = textfield.getPreferredSize();
   Dimension scrollPaneSize = scroll.getPreferredSize();
   int w = Math.max(Math.max(labelSize.width, textfieldSize.width),
       scrollPaneSize.width);
   int h = labelSize.height + textfieldSize.height + scrollPaneSize.height;
   return new Dimension(w + ins.left + ins.right, h + ins.top + ins.bottom);
 }
 public Dimension getMaximumSize() {
   return getPreferredSize();
 }
 public Dimension getMinimumSize() {
   return getPreferredSize();
 }
 public void doLayout() {
   Insets ins = getInsets();
   Dimension size = getSize();
   int x = ins.left;
   int y = ins.top;
   int w = size.width - ins.left - ins.right;
   int h = size.height - ins.top - ins.bottom;
   Dimension labelSize = label.getPreferredSize();
   label.setBounds(x, y, w, labelSize.height);
   y += labelSize.height;
   Dimension textfieldSize = textfield.getPreferredSize();
   textfield.setBounds(x, y, w, textfieldSize.height);
   y += textfieldSize.height;
   scroll.setBounds(x, y, w, h - y);
 }
 public void appendResultSet(ResultSet results, int index,
     boolean toTitleCase) {
   textfield.setText("");
   DefaultListModel model = new DefaultListModel();
   try {
     while (results.next()) {
       String str = results.getString(index);
       if (toTitleCase) {
         str = Character.toUpperCase(str.charAt(0))
             + str.substring(1);
       }
       model.addElement(str);
     }
   } catch (SQLException ex) {
     System.err.println("appendResultSet: " + ex.toString());
   }
   list.setModel(model);
   if (model.getSize() > 0)
     list.setSelectedIndex(0);
 }
 class OpelListLabel extends JLabel {
   public OpelListLabel(String text, int alignment) {
     super(text, alignment);
   }
   public AccessibleContext getAccessibleContext() {
     return InputList.this.getAccessibleContext();
   }
 }
 class OpelListText extends JTextField {
   public OpelListText() {
   }
   public OpelListText(int numCols) {
     super(numCols);
   }
   public AccessibleContext getAccessibleContext() {
     return InputList.this.getAccessibleContext();
   }
 }
 class OpelListList extends JList {
   public OpelListList() {
   }
   public OpelListList(String[] data) {
     super(data);
   }
   public AccessibleContext getAccessibleContext() {
     return InputList.this.getAccessibleContext();
   }
 }
 // Accessibility Support
 public AccessibleContext getAccessibleContext() {
   if (accessibleContext == null)
     accessibleContext = new AccessibleOpenList();
   return accessibleContext;
 }
 protected class AccessibleOpenList extends AccessibleJComponent {
   public String getAccessibleName() {
     System.out.println("getAccessibleName: " + accessibleName);
     if (accessibleName != null)
       return accessibleName;
     return label.getText();
   }
   public AccessibleRole getAccessibleRole() {
     return AccessibleRole.LIST;
   }
 }

} class FontLabel extends JLabel {

 public FontLabel(String text) {
   super(text, JLabel.CENTER);
   setBackground(Color.white);
   setForeground(Color.black);
   setOpaque(true);
   setBorder(new LineBorder(Color.black));
   setPreferredSize(new Dimension(120, 40));
 }

} class ColorComboBox extends JComboBox {

 public ColorComboBox() {
   int[] values = new int[] { 0, 128, 192, 255 };
   for (int r = 0; r < values.length; r++)
     for (int g = 0; g < values.length; g++)
       for (int b = 0; b < values.length; b++) {
         Color c = new Color(values[r], values[g], values[b]);
         addItem(c);
       }
   setRenderer(new ColorComboRenderer1());
 }
 class ColorComboRenderer1 extends JPanel implements ListCellRenderer {
   protected Color m_c = Color.black;
   public ColorComboRenderer1() {
     super();
     setBorder(new CompoundBorder(new MatteBorder(2, 10, 2, 10,
         Color.white), new LineBorder(Color.black)));
   }
   public Component getListCellRendererComponent(JList list, Object obj,
       int row, boolean sel, boolean hasFocus) {
     if (obj instanceof Color)
       m_c = (Color) obj;
     return this;
   }
   public void paint(Graphics g) {
     setBackground(m_c);
     super.paint(g);
   }
 }

}



      </source>
   
  
 
  



A font selection dialog

   <source lang="java">

/*

* Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002.
* All rights reserved. Software written by Ian F. Darwin and others.
* $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS""
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* 
* Java, the Duke mascot, and all variants of Sun"s Java "steaming coffee
* cup" logo are trademarks of Sun Microsystems. Sun"s, and James Gosling"s,
* pioneering role in inventing and promulgating (and standardizing) the Java 
* language and environment is gratefully acknowledged.
* 
* The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for
* inventing predecessor languages C and C++ is also gratefully acknowledged.
*/

import java.awt.BorderLayout; import java.awt.Checkbox; import java.awt.Container; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Frame; import java.awt.GraphicsEnvironment; import java.awt.GridLayout; import java.awt.List; import java.awt.Panel; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; /**

* A font selection dialog.
*

* Note: can take a long time to start up on systems with (literally) hundreds * of fonts. TODO change list to JList, add a SelectionChangedListener to * preview. * * @author Ian Darwin * @version $Id: FontChooser.java,v 1.19 2004/03/20 20:44:56 ian Exp $ */ public class FontChooser2 extends JDialog { // Results: /** 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; // Working fields /** Display text */ protected String displayText = "Qwerty Yuiop"; /** 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 index of the default size (e.g., 14 point == 4) */ protected static final int DEFAULT_SIZE = 4; /** * 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 FontChooser2(Frame f) { super(f, "Font Chooser", true); Container cp = getContentPane(); 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(DEFAULT_SIZE); 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(displayText, JLabel.CENTER); previewArea.setSize(200, 50); cp.add(previewArea, BorderLayout.CENTER); Panel bot = new Panel(); JButton okButton = new JButton("Apply"); bot.add(okButton); okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { previewFont(); dispose(); setVisible(false); } }); JButton pvButton = new JButton("Preview"); bot.add(pvButton); pvButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { previewFont(); } }); JButton canButton = new JButton("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(bot, BorderLayout.SOUTH); 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("FontChooser Startup"); final FontChooser2 fc = new FontChooser2(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!", JLabel.CENTER); 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(); // adjust for new size fc.dispose(); } }); f.setSize(150, 100); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } </source>

FontChooser

   <source lang="java">

import java.awt.BorderLayout; import java.awt.Container; import java.awt.Font; import java.awt.Frame; import java.awt.GraphicsEnvironment; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Iterator; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.border.EtchedBorder; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /*

* Copyright (c) 2000 David Flanagan.  All rights reserved.
* This code is from the book Java Examples in a Nutshell, 2nd Edition.
* It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.
* You may study, use, and modify it for any non-commercial purpose.
* You may distribute it non-commercially as long as you retain this notice.
* For a commercial use license, or to purchase the book (recommended),
* visit http://www.davidflanagan.ru/javaexamples2.
*/

/**

* This is a JDialog subclass that allows the user to select a font, in any
* style and size, from the list of available fonts on the system. The dialog is
* modal. Display it with show(); this method does not return until the user
* dismisses the dialog. When show() returns, call getSelectedFont() to obtain
* the user"s selection. If the user clicked the dialog"s "Cancel" button,
* getSelectedFont() will return null.
*/

public class FontChooser extends JDialog {

 // These fields define the component properties
 String family; // The name of the font family
 int style; // The font style
 int size; // The font size
 Font selectedFont; // The Font they correspond to
 // This is the list of all font families on the system
 String[] fontFamilies;
 // The various Swing components used in the dialog
 ItemChooser families, styles, sizes;
 JTextArea preview;
 JButton okay, cancel;
 // The names to appear in the "Style" menu
 static final String[] styleNames = new String[] { "Plain", "Italic",
     "Bold", "BoldItalic" };
 // The style values that correspond to those names
 static final Integer[] styleValues = new Integer[] {
     new Integer(Font.PLAIN), new Integer(Font.ITALIC),
     new Integer(Font.BOLD), new Integer(Font.BOLD + Font.ITALIC) };
 // The size "names" to appear in the size menu
 static final String[] sizeNames = new String[] { "8", "10", "12", "14",
     "18", "20", "24", "28", "32", "40", "48", "56", "64", "72" };
 // This is the default preview string displayed in the dialog box
 static final String defaultPreviewString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"
     + "abcdefghijklmnopqrstuvwxyz\n"
     + "1234567890!@#$%^&*()_-=+[]{}<,.>\n"
     + "The quick brown fox jumps over the lazy dog";
 /** Create a font chooser dialog for the specified frame. */
 public FontChooser(Frame owner) {
   super(owner, "Choose a Font"); // Set dialog frame and title
   // This dialog must be used as a modal dialog. In order to be used
   // as a modeless dialog, it would have to fire a PropertyChangeEvent
   // whenever the selected font changed, so that applications could be
   // notified of the user"s selections.
   setModal(true);
   // Figure out what fonts are available on the system
   GraphicsEnvironment env = GraphicsEnvironment
       .getLocalGraphicsEnvironment();
   fontFamilies = env.getAvailableFontFamilyNames();
   // Set initial values for the properties
   family = fontFamilies[0];
   style = Font.PLAIN;
   size = 18;
   selectedFont = new Font(family, style, size);
   // Create ItemChooser objects that allow the user to select font
   // family, style, and size.
   families = new ItemChooser("Family", fontFamilies, null, 0,
       ItemChooser.ruBOBOX);
   styles = new ItemChooser("Style", styleNames, styleValues, 0,
       ItemChooser.ruBOBOX);
   sizes = new ItemChooser("Size", sizeNames, null, 4,
       ItemChooser.ruBOBOX);
   // Now register event listeners to handle selections
   families.addItemChooserListener(new ItemChooser.Listener() {
     public void itemChosen(ItemChooser.Event e) {
       setFontFamily((String) e.getSelectedValue());
     }
   });
   styles.addItemChooserListener(new ItemChooser.Listener() {
     public void itemChosen(ItemChooser.Event e) {
       setFontStyle(((Integer) e.getSelectedValue()).intValue());
     }
   });
   sizes.addItemChooserListener(new ItemChooser.Listener() {
     public void itemChosen(ItemChooser.Event e) {
       setFontSize(Integer.parseInt((String) e.getSelectedValue()));
     }
   });
   // Create a component to preview the font.
   preview = new JTextArea(defaultPreviewString, 5, 40);
   preview.setFont(selectedFont);
   // Create buttons to dismiss the dialog, and set handlers on them
   okay = new JButton("Okay");
   cancel = new JButton("Cancel");
   okay.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       hide();
     }
   });
   cancel.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       selectedFont = null;
       hide();
     }
   });
   // Put the ItemChoosers in a Box
   Box choosersBox = Box.createHorizontalBox();
   choosersBox.add(Box.createHorizontalStrut(15));
   choosersBox.add(families);
   choosersBox.add(Box.createHorizontalStrut(15));
   choosersBox.add(styles);
   choosersBox.add(Box.createHorizontalStrut(15));
   choosersBox.add(sizes);
   choosersBox.add(Box.createHorizontalStrut(15));
   choosersBox.add(Box.createGlue());
   // Put the dismiss buttons in another box
   Box buttonBox = Box.createHorizontalBox();
   buttonBox.add(Box.createGlue());
   buttonBox.add(okay);
   buttonBox.add(Box.createGlue());
   buttonBox.add(cancel);
   buttonBox.add(Box.createGlue());
   // Put the choosers at the top, the buttons at the bottom, and
   // the preview in the middle.
   Container contentPane = getContentPane();
   contentPane.add(new JScrollPane(preview), BorderLayout.CENTER);
   contentPane.add(choosersBox, BorderLayout.NORTH);
   contentPane.add(buttonBox, BorderLayout.SOUTH);
   // Set the dialog size based on the component size.
   pack();
 }
 /**
  * Call this method after show() to obtain the user"s selection. If the user
  * used the "Cancel" button, this will return null
  */
 public Font getSelectedFont() {
   return selectedFont;
 }
 // These are other property getter methods
 public String getFontFamily() {
   return family;
 }
 public int getFontStyle() {
   return style;
 }
 public int getFontSize() {
   return size;
 }
 // The property setter methods are a little more complicated.
 // Note that none of these setter methods update the corresponding
 // ItemChooser components as they ought to.
 public void setFontFamily(String name) {
   family = name;
   changeFont();
 }
 public void setFontStyle(int style) {
   this.style = style;
   changeFont();
 }
 public void setFontSize(int size) {
   this.size = size;
   changeFont();
 }
 public void setSelectedFont(Font font) {
   selectedFont = font;
   family = font.getFamily();
   style = font.getStyle();
   size = font.getSize();
   preview.setFont(font);
 }
 // This method is called when the family, style, or size changes
 protected void changeFont() {
   selectedFont = new Font(family, style, size);
   preview.setFont(selectedFont);
 }
 // Override this inherited method to prevent anyone from making us modeless
 public boolean isModal() {
   return true;
 }
 public static void main(String[] args) {
   // Create some components and a FontChooser dialog
   final JFrame frame = new JFrame("demo");
   final JButton button = new JButton("Push Me!");
   final FontChooser chooser = new FontChooser(frame);
   // Handle button clicks
   button.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       // Pop up the dialog
       chooser.show();
       // Get the user"s selection
       Font font = chooser.getSelectedFont();
       // If not cancelled, set the button font
       if (font != null)
         button.setFont(font);
     }
   });
   // Display the demo
   frame.getContentPane().add(button);
   frame.setSize(200, 100);
   frame.show();
 }

} /*

* Copyright (c) 2000 David Flanagan. All rights reserved. This code is from the
* book Java Examples in a Nutshell, 2nd Edition. It is provided AS-IS, WITHOUT
* ANY WARRANTY either expressed or implied. You may study, use, and modify it
* for any non-commercial purpose. You may distribute it non-commercially as
* long as you retain this notice. For a commercial use license, or to purchase
* the book (recommended), visit http://www.davidflanagan.ru/javaexamples2.
*/

/**

* This class is a Swing component that presents a choice to the user. It allows
* the choice to be presented in a JList, in a JComboBox, or with a bordered
* group of JRadioButton components. Additionally, it displays the name of the
* choice with a JLabel. It allows an arbitrary value to be associated with each
* possible choice. Note that this component only allows one item to be selected
* at a time. Multiple selections are not supported.
*/

class ItemChooser extends JPanel {

 // These fields hold property values for this component
 String name; // The overall name of the choice
 String[] labels; // The text for each choice option
 Object[] values; // Arbitrary values associated with each option
 int selection; // The selected choice
 int presentation; // How the choice is presented
 // These are the legal values for the presentation field
 public static final int LIST = 1;
 public static final int COMBOBOX = 2;
 public static final int RADIOBUTTONS = 3;
 // These components are used for each of the 3 possible presentations
 JList list; // One type of presentation
 JComboBox combobox; // Another type of presentation
 JRadioButton[] radiobuttons; // Yet another type
 // The list of objects that are interested in our state
 ArrayList listeners = new ArrayList();
 // The constructor method sets everything up
 public ItemChooser(String name, String[] labels, Object[] values,
     int defaultSelection, int presentation) {
   // Copy the constructor arguments to instance fields
   this.name = name;
   this.labels = labels;
   this.values = values;
   this.selection = defaultSelection;
   this.presentation = presentation;
   // If no values were supplied, use the labels
   if (values == null)
     this.values = labels;
   // Now create content and event handlers based on presentation type
   switch (presentation) {
   case LIST:
     initList();
     break;
   case COMBOBOX:
     initComboBox();
     break;
   case RADIOBUTTONS:
     initRadioButtons();
     break;
   }
 }
 // Initialization for JList presentation
 void initList() {
   list = new JList(labels); // Create the list
   list.setSelectedIndex(selection); // Set initial state
   // Handle state changes
   list.addListSelectionListener(new ListSelectionListener() {
     public void valueChanged(ListSelectionEvent e) {
       ItemChooser.this.select(list.getSelectedIndex());
     }
   });
   // Lay out list and name label vertically
   this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); // vertical
   this.add(new JLabel(name)); // Display choice name
   this.add(new JScrollPane(list)); // Add the JList
 }
 // Initialization for JComboBox presentation
 void initComboBox() {
   combobox = new JComboBox(labels); // Create the combo box
   combobox.setSelectedIndex(selection); // Set initial state
   // Handle changes to the state
   combobox.addItemListener(new ItemListener() {
     public void itemStateChanged(ItemEvent e) {
       ItemChooser.this.select(combobox.getSelectedIndex());
     }
   });
   // Lay out combo box and name label horizontally
   this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
   this.add(new JLabel(name));
   this.add(combobox);
 }
 // Initialization for JRadioButton presentation
 void initRadioButtons() {
   // Create an array of mutually exclusive radio buttons
   radiobuttons = new JRadioButton[labels.length]; // the array
   ButtonGroup radioButtonGroup = new ButtonGroup(); // used for exclusion
   ChangeListener listener = new ChangeListener() { // A shared listener
     public void stateChanged(ChangeEvent e) {
       JRadioButton b = (JRadioButton) e.getSource();
       if (b.isSelected()) {
         // If we received this event because a button was
         // selected, then loop through the list of buttons to
         // figure out the index of the selected one.
         for (int i = 0; i < radiobuttons.length; i++) {
           if (radiobuttons[i] == b) {
             ItemChooser.this.select(i);
             return;
           }
         }
       }
     }
   };
   // Display the choice name in a border around the buttons
   this.setBorder(new TitledBorder(new EtchedBorder(), name));
   this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
   // Create the buttons, add them to the button group, and specify
   // the event listener for each one.
   for (int i = 0; i < labels.length; i++) {
     radiobuttons[i] = new JRadioButton(labels[i]);
     if (i == selection)
       radiobuttons[i].setSelected(true);
     radiobuttons[i].addChangeListener(listener);
     radioButtonGroup.add(radiobuttons[i]);
     this.add(radiobuttons[i]);
   }
 }
 // These simple property accessor methods just return field values
 // These are read-only properties. The values are set by the constructor
 // and may not be changed.
 public String getName() {
   return name;
 }
 public int getPresentation() {
   return presentation;
 }
 public String[] getLabels() {
   return labels;
 }
 public Object[] getValues() {
   return values;
 }
 /** Return the index of the selected item */
 public int getSelectedIndex() {
   return selection;
 }
 /** Return the object associated with the selected item */
 public Object getSelectedValue() {
   return values[selection];
 }
 /**
  * Set the selected item by specifying its index. Calling this method
  * changes the on-screen display but does not generate events.
  */
 public void setSelectedIndex(int selection) {
   switch (presentation) {
   case LIST:
     list.setSelectedIndex(selection);
     break;
   case COMBOBOX:
     combobox.setSelectedIndex(selection);
     break;
   case RADIOBUTTONS:
     radiobuttons[selection].setSelected(true);
     break;
   }
   this.selection = selection;
 }
 /**
  * This internal method is called when the selection changes. It stores the
  * new selected index, and fires events to any registered listeners. The
  * event listeners registered on the JList, JComboBox, or JRadioButtons all
  * call this method.
  */
 protected void select(int selection) {
   this.selection = selection; // Store the new selected index
   if (!listeners.isEmpty()) { // If there are any listeners registered
     // Create an event object to describe the selection
     ItemChooser.Event e = new ItemChooser.Event(this, selection,
         values[selection]);
     // Loop through the listeners using an Iterator
     for (Iterator i = listeners.iterator(); i.hasNext();) {
       ItemChooser.Listener l = (ItemChooser.Listener) i.next();
       l.itemChosen(e); // Notify each listener of the selection
     }
   }
 }
 // These methods are for event listener registration and deregistration
 public void addItemChooserListener(ItemChooser.Listener l) {
   listeners.add(l);
 }
 public void removeItemChooserListener(ItemChooser.Listener l) {
   listeners.remove(l);
 }
 /**
  * This inner class defines the event type generated by ItemChooser objects
  * The inner class name is Event, so the full name is ItemChooser.Event
  */
 public static class Event extends java.util.EventObject {
   int selectedIndex; // index of the selected item
   Object selectedValue; // the value associated with it
   public Event(ItemChooser source, int selectedIndex, Object selectedValue) {
     super(source);
     this.selectedIndex = selectedIndex;
     this.selectedValue = selectedValue;
   }
   public ItemChooser getItemChooser() {
     return (ItemChooser) getSource();
   }
   public int getSelectedIndex() {
     return selectedIndex;
   }
   public Object getSelectedValue() {
     return selectedValue;
   }
 }
 /**
  * This inner interface must be implemented by any object that wants to be
  * notified when the current selection in a ItemChooser component changes.
  */
 public interface Listener extends java.util.EventListener {
   public void itemChosen(ItemChooser.Event e);
 }
 /**
  * This inner class is a simple demonstration of the ItemChooser component
  * It uses command-line arguments as ItemChooser labels and values.
  */
 public static class Demo {
   public static void main(String[] args) {
     // Create a window, arrange to handle close requests
     final JFrame frame = new JFrame("ItemChooser Demo");
     frame.addWindowListener(new WindowAdapter() {
       public void windowClosing(WindowEvent e) {
         System.exit(0);
       }
     });
     // A "message line" to display results in
     final JLabel msgline = new JLabel(" ");
     // Create a panel holding three ItemChooser components
     JPanel chooserPanel = new JPanel();
     final ItemChooser c1 = new ItemChooser("Choice #1", args, null, 0,
         ItemChooser.LIST);
     final ItemChooser c2 = new ItemChooser("Choice #2", args, null, 0,
         ItemChooser.ruBOBOX);
     final ItemChooser c3 = new ItemChooser("Choice #3", args, null, 0,
         ItemChooser.RADIOBUTTONS);
     // An event listener that displays changes on the message line
     ItemChooser.Listener l = new ItemChooser.Listener() {
       public void itemChosen(ItemChooser.Event e) {
         msgline.setText(e.getItemChooser().getName() + ": "
             + e.getSelectedIndex() + ": "
             + e.getSelectedValue());
       }
     };
     c1.addItemChooserListener(l);
     c2.addItemChooserListener(l);
     c3.addItemChooserListener(l);
     // Instead of tracking every change with a ItemChooser.Listener,
     // applications can also just query the current state when
     // they need it. Here"s a button that does that.
     JButton report = new JButton("Report");
     report.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent e) {
         // Note the use of multi-line italic HTML text
         // with the JOptionPane message dialog box.
         String msg = "<html>" + c1.getName() + ": "
             + c1.getSelectedValue() + "
" + c2.getName() + ": " + c2.getSelectedValue() + "
" + c3.getName() + ": " + c3.getSelectedValue() + "
"; JOptionPane.showMessageDialog(frame, msg); } }); // Add the 3 ItemChooser objects, and the Button to the panel chooserPanel.add(c1); chooserPanel.add(c2); chooserPanel.add(c3); chooserPanel.add(report); // Add the panel and the message line to the window Container contentPane = frame.getContentPane(); contentPane.add(chooserPanel, BorderLayout.CENTER); contentPane.add(msgline, BorderLayout.SOUTH); // Set the window size and pop it up. frame.pack(); frame.show(); } }

}

      </source>