Java: FontDemo example

MUST UPDATE TO CURRENT SOURCE!!!!!
This program displays the available fonts and how they look in different sizes and styles.
/**
  * FontDemo.java -- Demo of some Font class options.
  * @version 21 July 1998, July 1999, 2000-05-10, 2000-12-05, 2002-02-12 Java 2
  * @author Fred Swartz
  */
  
//Improvements: setter method for style, constructor for initial values, 
//              antialising checkbox, font list (not combobox) in west,
//              maybe make it a text area with sample text that can be 
//              changed, but also put prototype text in field.
// Bug: starts with "null" as the font name.
  
// Many classes are explicitly imported just to see what was being used.
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Container;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JSlider;
import javax.swing.JComboBox;
import javax.swing.Box;
import java.awt.event.*;
import javax.swing.event.*;
import java.util.Vector;


///////////////////////////////////////////////////////////// FontDemo
class FontDemo extends JFrame {
    JTextField sizefield;  // shows the font size
    JSlider    sizeSlider; // sets the font size
    JComboBox  fontCombo;  // for selecting one of the installed fonts.
    JComboBox  styleCombo; // for selecting style (plain, bold, ...)

    int currentSize  = 24;
    int currentStyle = Font.PLAIN;
    String currentStyleString = "Font.PLAIN";
    String initialFontName    = "Monospaced";

    GraphicsPanel gp;  // Where the sample text is written
    static final String[] fontStyleString = new String[] 
        {"Font.PLAIN", "Font.ITALIC", "Font.BOLD", "Font.ITALIC+Font.BOLD"};
    static final    int[] fontStyleInt    = new    int[] 
        { Font.PLAIN ,  Font.ITALIC ,  Font.BOLD ,  Font.ITALIC+Font.BOLD };


    //============================================== constructor
    public FontDemo() {
        int row = 0, col = 0;

        // --- Create a GraphicsPanel
        gp = new GraphicsPanel();

        // --- Get all font families
        String[] fontNames = GraphicsEnvironment
                             .getLocalGraphicsEnvironment()
                             .getAvailableFontFamilyNames();

        // --- Make vector of all fonts that can display basic chars
        Vector visFonts = new Vector(fontNames.length);
        for (int i=0; i<fontNames.length; i++) {
            Font f = new Font(fontNames[i], Font.PLAIN, 12);
            if (f.canDisplay('a')) {
                // Display only fonts that have the alphabetic characters.
                // On my machine there are almost 20 fonts (eg, Wingdings)
                // that don't display text.
                visFonts.add(fontNames[i]);
            } else {
                //System.out.println("No alphabetics in " + fontNames[i]);
            }
        }

        fontCombo = new JComboBox(visFonts);         // JComboBox of fonts
        fontCombo.setSelectedItem(initialFontName);  // select the default font
        fontCombo.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    gp.setFontName((String)fontCombo.getSelectedItem());
                }
            });

        // --- Style: create a Choice drop-down menu ---------------
        styleCombo = new JComboBox(fontStyleString);
        styleCombo.setSelectedItem(currentStyleString);
        styleCombo.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    currentStyle = fontStyleInt[styleCombo.getSelectedIndex()];
                    gp.repaint();  // we changed something -  redraw
                }
            });


        // --- Size: JSlider and JTextField ---------------
        // create and add a textfield to display the size
        sizefield = new JTextField(""+currentSize,3);
        sizefield.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    try {
                        currentSize = Integer.parseInt(sizefield.getText());
                        sizeSlider.setValue(currentSize);  // set the slider
                    }
                    catch (NumberFormatException ne) {
                        sizefield.setText("XX");
                        currentSize = 12;
                    }
                    gp.repaint();
                }
            });

        // create a slider for setting the size value
        sizeSlider = new JSlider(JSlider.HORIZONTAL, 5, 60, currentSize);
        sizeSlider.setMajorTickSpacing(10); // sets numbers for big tick marks
        sizeSlider.setMinorTickSpacing(1);  // smaller tick marks
        sizeSlider.setPaintTicks(true);     // display the ticks
        sizeSlider.setPaintLabels(true);    // show the numbers
        sizeSlider.addChangeListener(new ChangeListener() {
                 public void stateChanged(ChangeEvent e) {
                     int size = sizeSlider.getValue();  // get slider value
                     sizefield.setText("" + size);
                     gp.setFontSize(size);
                 }
             });


        //--- Layout components
        Container content = this.getContentPane();
        content.setBackground(new Color(0x00CCFF));
        content.setLayout(new BorderLayout());

        Box fontControlBox = Box.createHorizontalBox();
        fontControlBox.add(fontCombo);
        fontControlBox.add(Box.createHorizontalGlue());

        Box styleControlBox = Box.createHorizontalBox();
        styleControlBox.add(styleCombo);
        styleControlBox.add(Box.createHorizontalGlue());

        Box sizeControlBox = Box.createHorizontalBox();
        sizeControlBox.add(sizefield);
        sizeControlBox.add(Box.createHorizontalStrut(5));
        sizeControlBox.add(sizeSlider);
        sizeControlBox.add(Box.createHorizontalGlue());

        JPanel controls = new JPanel(new GridLayout(3, 2, 4, 4));
        controls.add(new JLabel("Font family name" , JLabel.RIGHT));
        controls.add(fontControlBox);
        controls.add(new JLabel("Style", JLabel.RIGHT));
        controls.add(styleControlBox);
        controls.add(new JLabel("Size" , JLabel.RIGHT));
        controls.add(sizeControlBox);

        content.add(gp, BorderLayout.CENTER);  // put in center to stretch.
        content.add(controls, BorderLayout.SOUTH);

        this.setTitle("Font Demo");
        this.pack();
    }//end constructor


    //////////////////////////////////////////////////////// GraphicsPanel class
    // A component to draw sample string with given font family, style, and size.
    class GraphicsPanel extends JPanel {
        private String currentFontName;
        private int    currentFontSize;

        //========================================================== constructor
        public GraphicsPanel() {
            this.setPreferredSize(new Dimension(600, 100));
            this.setBackground(Color.white);
            this.setForeground(Color.black);
        }//end constructor

        //======================================================= paintComponent
        public void paintComponent(Graphics g) {
            super.paintComponent(g);  // paint background
            String text = "Font(\""
                          + currentFontName + "\", "
                          + currentStyleString + ", "
                          + currentSize + ");";
            Font f = new Font(currentFontName, currentStyle, currentSize);
            g.setFont(f);

            // Find the size of this text so we can center it
            FontMetrics fm   = g.getFontMetrics(f);  // metrics for this object
            Rectangle2D rect = fm.getStringBounds(text, g); // size of string

            int textHeight = (int)(rect.getHeight());
            int textWidth  = (int)(rect.getWidth());
            int panelHeight= this.getHeight();
            int panelWidth = this.getWidth();

            // Center text horizontally and vertically
            int x = (panelWidth  - textWidth)  / 2;
            int y = (panelHeight - textHeight) / 2  + fm.getAscent();

            g.drawString(text, x, y);
        }//end paintComponent
        
        //======================================================== setFontName
        public void setFontName(String fn) {
            currentFontName = fn;
            this.repaint();
        }
        
        //======================================================== setFontSize
        public void setFontSize(int size) {
            currentSize = size;
            this.repaint();
        }
    }//endclass GraphicsPanel


    //===================================================================== main
    public static void main(String[] args) {
        JFrame myWindow = new FontDemo();
        myWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myWindow.setVisible(true); // Make the window visible.
    }//endmethod main

}//endclass FontDemo