如题

解决方案 »

  1.   

    /*
    Java Swing, 2nd Edition
    By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
    ISBN: 0-596-00408-7
    Publisher: O'Reilly 
    */
    // FontPicker.java
    //A quick test of the FontChooser dialog. (see FontChooser.java)
    //import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Frame;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JColorChooser;
    import javax.swing.JComboBox;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingConstants;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.SimpleAttributeSet;
    import javax.swing.text.StyleConstants;public class FontPicker extends JFrame {  Color c;  public FontPicker() {
        super("JColorChooser Test Frame");
        setSize(200, 100);
        final JButton go = new JButton("Show FontChooser");
        go.addActionListener(new ActionListener() {
          final FontChooser chooser = new FontChooser(FontPicker.this);      boolean first = true;      public void actionPerformed(ActionEvent e) {
            chooser.setVisible(true);
            // If we got a real font choice, then update our go button
            if (chooser.getNewFont() != null) {
              go.setFont(chooser.getNewFont());
              go.setForeground(chooser.getNewColor());
            }
          }
        });
        getContentPane().add(go);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
      }  public static void main(String args[]) {
        FontPicker fp = new FontPicker();
        fp.setVisible(true);
      }
    }//FontChooser.java
    //A font chooser that allows users to pick a font by name, size, style, and
    //color. The color selection is provided by a JColorChooser pane. This
    //dialog builds an AttributeSet suitable for use with JTextPane.
    //class FontChooser extends JDialog implements ActionListener {  JColorChooser colorChooser;  JComboBox fontName;  JCheckBox fontBold, fontItalic;  JTextField fontSize;  JLabel previewLabel;  SimpleAttributeSet attributes;  Font newFont;  Color newColor;  public FontChooser(Frame parent) {
        super(parent, "Font Chooser", true);
        setSize(450, 450);
        attributes = new SimpleAttributeSet();    // Make sure that any way the user cancels the window does the right
        // thing
        addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
            closeAndCancel();
          }
        });    // Start the long process of setting up our interface
        Container c = getContentPane();    JPanel fontPanel = new JPanel();
        fontName = new JComboBox(new String[] { "TimesRoman", "Helvetica",
            "Courier" });
        fontName.setSelectedIndex(1);
        fontName.addActionListener(this);
        fontSize = new JTextField("12", 4);
        fontSize.setHorizontalAlignment(SwingConstants.RIGHT);
        fontSize.addActionListener(this);
        fontBold = new JCheckBox("Bold");
        fontBold.setSelected(true);
        fontBold.addActionListener(this);
        fontItalic = new JCheckBox("Italic");
        fontItalic.addActionListener(this);    fontPanel.add(fontName);
        fontPanel.add(new JLabel(" Size: "));
        fontPanel.add(fontSize);
        fontPanel.add(fontBold);
        fontPanel.add(fontItalic);    c.add(fontPanel, BorderLayout.NORTH);    // Set up the color chooser panel and attach a change listener so that
        // color
        // updates get reflected in our preview label.
        colorChooser = new JColorChooser(Color.black);
        colorChooser.getSelectionModel().addChangeListener(
            new ChangeListener() {
              public void stateChanged(ChangeEvent e) {
                updatePreviewColor();
              }
            });
        c.add(colorChooser, BorderLayout.CENTER);    JPanel previewPanel = new JPanel(new BorderLayout());
        previewLabel = new JLabel("Here's a sample of this font.");
        previewLabel.setForeground(colorChooser.getColor());
        previewPanel.add(previewLabel, BorderLayout.CENTER);    // Add in the Ok and Cancel buttons for our dialog box
        JButton okButton = new JButton("Ok");
        okButton.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent ae) {
            closeAndSave();
          }
        });
        JButton cancelButton = new JButton("Cancel");
        cancelButton.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent ae) {
            closeAndCancel();
          }
        });    JPanel controlPanel = new JPanel();
        controlPanel.add(okButton);
        controlPanel.add(cancelButton);
        previewPanel.add(controlPanel, BorderLayout.SOUTH);    // Give the preview label room to grow.
        previewPanel.setMinimumSize(new Dimension(100, 100));
        previewPanel.setPreferredSize(new Dimension(100, 100));    c.add(previewPanel, BorderLayout.SOUTH);
      }  // Ok, something in the font changed, so figure that out and make a
      // new font for the preview label
      public void actionPerformed(ActionEvent ae) {
        // Check the name of the font
        if (!StyleConstants.getFontFamily(attributes).equals(
            fontName.getSelectedItem())) {
          StyleConstants.setFontFamily(attributes, (String) fontName
              .getSelectedItem());
        }
        // Check the font size (no error checking yet)
        if (StyleConstants.getFontSize(attributes) != Integer.parseInt(fontSize
            .getText())) {
          StyleConstants.setFontSize(attributes, Integer.parseInt(fontSize
              .getText()));
        }
        // Check to see if the font should be bold
        if (StyleConstants.isBold(attributes) != fontBold.isSelected()) {
          StyleConstants.setBold(attributes, fontBold.isSelected());
        }
        // Check to see if the font should be italic
        if (StyleConstants.isItalic(attributes) != fontItalic.isSelected()) {
          StyleConstants.setItalic(attributes, fontItalic.isSelected());
        }
        // and update our preview label
        updatePreviewFont();
      }  // Get the appropriate font from our attributes object and update
      // the preview label
      protected void updatePreviewFont() {
        String name = StyleConstants.getFontFamily(attributes);
        boolean bold = StyleConstants.isBold(attributes);
        boolean ital = StyleConstants.isItalic(attributes);
        int size = StyleConstants.getFontSize(attributes);    //Bold and italic don't work properly in beta 4.
        Font f = new Font(name, (bold ? Font.BOLD : 0)
            + (ital ? Font.ITALIC : 0), size);
        previewLabel.setFont(f);
      }  // Get the appropriate color from our chooser and update previewLabel
      protected void updatePreviewColor() {
        previewLabel.setForeground(colorChooser.getColor());
        // Manually force the label to repaint
        previewLabel.repaint();
      }  public Font getNewFont() {
        return newFont;
      }  public Color getNewColor() {
        return newColor;
      }  public AttributeSet getAttributes() {
        return attributes;
      }  public void closeAndSave() {
        // Save font & color information
        newFont = previewLabel.getFont();
        newColor = previewLabel.getForeground();    // Close the window
        setVisible(false);
      }  public void closeAndCancel() {
        // Erase any font information and then close the window
        newFont = null;
        newColor = null;
        setVisible(false);
      }
    }