Package charva.awt

Source Code of charva.awt.Tutorial

/* class Tutorial
*
* R Pitman, 2003
* Last updated: 20 June, 2003.
*
* This class performs a general test of the functionality of the
* CHARVA library.
*/

package charva.awt;

import charva.awt.event.ActionEvent;
import charva.awt.event.ActionListener;
import charva.awt.event.FocusEvent;
import charva.awt.event.FocusListener;
import charva.awt.event.ItemEvent;
import charva.awt.event.ItemListener;
import charva.awt.event.KeyEvent;
import charva.awt.event.KeyListener;
import charva.awt.util.CapsTextField;
import charvax.swing.BoxLayout;
import charvax.swing.ButtonGroup;
import charvax.swing.DefaultListModel;
import charvax.swing.JButton;
import charvax.swing.JCheckBox;
import charvax.swing.JComboBox;
import charvax.swing.JDialog;
import charvax.swing.JFileChooser;
import charvax.swing.JFrame;
import charvax.swing.JLabel;
import charvax.swing.JList;
import charvax.swing.JMenu;
import charvax.swing.JMenuBar;
import charvax.swing.JMenuItem;
import charvax.swing.JOptionPane;
import charvax.swing.JPanel;
import charvax.swing.JPasswordField;
import charvax.swing.JProgressBar;
import charvax.swing.JRadioButton;
import charvax.swing.JScrollPane;
import charvax.swing.JTabbedPane;
import charvax.swing.JTable;
import charvax.swing.JTextArea;
import charvax.swing.JTextField;
import charvax.swing.ListSelectionModel;
import charvax.swing.SwingUtilities;
import charvax.swing.border.EmptyBorder;
import charvax.swing.border.LineBorder;
import charvax.swing.border.TitledBorder;
import charvax.swing.event.ListDataEvent;
import charvax.swing.event.ListDataListener;
import charvax.swing.event.ListSelectionEvent;
import charvax.swing.event.ListSelectionListener;

public class Tutorial extends JFrame implements ActionListener {

    //private JTextField tf;

    public Tutorial() {
        super("Charva Demo - copyright R Pitman, 2003");
        setForeground(Color.green);
        setBackground(Color.black);
        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());

        JMenuBar menubar = new JMenuBar();
        JMenu jMenuFile = new JMenu("File");
        jMenuFile.setMnemonic('F');

        JMenuItem jMenuItemFileChooser = new JMenuItem("JFileChooser", 'F');
        jMenuItemFileChooser.addActionListener(this);
        jMenuFile.add(jMenuItemFileChooser);

        JMenuItem jMenuItemCustomFileChooser = new JMenuItem(
                "custom FileChooser", 'c');
        jMenuItemCustomFileChooser.addActionListener(this);
        jMenuFile.add(jMenuItemCustomFileChooser);

        jMenuFile.addSeparator();

        JMenuItem jMenuItemFileExit = new JMenuItem("Exit", 'x');
        jMenuItemFileExit.addActionListener(this);
        jMenuFile.add(jMenuItemFileExit);

        JMenu jMenuLayout = new JMenu("Layouts");
        jMenuLayout.setMnemonic('L');
        JMenuItem jMenuItemLayoutNull = new JMenuItem("Null Layout");
        jMenuItemLayoutNull.setMnemonic('N');
        jMenuItemLayoutNull.addActionListener(this);
        jMenuLayout.add(jMenuItemLayoutNull);

        jMenuLayout.addSeparator();

        JMenuItem jMenuItemLayoutMisc = new JMenuItem("Miscellaneous Layouts");
        jMenuItemLayoutMisc.setMnemonic('M');
        jMenuItemLayoutMisc.addActionListener(this);
        jMenuLayout.add(jMenuItemLayoutMisc);

        JMenuItem jMenuItemLayoutColor = new JMenuItem("Layouts in Color");
        jMenuItemLayoutColor.setMnemonic('C');
        jMenuItemLayoutColor.addActionListener(this);
        jMenuLayout.add(jMenuItemLayoutColor);

        JMenuItem jMenuItemLayoutGBL = new JMenuItem("GridBagLayout");
        jMenuItemLayoutGBL.setMnemonic('G');
        jMenuItemLayoutGBL.addActionListener(this);
        jMenuLayout.add(jMenuItemLayoutGBL);

        JMenu jMenuContainers = new JMenu("Containers");
        jMenuContainers.setMnemonic('C');

        JMenuItem jMenuItemContainerJTabbedPane = new JMenuItem("JTabbedPane");
        jMenuItemContainerJTabbedPane.setMnemonic('T');
        jMenuItemContainerJTabbedPane.addActionListener(this);
        jMenuContainers.add(jMenuItemContainerJTabbedPane);

        JMenu jMenuItemContainerJOptionPane = new JMenu("JOptionPane...");
        jMenuItemContainerJOptionPane.setMnemonic('O');
        jMenuContainers.add(jMenuItemContainerJOptionPane);

        JMenuItem jMenuItemShowMessageDialog = new JMenuItem(
                "showMessageDialog");
        jMenuItemShowMessageDialog.addActionListener(this);
        jMenuItemContainerJOptionPane.add(jMenuItemShowMessageDialog);

        JMenuItem jMenuItemShowConfirmDialog = new JMenuItem(
                "showConfirmDialog");
        jMenuItemShowConfirmDialog.addActionListener(this);
        jMenuItemContainerJOptionPane.add(jMenuItemShowConfirmDialog);

        JMenuItem jMenuItemShowInputDialog = new JMenuItem("showInputDialog");
        jMenuItemShowInputDialog.addActionListener(this);
        jMenuItemContainerJOptionPane.add(jMenuItemShowInputDialog);

        JMenuItem jMenuItemShowCustomInputDialog = new JMenuItem(
                "show Custom InputDialog");
        jMenuItemShowCustomInputDialog.addActionListener(this);
        jMenuItemContainerJOptionPane.add(jMenuItemShowCustomInputDialog);

        JMenu jMenuWidgets = new JMenu("Widgets");
        jMenuWidgets.setMnemonic('W');

        JMenuItem jMenuItemWidgetText = new JMenuItem("Text components");
        jMenuItemWidgetText.setMnemonic('T');
        jMenuItemWidgetText.addActionListener(this);
        jMenuWidgets.add(jMenuItemWidgetText);

        JMenuItem jMenuItemWidgetSelection = new JMenuItem(
                "Selection components");
        jMenuItemWidgetSelection.setMnemonic('S');
        jMenuItemWidgetSelection.addActionListener(this);
        jMenuWidgets.add(jMenuItemWidgetSelection);

        JMenuItem jMenuItemWidgetButtons = new JMenuItem("Buttons");
        jMenuItemWidgetButtons.setMnemonic('B');
        jMenuItemWidgetButtons.addActionListener(this);
        jMenuWidgets.add(jMenuItemWidgetButtons);

        JMenuItem jMenuItemWidgetJTable = new JMenuItem("JTable");
        jMenuItemWidgetJTable.setMnemonic('J');
        jMenuItemWidgetJTable.addActionListener(this);
        jMenuWidgets.add(jMenuItemWidgetJTable);

        JMenu jMenuEvents = new JMenu("Events");
        jMenuEvents.setMnemonic('E');

        JMenuItem jMenuItemKeyEvents = new JMenuItem("KeyEvents");
        jMenuItemKeyEvents.setMnemonic('K');
        jMenuItemKeyEvents.addActionListener(this);
        jMenuEvents.add(jMenuItemKeyEvents);

        JMenuItem jMenuItemFocusEvents = new JMenuItem("FocusEvents");
        jMenuItemFocusEvents.setMnemonic('F');
        jMenuItemFocusEvents.addActionListener(this);
        jMenuEvents.add(jMenuItemFocusEvents);

        JMenu jMenuThreads = new JMenu("Threads");
        jMenuThreads.setMnemonic('T');

        JMenuItem jMenuItemProgressBar = new JMenuItem("JProgressBar");
        jMenuItemProgressBar.setMnemonic('P');
        jMenuItemProgressBar.addActionListener(this);
        jMenuThreads.add(jMenuItemProgressBar);

        menubar.add(jMenuFile);
        menubar.add(jMenuLayout);
        menubar.add(jMenuContainers);
        menubar.add(jMenuWidgets);
        menubar.add(jMenuEvents);
        menubar.add(jMenuThreads);

        setJMenuBar(menubar);

        JPanel labelPanel = new JPanel();
        labelPanel.setLayout(new BoxLayout(labelPanel, BoxLayout.Y_AXIS));
        labelPanel.add(new JLabel(
                "Use LEFT and RIGHT cursor keys to select a menu."));
        labelPanel.add(new JLabel("Use ENTER to invoke a menu or menu-item."));
        labelPanel.add(new JLabel("(You can also use the "
                + "underlined \"mnemonic key\" to invoke a menu.)"));
        labelPanel.add(new JLabel("Use BACKSPACE or ESC to dismiss a menu."));
        contentPane.add(labelPanel, BorderLayout.SOUTH);

        setLocation(0, 0);
        Toolkit tk = Toolkit.getDefaultToolkit();
        setSize(tk.getScreenColumns(), tk.getScreenRows());
        validate();
    }

    public static void main(String[] args) throws Exception {
        Tutorial testwin = new Tutorial();

        /*So we have explicit control over the Toolkit instance.*/
        Toolkit.getDefaultToolkit().register();
        testwin.show();
        Toolkit.getDefaultToolkit().waitTillFinished();
    }

    public void actionPerformed(ActionEvent ae_) {
        String actionCommand = ae_.getActionCommand();
        if (actionCommand.equals("Exit")) {
            hide();
            Toolkit.getDefaultToolkit().close();
            System.err.println( "-->"+getClass().getName()+" closed.  Press ctrl-c if necessary to return to the prompt." );
            //System.gc(); // so that HPROF reports only live objects.
            //System.exit(0);
        } else if (actionCommand.equals("JFileChooser")) {
            testFileChooser();
        } else if (actionCommand.equals("custom FileChooser")) {
            //      JFileChooser.CANCEL_LABEL = "Cancel (F4)";
            //      JFileChooser.CANCEL_ACCELERATOR = KeyEvent.VK_F4;
            //      (new JFileChooser()).show();
            JOptionPane.showMessageDialog(this,
                    "This test has been (temporarily) disabled", "Information",
                    JOptionPane.PLAIN_MESSAGE);
        } else if (actionCommand.equals("Null Layout")) {
            JDialog dlg = new NullLayoutTest(this);
            dlg.show();
        } else if (actionCommand.equals("Miscellaneous Layouts")) {
            JDialog dlg = new LayoutTest(this);
            dlg.show();
        } else if (actionCommand.equals("Layouts in Color")) {
            if (!Toolkit.getDefaultToolkit().hasColors()) {
                JOptionPane.showMessageDialog(this,
                        "This terminal does not have color capability!",
                        "Error", JOptionPane.PLAIN_MESSAGE);
                return;
            }
            JDialog dlg = new ColorLayoutTest(this);
            dlg.setLocationRelativeTo(this);
            dlg.show();
        } else if (actionCommand.equals("GridBagLayout")) {
            JDialog dlg = new GridBagLayoutTest(this);
            dlg.setLocationRelativeTo(this);
            dlg.show();
        } else if (actionCommand.equals("JTabbedPane")) {
            JDialog dlg = new JTabbedPaneTest(this);
            dlg.show();
        } else if (actionCommand.equals("showMessageDialog")) {
            JOptionPane.showMessageDialog(this,
                    "This is an example of a Message Dialog "
                            + "with a single message string",
                    "This is the title", JOptionPane.PLAIN_MESSAGE);
        } else if (actionCommand.equals("showConfirmDialog")) {
            showConfirmDialog();
        } else if (actionCommand.equals("showInputDialog")) {
            showInputDialog();
        } else if (actionCommand.equals("show Custom InputDialog")) {
            showCustomInputDialog(this);
        } else if (actionCommand.equals("Text components")) {
            TextWidgetTest dlg = new TextWidgetTest(this);
            dlg.show();
        } else if (actionCommand.equals("Selection components")) {
            SelectionTest dlg = new SelectionTest(this);
            dlg.show();
        } else if (actionCommand.equals("Buttons")) {
            (new ButtonTest(this)).show();
        } else if (actionCommand.equals("JTable")) {
            JTableTest dlg = new JTableTest(this);
            dlg.setLocationRelativeTo(this);
            dlg.show();
        } else if (actionCommand.equals("KeyEvents")) {
            KeyEventTest dlg = new KeyEventTest(this);
            dlg.setLocationRelativeTo(this);
            dlg.show();
        } else if (actionCommand.equals("FocusEvents")) {
            FocusEventTest dlg = new FocusEventTest(this);
            dlg.setLocationRelativeTo(this);
            dlg.show();
        } else if (actionCommand.equals("JProgressBar")) {
            ProgressBarTest dlg = new ProgressBarTest(this);
            dlg.setLocationRelativeTo(this);
            dlg.show();
        } else {
            JOptionPane.showMessageDialog(this, "Menu item \"" + actionCommand
                    + "\" not implemented yet", "Error",
                    JOptionPane.PLAIN_MESSAGE);
        }
        // Trigger garbage-collection after every menu action.
        Toolkit.getDefaultToolkit().triggerGarbageCollection(this);
    }

    /**
     * Demonstrate the JFileChooser.
     */
    private void testFileChooser() {
        JFileChooser chooser = new JFileChooser();
        chooser.setDialogTitle("A File Chooser");
        chooser.setForeground(Color.white);
        chooser.setBackground(Color.blue);
        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

        //  Uncomment this section of code to apply a FileFilter that masks out
        // all
        //  files whose names do not end with ".java".
        //  /* Construct an anonymous inner class that extends the abstract
        //   * FileFilter class.
        //   */
        //  charvax.swing.filechooser.FileFilter filter =
        //    new charvax.swing.filechooser.FileFilter() {
        //      public boolean accept(File file_) {
        //    String pathname = file_.getAbsolutePath();
        //    return (pathname.endsWith(".java"));
        //      }
        //  };
        //  chooser.setFileFilter(filter);

        if (chooser.showDialog(this, "Open File") == JFileChooser.APPROVE_OPTION) {

            String msgs[] = { "The selected file was:",
                    chooser.getSelectedFile().getAbsolutePath()};
            JOptionPane.showMessageDialog(this, msgs,
                    "Results of JFileChooser", JOptionPane.PLAIN_MESSAGE);
        } else {
            JOptionPane.showMessageDialog(this,
                    "The CANCEL button was selected",
                    "Results of JFileChooser", JOptionPane.PLAIN_MESSAGE);
        }
    }

    /**
     * Demonstrate the JOptionPane.showConfirmDialog() method.
     */
    private void showConfirmDialog() {
        String[] messages = { "This is an example of a Confirm Dialog",
                "that displays an array of Strings"};

        int option = JOptionPane.showConfirmDialog(this, messages,
                "Select an Option", JOptionPane.YES_NO_CANCEL_OPTION);
        String result = "";
        if (option == JOptionPane.YES_OPTION)
            result = "User selected YES option";
        else if (option == JOptionPane.NO_OPTION)
            result = "User selected NO option";
        else
            result = "User selected Cancel option";
        JOptionPane.showMessageDialog(this, result,
                "Result of showConfirmDialog", JOptionPane.PLAIN_MESSAGE);
    }

    /**
     * Demonstrate the JOptionPane.showInputDialog() method.
     */
    private void showInputDialog() {
        String[] messages = { "This is an example of an Input Dialog",
                "that displays an array of Strings"};
        String result = JOptionPane.showInputDialog(this, messages,
                "Input a value", JOptionPane.QUESTION_MESSAGE);
        String msg = null;
        if (result == null)
            msg = "User selected Cancel option";
        else
            msg = "User entered \"" + result + "\"";
        JOptionPane.showMessageDialog(this, msg, "Result of showInputDialog",
                JOptionPane.PLAIN_MESSAGE);
    }

    /**
     * Demonstrate how to customize the JOptionPane.
     */
    private void showCustomInputDialog(Component parent_) {

        String[] results = { "", ""};
        String selected_option = null;

        String[] message = { "This shows how to create and use",
                "a JOptionPane directly, without using",
                "the convenience methods"};
        JOptionPane pane = new JOptionPane(message);

        // Make the dialog display a JTextField for user input.
        pane.setWantsInput(true);

        // Set the initial input value displayed to the user.
        pane.setInitialSelectionValue("default input value");

        // Provide customized button labels.
        String[] options = { "Option 1", "Option 2", "Option 3", "Option 4"};
        pane.setOptions(options);

        // Make "Option 2" the default button.
        pane.setInitialValue("Option 2");

        JDialog dialog = pane.createDialog(parent_, "Custom JOptionPane");
        dialog.show();
        Object selectedValue = pane.getValue();
        System.err.println("Selected value is " + selectedValue);
        results[ 0] = "The input value is \"" + (String) pane.getInputValue()
                + "\"";

        // If there is NOT an array of option buttons:
        // (In this case, there is).
        if (pane.getOptions() == null) {
            int option = ((Integer) selectedValue).intValue();
            switch (option) {
            case JOptionPane.YES_OPTION:
                selected_option = "YES";
                break;
            case JOptionPane.OK_OPTION:
                selected_option = "OK";
                break;
            case JOptionPane.NO_OPTION:
                selected_option = "NO";
                break;
            case JOptionPane.CANCEL_OPTION:
                selected_option = "CANCEL";
                break;
            }
        } else {
            // If there IS an array of option buttons:
            for (int i = 0; i < options.length; i++) {
                if (options[ i].equals(selectedValue)) {
                    selected_option = options[ i];
                    break;
                }
            } // end for
        }
        results[ 1] = "The selected option is \"" + selected_option + "\"";

        /*
         * Change the (static) labels and accelerators in the JOptionPane. Note
         * that the buttons stay customized for future invocations of the
         * JOptionPane methods, until they are customized again.
         * JOptionPane.OK_ACCELERATOR = KeyEvent.VK_F5;
         * JOptionPane.YES_ACCELERATOR = KeyEvent.VK_F6;
         * JOptionPane.NO_ACCELERATOR = KeyEvent.VK_F7;
         * JOptionPane.CANCEL_ACCELERATOR = KeyEvent.VK_F8;
         */

        JOptionPane.showMessageDialog(this, results,
                "Result of Customized JOptionPane", JOptionPane.PLAIN_MESSAGE);
    }

}

/**
* This class demonstrates how to lay out components manually, by setting the
* LayoutManager to "null". In Charva, you can set a component's position
* within its container with "setLocation()"; but in Swing, you have to use
* "setBounds()". Also, of course, in Charva the units are rows and columns
* whereas in Swing they are pixels.
*/

class NullLayoutTest extends JDialog implements ActionListener {

    public NullLayoutTest(Frame owner_) {
        super(owner_, "Null Layout Test");
        setLocation(3, 3);
        setSize(60, 20);
        Container contentPane = getContentPane();
        contentPane.setLayout(null);

        JLabel label0 = new JLabel(
                "Demonstrates how to lay components out manually");
        contentPane.add(label0);
        label0.setLocation(2, 2);

        JPanel panel1 = new JPanel();
        panel1.setLayout(null);
        contentPane.add(panel1);
        panel1.setLocation(2, 3);
        panel1.setSize(40, 6);
        panel1.setBorder(new TitledBorder("Panel1"));

        JLabel label1 = new JLabel("Label 1:");
        panel1.add(label1);
        label1.setLocation(1, 2);

        JTextField textfield1 = new JTextField("Text Field 1");
        panel1.add(textfield1);
        textfield1.setLocation(11, 2);

        JPanel panel2 = new JPanel();
        panel2.setLayout(null);
        contentPane.add(panel2);
        panel2.setLocation(2, 10);
        panel2.setSize(40, 6);
        panel2.setBorder(new TitledBorder("Panel2"));

        JLabel label2 = new JLabel("Label 2:");
        panel2.add(label2);
        label2.setLocation(1, 2);

        JTextField textfield2 = new JTextField("Text Field 2");
        panel2.add(textfield2);
        textfield2.setLocation(11, 2);

        JButton okButton = new JButton("OK");
        okButton.addActionListener(this);
        contentPane.add(okButton);
        okButton.setLocation(25, 17);
        okButton.setMnemonic(0x18); // CTRL-X
    }

    public void actionPerformed(ActionEvent ae_) {
        if (ae_.getActionCommand().equals("OK")) {
            hide();
        }
    }
}

/**
* This class demonstrates how to use the BorderLayout (which is the default
* layout for JFrame and JDialog), the BoxLayout and the FlowLayout (which is
* the default layout for JPanel).
*/

class LayoutTest extends JDialog implements ActionListener {

    public LayoutTest(Frame owner_) {
        super(owner_, "Miscellaneous Layout Test");
        setLocation(3, 3);
        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout()); // default layout for
                                                   // JDialog

        JPanel toppan = new JPanel();
        toppan.setBorder(new TitledBorder("North Panel"));
        toppan.add(new JLabel("north panel uses FlowLayout"));
        contentPane.add(toppan, BorderLayout.NORTH);

        JPanel westpan = new JPanel();
        westpan.setBorder(new TitledBorder("West Panel"));
        westpan.setLayout(new BoxLayout(westpan, BoxLayout.Y_AXIS));
        westpan.add(new JLabel("west panel uses BoxLayout"));
        westpan.add(new JTextField("JTextField #1."));
        westpan.add(new JTextField("JTextField #2."));
        westpan.add(new JTextField("JTextField #3."));
        westpan.add(new JTextField("JTextField #4."));
        westpan.add(new JTextField("JTextField #5."));
        contentPane.add(westpan, BorderLayout.WEST);

        JPanel eastpan = new JPanel();
        eastpan.setBorder(new TitledBorder("East Panel"));
        eastpan.add(new JTextField("A JTextField"));
        contentPane.add(eastpan, BorderLayout.EAST);

        JPanel centerpan = new JPanel();
        centerpan.setLayout(new BorderLayout());
        centerpan.setBorder(new TitledBorder("Center Panel"));
        centerpan.add(new JLabel("A label in the center"), BorderLayout.CENTER);
        contentPane.add(centerpan, BorderLayout.CENTER);

        JPanel southpan = new JPanel();
        southpan.setBorder(new TitledBorder("South Panel"));
        southpan.add(new JLabel("A label in the south: "));
        JButton okButton = new JButton("OK");
        okButton.addActionListener(this);
        southpan.add(okButton);
        contentPane.add(southpan, BorderLayout.SOUTH);
        okButton.setMnemonic(KeyEvent.VK_F10);
        pack();
    }

    public void actionPerformed(ActionEvent ae_) {
        if (ae_.getActionCommand().equals("OK")) {
            hide();
        }
    }
}

/**
* This class is based on the MiscellaneousLayoutTest but it demonstrates how
* to set the foreground and background colors of dialogs and components.
*/

class ColorLayoutTest extends JDialog implements ActionListener {

    public ColorLayoutTest(Frame owner_) {
        super(owner_,
                "Layout Test in Color (yellow foreground, green background)");
        setLocation(3, 3);
        setForeground(Color.yellow);
        setBackground(Color.green);
        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout()); // default layout for
                                                   // JDialog

        JPanel toppan = new JPanel();
        toppan.setBorder(new TitledBorder(
                "North Panel (inherits green background)"));
        toppan.setForeground(Color.blue);
        contentPane.add(toppan, BorderLayout.NORTH);

        JRadioButton button1 = new JRadioButton("A JRadioButton...  ");
        JRadioButton button2 = new JRadioButton("And another JRadioButton");
        ButtonGroup buttons = new ButtonGroup();
        buttons.add(button1);
        buttons.add(button2);
        button1.setSelected(true);
        toppan.add(button1);
        toppan.add(button2);

        JPanel westpan = new JPanel();
        westpan.setBorder(new TitledBorder("West Panel"));
        westpan.setLayout(new BoxLayout(westpan, BoxLayout.Y_AXIS));
        JLabel label1 = new JLabel("Magenta label in west panel");
        westpan.add(label1);
        label1.setForeground(Color.magenta);
        JTextField textfield1 = new JTextField(
                "Cyan JTextField, red background");
        textfield1.setForeground(Color.cyan);
        textfield1.setBackground(Color.red);
        westpan.add(textfield1);

        JTextField whiteTextField = new JTextField("White JTextField");
        whiteTextField.setForeground(Color.white);
        westpan.add(whiteTextField);
        JTextField blueTextField = new JTextField("Blue JTextField");
        blueTextField.setForeground(Color.blue);
        westpan.add(blueTextField);
        JTextField yellowTextField = new JTextField("Yellow JTextField");
        yellowTextField.setForeground(Color.yellow);
        westpan.add(yellowTextField);
        JTextField blackTextField = new JTextField("Black JTextField");
        blackTextField.setForeground(Color.black);
        westpan.add(blackTextField);
        contentPane.add(westpan, BorderLayout.WEST);

        JPanel eastpan = new JPanel();
        eastpan.setForeground(Color.black);
        eastpan.setBorder(new TitledBorder("East Panel"));
        eastpan.add(new JTextField("A JTextField"));
        contentPane.add(eastpan, BorderLayout.EAST);

        JPanel centerpan = new JPanel();
        centerpan.setForeground(Color.white);
        centerpan.setBackground(Color.black);
        centerpan.setLayout(new BorderLayout());
        LineBorder centerpan_lineborder = new LineBorder(Color.green);
        TitledBorder centerpan_titledborder = new TitledBorder(
                centerpan_lineborder, "Green border, yellow title", 0, 0, null,
                Color.yellow);
        centerpan.setBorder(centerpan_titledborder);
        centerpan.add(new JLabel("A white label in the center"),
                BorderLayout.CENTER);
        contentPane.add(centerpan, BorderLayout.CENTER);

        JPanel southpan = new JPanel();
        southpan.setBorder(new TitledBorder("South Panel (white foreground)"));
        southpan.setBackground(Color.blue);
        southpan.setForeground(Color.white);
        JLabel labelsouth = new JLabel("A green label in the south panel ");
        labelsouth.setForeground(Color.green);
        southpan.add(labelsouth);
        JButton okButton = new JButton("OK");
        okButton.addActionListener(this);
        southpan.add(okButton);
        contentPane.add(southpan, BorderLayout.SOUTH);
        okButton.setMnemonic(KeyEvent.VK_F10);
        pack();
    }

    public void actionPerformed(ActionEvent ae_) {
        if (ae_.getActionCommand().equals("OK")) {
            hide();
        }
    }
}

/**
* This class demonstrates how to use the GridBagLayout.
*/

class GridBagLayoutTest extends JDialog implements ActionListener,
        ListSelectionListener {

    private JTextField lastnameField = new JTextField(25);

    private JTextField initialsField = new JTextField(5);

    private JTextField address1Field = new JTextField(20);

    private JTextField address2Field = new JTextField(20);

    private JTextField cityField = new JTextField(20);

    private JTextField postcodeField = new JTextField(8);

    private JTextField stateField = new JTextField(15);

    public GridBagLayoutTest(Frame owner_) {
        super(owner_, "GridBagLayout Test");
        Container contentPane = getContentPane();

        JPanel centerpan = new JPanel();
        centerpan.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridx = gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.EAST;
        centerpan.add(new JLabel("Last name: "), gbc);

        gbc.gridy = 1;
        centerpan.add(new JLabel("Address line 1: "), gbc);

        gbc.gridy = 2;
        centerpan.add(new JLabel("Address line 2: "), gbc);

        gbc.gridy = 3;
        centerpan.add(new JLabel("City: "), gbc);

        gbc.gridy = 4;
        centerpan.add(new JLabel("Postal code: "), gbc);

        gbc.gridy = 5;
        centerpan.add(new JLabel("State: "), gbc);

        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.WEST;
        centerpan.add(lastnameField, gbc);

        gbc.gridx = 2;
        gbc.anchor = GridBagConstraints.EAST;
        centerpan.add(new JLabel(" Initials: "), gbc);

        gbc.gridx = 3;
        gbc.anchor = GridBagConstraints.WEST;
        centerpan.add(initialsField, gbc);

        gbc.gridx = 1;
        gbc.gridy = 1;
        centerpan.add(address1Field, gbc);

        gbc.gridy = 2;
        centerpan.add(address2Field, gbc);

        gbc.gridy = 3;
        centerpan.add(cityField, gbc);

        gbc.gridy = 4;
        centerpan.add(postcodeField, gbc);

        gbc.gridy = 5;
        centerpan.add(stateField, gbc);

        gbc.gridx = 2;
        gbc.gridy = 1;
        gbc.gridwidth = 2;
        gbc.gridheight = 6;
        gbc.insets = new Insets(1, 1, 1, 1);
        String[] countries = { "Portugal", "Spain", "France", "Italy",
                "Germany", "Poland", "Austria", "Belgium", "Denmark", "Norway",
                "Sweden"};
        _countryList = new JList(countries);
        _countryList.setVisibleRowCount(6);
        _countryList.setColumns(12);
        _countryList.addListSelectionListener(this);
        JScrollPane scrollpane = new JScrollPane(_countryList);
        TitledBorder viewportBorder = new TitledBorder("Countries");
        scrollpane.setViewportBorder(viewportBorder);
        centerpan.add(scrollpane, gbc);

        JPanel southpan = new JPanel();
        JButton okButton = new JButton("OK");
        okButton.addActionListener(this);
        southpan.add(okButton);

        contentPane.add(centerpan, BorderLayout.CENTER);
        contentPane.add(southpan, BorderLayout.SOUTH);
        pack();
    }

    public void actionPerformed(ActionEvent ae_) {
        if (ae_.getActionCommand().equals("OK")) {
            hide();
        }
    }

    /**
     * This method implements the ListSelectionListener interface, and is
     * called when an item is selected or deselected in the JList.
     */
    public void valueChanged(ListSelectionEvent e_) {
        _countryList.repaint();
    }

    private JList _countryList;
}

/**
* This class demonstrates how to use the JTabbedPane.
*/

class JTabbedPaneTest extends JDialog implements ActionListener, KeyListener {

    JTabbedPaneTest(Frame owner_) {
        super(owner_, "JTabbedPane Test");
        _insets = new Insets(2, 3, 2, 3);
        Container contentPane = getContentPane();

        JPanel toppan = new JPanel();
        toppan.setBorder(new EmptyBorder(1, 1, 1, 1));
        toppan.add(new JLabel(
                "Press the F5, F6 and F7 keys to switch between panes"));

        JPanel centerpan = new JPanel();
        centerpan.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 1));

        _tabpane = new JTabbedPane();
        _tabpane.addTab("General", null, new GeneralPane(), "F5");
        _tabpane.addTab("Device Manager", null, new DevicePane(), "F6");
        _tabpane.addTab("Performance", null, new PerformancePane(), "F7");
        addKeyListener(this);
        centerpan.add(_tabpane);

        _okButton = new JButton("OK");
        _okButton.addActionListener(this);

        contentPane.add(toppan, BorderLayout.NORTH);
        contentPane.add(centerpan, BorderLayout.CENTER);
        contentPane.add(_okButton, BorderLayout.SOUTH);

        pack();
    }

    public void actionPerformed(ActionEvent e_) {
        hide();
    }

    /**
     * This method implements the KeyListener interface and handles the
     * interactive selection of tabs.
     */
    public void keyPressed(KeyEvent evt_) {
        int key = evt_.getKeyCode();
        if (key == KeyEvent.VK_F5)
            _tabpane.setSelectedIndex(0);
        else if (key == KeyEvent.VK_F6)
            _tabpane.setSelectedIndex(1);
        else if (key == KeyEvent.VK_F7) _tabpane.setSelectedIndex(2);
    }

    public void keyTyped(KeyEvent evt_) {
    }

    public void keyReleased(KeyEvent evt_) {
    }

    class GeneralPane extends JPanel {

        public GeneralPane() {
            setLayout(new BorderLayout());

            JPanel northpan = new JPanel();
            northpan.setLayout(new BoxLayout(northpan, BoxLayout.Y_AXIS));
            northpan.setBorder(new TitledBorder("System"));
            northpan.add(new JLabel("Red Hat Linux 9.0"));

            JPanel centerpan = new JPanel();
            centerpan.setLayout(new BoxLayout(centerpan, BoxLayout.Y_AXIS));
            centerpan.setBorder(new TitledBorder("Registered to"));
            centerpan.add(new JLabel("Rob Pitman"));
            centerpan.add(new JLabel("8 Pickwood Road"));
            centerpan.add(new JLabel("Centurion, South Africa"));

            JPanel southpan = new JPanel();
            southpan.setLayout(new BoxLayout(southpan, BoxLayout.Y_AXIS));
            southpan.setBorder(new TitledBorder("Computer"));
            southpan.add(new JLabel("GenuineIntel"));
            southpan.add(new JLabel("x86 Family 15 Model 1 Stepping 2"));
            southpan.add(new JLabel("256 MB RAM"));

            add(northpan, BorderLayout.NORTH);
            add(centerpan, BorderLayout.CENTER);
            add(southpan, BorderLayout.SOUTH);
            pack();
        }
    }

    class DevicePane extends JPanel {

        public DevicePane() {
            setLayout(new BorderLayout());

            JPanel northpan = new JPanel();
            JRadioButton button1 = new JRadioButton("View devices by type");
            JRadioButton button2 = new JRadioButton(
                    "View devices by connection");
            ButtonGroup buttons = new ButtonGroup();
            buttons.add(button1);
            buttons.add(button2);
            button1.setSelected(true);
            northpan.add(button1);
            northpan.add(button2);

            JPanel centerpan = new JPanel();
            String[] devices = { "Computer", "CD-ROM", "Disk drives",
                    "Display adapters", "Floppy disk controllers",
                    "Imaging devices", "Keyboard", "Modem", "Monitors", "Mouse"};
            JList deviceList = new JList(devices);
            deviceList.setBorder(new TitledBorder("Devices"));
            centerpan.add(deviceList);

            JPanel southpan = new JPanel();
            southpan.add(new JButton("Properties"));
            southpan.add(new JButton("Refresh"));
            southpan.add(new JButton("Remove"));
            southpan.add(new JButton("Print..."));

            add(northpan, BorderLayout.NORTH);
            add(centerpan, BorderLayout.CENTER);
            add(southpan, BorderLayout.SOUTH);
            pack();
        }
    }

    class PerformancePane extends JPanel {

        public PerformancePane() {
            setLayout(new BorderLayout());

            JPanel centerpan = new JPanel();
            centerpan.setBorder(new TitledBorder("Performance Status"));
            centerpan.setLayout(new BoxLayout(centerpan, BoxLayout.Y_AXIS));
            centerpan.add(new JLabel("Memory:           256.0 MB of RAM"));
            centerpan.add(new JLabel("System Resources: 50% free"));
            centerpan.add(new JLabel("File System:      32 bit"));
            centerpan.add(new JLabel("Virtual Memory:   32 bit"));
            centerpan.add(new JLabel("Disk Compression: Not Installed"));
            centerpan.add(new JLabel(
                    "Your system is configured for optimum performance"));

            JPanel southpan = new JPanel();
            southpan.setBorder(new TitledBorder("Advanced Settings"));
            southpan.add(new JButton("File System..."));
            southpan.add(new JButton("Graphics..."));
            southpan.add(new JButton("Virtual Memory..."));

            add(centerpan, BorderLayout.CENTER);
            add(southpan, BorderLayout.SOUTH);
            pack();
        }
    }

    private JButton _okButton;

    private JTabbedPane _tabpane;
}

/**
* This class demonstrates how to use the JTextField, the JPasswordField and
* the JTextArea.
*/

class TextWidgetTest extends JDialog implements ActionListener {

    TextWidgetTest(Frame owner_) {
        super(owner_, "Text Widget Test");
        Container contentPane = getContentPane();

        JPanel centerpan = new JPanel();
        centerpan.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        centerpan.add(new TextFieldPanel(), gbc);

        gbc.gridx = 1;
        centerpan.add(new PasswordFieldPanel(), gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 2;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        centerpan.add(new TextAreaPanel(), gbc);

        JPanel southpan = new JPanel();
        JButton okButton = new JButton("OK");
        okButton.addActionListener(this);
        southpan.add(okButton);

        contentPane.add(centerpan, BorderLayout.CENTER);
        contentPane.add(southpan, BorderLayout.SOUTH);
        pack();
    }

    public void actionPerformed(ActionEvent e_) {
        if (e_.getActionCommand().equals("OK")) hide();
    }

    /**
     * An inner class to display a JTextField.
     */
    class TextFieldPanel extends JPanel implements ItemListener {

        private JCheckBox _enabledCb;

        private JCheckBox _visibleCb;

        private JTextField _textfield;

        TextFieldPanel() {
            setLayout(new BorderLayout());
            setBorder(new TitledBorder("JTextField"));

            JPanel northpan = new JPanel();
            _enabledCb = new JCheckBox("Enabled");
            _enabledCb.setSelected(true);
            _enabledCb.addItemListener(this);
            northpan.add(_enabledCb);
            _visibleCb = new JCheckBox("Visible");
            _visibleCb.setSelected(true);
            _visibleCb.addItemListener(this);
            northpan.add(_visibleCb);

            JPanel southpan = new JPanel();
            _textfield = new JTextField("This is some text.....");
            _textfield.setBorder(new EmptyBorder(1, 1, 1, 1));
            southpan.add(_textfield);

            add(northpan, BorderLayout.NORTH);
            add(southpan, BorderLayout.SOUTH);
        }

        public void itemStateChanged(ItemEvent e_) {
            if (e_.getSource() == _enabledCb) {
                _textfield.setEnabled(_enabledCb.isSelected());
            } else {
                _textfield.setVisible(_visibleCb.isSelected());
            }
        }
    }

    /**
     * An inner class to display a JPasswordField.
     */
    class PasswordFieldPanel extends JPanel implements ItemListener {

        private JCheckBox _enabledCb;

        private JCheckBox _visibleCb;

        private JPasswordField _textfield;

        PasswordFieldPanel() {
            setLayout(new BorderLayout());
            setBorder(new TitledBorder("JPasswordField"));

            JPanel northpan = new JPanel();
            _enabledCb = new JCheckBox("Enabled");
            _enabledCb.setSelected(true);
            _enabledCb.addItemListener(this);
            northpan.add(_enabledCb);
            _visibleCb = new JCheckBox("Visible");
            _visibleCb.setSelected(true);
            _visibleCb.addItemListener(this);
            northpan.add(_visibleCb);

            JPanel southpan = new JPanel();
            _textfield = new JPasswordField("This is some text.....");
            _textfield.setBorder(new EmptyBorder(1, 1, 1, 1));
            southpan.add(_textfield);

            add(northpan, BorderLayout.NORTH);
            add(southpan, BorderLayout.SOUTH);
        }

        public void itemStateChanged(ItemEvent e_) {
            if (e_.getSource() == _enabledCb) {
                _textfield.setEnabled(_enabledCb.isSelected());
            } else {
                _textfield.setVisible(_visibleCb.isSelected());
            }
        }
    }

    /**
     * An inner class to display a JTextArea.
     */
    class TextAreaPanel extends JPanel implements ItemListener {

        private JCheckBox _linewrap;

        private JCheckBox _linewrapstyle;

        private JTextArea _textarea;

        TextAreaPanel() {
            setLayout(new BorderLayout());
            setBorder(new TitledBorder("JTextArea in a JScrollPane"));

            JPanel northpan = new JPanel();
            _linewrap = new JCheckBox("Line Wrap ");
            _linewrap.setSelected(false);
            _linewrap.addItemListener(this);
            northpan.add(_linewrap);
            _linewrapstyle = new JCheckBox("Line Wrap Style = Word");
            _linewrapstyle.setSelected(false);
            _linewrapstyle.setEnabled(false);
            _linewrapstyle.addItemListener(this);
            northpan.add(_linewrapstyle);

            _textarea = new JTextArea("Contents of the JTextArea...", 8, 50);
            JScrollPane scrollpane = new JScrollPane(_textarea);
            scrollpane.setViewportBorder(new TitledBorder("Text Area"));

            add(northpan, BorderLayout.NORTH);
            add(scrollpane, BorderLayout.SOUTH);
        }

        public void itemStateChanged(ItemEvent e_) {
            Component source = (Component) e_.getSource();
            if (source == _linewrap) {
                _textarea.setLineWrap(_linewrap.isSelected());
                if (_textarea.getLineWrap() == false)
                        _linewrapstyle.setSelected(false);
                _linewrapstyle.setEnabled(_textarea.getLineWrap());
            } else {
                _textarea.setWrapStyleWord(_linewrapstyle.isSelected());
            }
        }
    }
}

/**
* This class demonstrates how to use the JComboBox and the JList components.
*/

class SelectionTest extends JDialog implements ActionListener {

    SelectionTest(Frame owner_) {
        super(owner_, "JComboBox and JList");
        Container contentPane = getContentPane();

        JPanel northpan = new ComboBoxPanel();

        JPanel centerpan = new JListPanel();

        JPanel southpan = new JPanel();
        JButton okButton = new JButton("OK");
        okButton.addActionListener(this);
        southpan.add(okButton);

        contentPane.add(northpan, BorderLayout.NORTH);
        contentPane.add(centerpan, BorderLayout.CENTER);
        contentPane.add(southpan, BorderLayout.SOUTH);
        pack();
    }

    public void actionPerformed(ActionEvent e_) {
        if (e_.getActionCommand().equals("OK")) {
            hide();
        }
    }

    /**
     * An inner class that displays a JComboBox.
     */
    class ComboBoxPanel extends JPanel implements ItemListener {

        private JComboBox _comboBox;

        private JTextField _comboBoxSelection;

        ComboBoxPanel() {
            setLayout(new BorderLayout());
            setBorder(new TitledBorder("JComboBox"));

            add(new JLabel("Press ENTER to pop up the JComboBox"),
                    BorderLayout.NORTH);

            String[] colors = { "Red", "Blue", "Green", "Magenta", "Mauve",
                    "Orange", "Black", "White", "Brown"};
            _comboBox = new JComboBox(colors);
            _comboBox.setMaximumRowCount(5);
            _comboBox.addItemListener(this);
            add(_comboBox, BorderLayout.CENTER);

            JPanel southpan = new JPanel();
            southpan.add(new JLabel(" Selected item is: "));
            _comboBoxSelection = new JTextField(15);
            _comboBoxSelection.setEnabled(false);
            southpan.add(_comboBoxSelection);
            add(southpan, BorderLayout.SOUTH);
        }

        public void itemStateChanged(ItemEvent e_) {
            _comboBoxSelection.setText((String) _comboBox.getSelectedItem());
        }
    }

    /**
     * An inner class that displays a JList.
     */
    class JListPanel extends JPanel implements ListSelectionListener,
            ListDataListener, ItemListener, ActionListener {

        private JCheckBox _selectionMode;

        private JList _vehicleList;

        private JTextField _listSelection;

        private JButton _deleteButton;

        JListPanel() {
            setBorder(new TitledBorder("JList"));
            setLayout(new BorderLayout());

            add(new JLabel("Use UP, DOWN, PGUP, PGDN, HOME & END to navigate"),
                    BorderLayout.NORTH);

            String[] vehicles = { "Volkswagen", "Rolls-Royce", "Toyota",
                    "Chrysler", "Mercedes Benz", "Bentley", "Bugatti",
                    "Maserati", "Porsche"};
            DefaultListModel model = new DefaultListModel();
            int columns = 0;
            for (int i = 0; i < vehicles.length; i++) {
                model.addElement(vehicles[ i]);
                if (vehicles[ i].length() > columns)
                        columns = vehicles[ i].length();
            }
            model.addListDataListener(this);

            _vehicleList = new JList(model);
            _vehicleList.setVisibleRowCount(5);
            _vehicleList.setColumns(columns);
            _vehicleList.addListSelectionListener(this);
            JScrollPane scrollpane = new JScrollPane(_vehicleList);
            scrollpane.setViewportBorder(new TitledBorder("Vehicles"));
            add(scrollpane, BorderLayout.WEST);

            _selectionMode = new JCheckBox("Selection Mode = Multiple");
            _selectionMode.addItemListener(this);

            _deleteButton = new JButton("Delete selected item(s)");
            _deleteButton.setActionCommand("Delete");
            _deleteButton.addActionListener(this);

            JPanel eastpan = new JPanel();
            eastpan.setLayout(new BoxLayout(eastpan, BoxLayout.Y_AXIS));
            eastpan.add(new JLabel(""));
            eastpan.add(_selectionMode);
            eastpan.add(new JLabel(""));
            eastpan.add(_deleteButton);
            add(eastpan, BorderLayout.EAST);

            JPanel southpan = new JPanel();
            southpan.add(new JLabel("Selected item(s):"));

            _listSelection = new JTextField(30);
            _listSelection.setEnabled(false);
            southpan.add(_listSelection);
            add(southpan, BorderLayout.SOUTH);
            pack();
        }

        /**
         * This method implements the ListSelectionListener interface, and is
         * called when an item is selected or deselected in the JList.
         */
        public void valueChanged(ListSelectionEvent e_) {
            Object[] items = _vehicleList.getSelectedValues();
            String s = "";
            for (int i = 0; i < items.length; i++) {
                if (i != 0) s += ",";
                s += (String) items[ i];
            }
            _listSelection.setText(s);
        }

        public void actionPerformed(ActionEvent e_) {
            String cmd = e_.getActionCommand();
            if (cmd.equals("Delete")) {
                int[] indices = _vehicleList.getSelectedIndices();
                if (indices.length == 0) return; // there is no selected item

                DefaultListModel model = (DefaultListModel) _vehicleList
                        .getModel();

                // We must remove the last elements first, otherwise
                // (if we remove an element with a low index), the
                // higher indices will be invalid.
                for (int i = indices.length - 1; i >= 0; i--) {
                    model.removeElementAt(indices[ i]);
                }

                // Having deleted some elements from the list, we must
                // ensure that:
                // (a) the first index inside the visible area is >= 0
                // (b) the "current row" is inside the visible area.
                // What constitutes the "current row" after a deletion is
                // debatable; we will assume that the last index to be
                // deleted is a close approximation.
                _vehicleList.ensureIndexIsVisible(indices[ 0]);
            }
        }

        /**
         * This method implements the ListDataListener interface, and is called
         * when an item is added to or removed from the list, or the value of
         * an item in the list changes.
         */
        public void contentsChanged(ListDataEvent e_) {
            _vehicleList
                    .removeSelectionInterval(e_.getIndex0(), e_.getIndex1());
            _vehicleList.repaint();
        }

        /**
         * These methods are defined for compatibilty with Swing, but are not
         * used in CHARVA.
         */
        public void intervalAdded(ListDataEvent e_) {
        }

        public void intervalRemoved(ListDataEvent e_) {
        }

        /**
         * This method implements the ItemListener interface, and is called
         * when the SelectionMode checkbox is changed.
         */
        public void itemStateChanged(ItemEvent e_) {
            if (e_.getSource() == _selectionMode) {
                if (_selectionMode.isSelected()) {
                    _vehicleList
                            .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
                } else {
                    _vehicleList
                            .setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                }
            }
        }
    }
}

/**
* This class demonstrates how to use the various types of Buttons.
*/

class ButtonTest extends JDialog implements ActionListener, KeyListener,
        ItemListener {

    private ButtonGroup _buttons = new ButtonGroup();

    private JRadioButton _strawberry = new JRadioButton("Strawberry");

    private JRadioButton _chocolate = new JRadioButton("Chocolate");

    private JRadioButton _vanilla = new JRadioButton("Vanilla");

    private JRadioButton _pistachio = new JRadioButton("Pistachio");

    private JRadioButton _lime = new JRadioButton("Lime");

    private JTextField _selectedFlavor = new JTextField(15);

    private JCheckBox _nutTopping = new JCheckBox("Nuts ");

    private JCheckBox _syrupTopping = new JCheckBox("Syrup ");

    private JCheckBox _candyTopping = new JCheckBox("Candy ");

    private JCheckBox _waferTopping = new JCheckBox("Wafer ");

    ButtonTest(Frame owner_) {
        super(owner_, "Button Test");
        Container contentPane = getContentPane();

        contentPane.add(makeNorthPanel(), BorderLayout.NORTH);

        contentPane.add(makeCenterPanel(), BorderLayout.CENTER);

        JPanel southpan = new JPanel();
        JButton okButton = new JButton("OK (F9)");
        okButton.setActionCommand("OK");
        okButton.addActionListener(this);
        southpan.add(okButton);

        contentPane.add(southpan, BorderLayout.SOUTH);

        /*
         * Add a KeyListener for this entire window; any key pressed on any
         * component in this window will cause keyPressed (or keyTyped) to be
         * called.
         */
        addKeyListener(this);
        pack();
    }

    /**
     * Implements the ActionListener interface.
     */
    public void actionPerformed(ActionEvent e_) {
        String cmd = e_.getActionCommand();
        if (cmd.equals("OK")) {
            hide();
        }
    }

    /**
     * Implements ItemListener interface
     */
    public void itemStateChanged(ItemEvent e_) {

        int statechange = e_.getStateChange();
        Component source = (Component) e_.getSource();
        if (statechange == ItemEvent.SELECTED) {
            JRadioButton button = (JRadioButton) source;
            _selectedFlavor.setText(button.getText());
        }
    }

    public void keyPressed(KeyEvent e_) {
        int key = e_.getKeyCode();
        Object src = e_.getSource();

        if (key == KeyEvent.VK_F9) {
            /*
             * Consume the event so it doesn't get processed further by the
             * component that generated it.
             */
            e_.consume();
            hide();
            return;
        }

        if (key == KeyEvent.VK_UP) {
            if (src == _chocolate)
                _strawberry.requestFocus();
            else if (src == _vanilla)
                _chocolate.requestFocus();
            else if (src == _pistachio)
                _vanilla.requestFocus();
            else if (src == _lime) _pistachio.requestFocus();
            e_.consume();
            repaint();
        } else if (key == KeyEvent.VK_DOWN) {
            if (src == _strawberry)
                _chocolate.requestFocus();
            else if (src == _chocolate)
                _vanilla.requestFocus();
            else if (src == _vanilla)
                _pistachio.requestFocus();
            else if (src == _pistachio)
                _lime.requestFocus();
            else if (src == _lime) _nutTopping.requestFocus();
            e_.consume();
            repaint();
        }
    }

    public void keyTyped(KeyEvent e_) {
    }

    public void keyReleased(KeyEvent e_) {
    }

    private JPanel makeNorthPanel() {
        JPanel northpan = new JPanel();
        northpan.setBorder(new TitledBorder("Select a flavor"));
        northpan.setLayout(new BoxLayout(northpan, BoxLayout.Y_AXIS));

        northpan.add(_strawberry);
        northpan.add(_chocolate);
        northpan.add(_vanilla);
        northpan.add(_pistachio);
        northpan.add(_lime);

        _strawberry.addItemListener(this);
        _strawberry.setActionCommand("Strawberry");
        _chocolate.addItemListener(this);
        _chocolate.setActionCommand("Chocolate");
        _vanilla.addItemListener(this);
        _vanilla.setActionCommand("Vanilla");
        _pistachio.addItemListener(this);
        _pistachio.setActionCommand("Pistachio");
        _lime.addItemListener(this);
        _lime.setActionCommand("Lime");

        JPanel panel = new JPanel();
        panel.add(new JLabel("Selected flavor: "));
        panel.add(_selectedFlavor);
        _selectedFlavor.setEnabled(false);
        panel.setBorder(new EmptyBorder(1, 1, 1, 1));
        northpan.add(panel);

        _buttons.add(_strawberry);
        _strawberry.setSelected(true); // select one button in the group
        _buttons.add(_chocolate);
        _buttons.add(_vanilla);
        _buttons.add(_pistachio);
        _buttons.add(_lime);

        return northpan;
    }

    private JPanel makeCenterPanel() {
        JPanel centerpan = new JPanel();
        centerpan.setBorder(new TitledBorder("Select one or more toppings"));
        centerpan.add(_nutTopping);
        centerpan.add(_syrupTopping);
        centerpan.add(_candyTopping);
        centerpan.add(_waferTopping);

        return centerpan;
    }
}

/**
* This class demonstrates how to use the JTable component in a JScrollPane.
*/

class JTableTest extends JDialog implements ActionListener, ItemListener {

    private JTable _table;

    private JTextField _selectedColumns = new JTextField(10);

    private JTextField _selectedRows = new JTextField(10);

    private JCheckBox _checkBoxAllowRowSelection = new JCheckBox(
            "Allow row selection");

    private JCheckBox _checkBoxAllowColumnSelection = new JCheckBox(
            "Allow column selection");

    private JCheckBox _checkBoxAllowMultipleSelection = new JCheckBox(
            "Allow multiple selection");

    private JButton _okButton;

    //private JScrollBar _scrollbar;

    JTableTest(Frame owner_) {
        super(owner_, "JTable in a JScrollPane");
        _insets = new Insets(3, 3, 3, 3);
        Container contentPane = getContentPane();

        JPanel northpan = new JPanel();
        northpan.setBorder(new EmptyBorder(1, 1, 1, 1));
        northpan.add(new JLabel("Press ENTER to select/deselect columns/rows"));
        contentPane.add(northpan, BorderLayout.NORTH);

        contentPane.add(makeCenterPanel(), BorderLayout.CENTER);

        contentPane.add(makeEastPanel(), BorderLayout.EAST);

        _okButton = new JButton("OK");
        _okButton.addActionListener(this);
        contentPane.add(_okButton, BorderLayout.SOUTH);

        pack();
    }

    public void actionPerformed(ActionEvent e_) {
        hide();
    }

    public void itemStateChanged(ItemEvent e_) {
        Object source = e_.getSource();
        if (source == _checkBoxAllowRowSelection) {
            boolean allowed = _checkBoxAllowRowSelection.isSelected();
            _table.setRowSelectionAllowed(allowed);
        } else if (source == _checkBoxAllowColumnSelection) {
            boolean allowed = _checkBoxAllowColumnSelection.isSelected();
            _table.setColumnSelectionAllowed(allowed);
        } else if (source == _checkBoxAllowMultipleSelection) {
            boolean allowed = _checkBoxAllowMultipleSelection.isSelected();
            if (allowed)
                _table
                        .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
            else
                _table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        }
    }

    private JPanel makeCenterPanel() {
        JPanel centerpan = new JPanel();
        centerpan.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 1));
        String[] headings = { "Name", "Color", "Composition", "Mass", "Radius",
                "Orbit"};
        String[][] data = {
                { "Mars", "Red", "Dust", "1.5e10", "2.7e6", "Elliptical"},
                { "Pluto", "Blue", "Rock", "2.3e11", "2.9e7", "Circular"},
                { "Luna", "Green", "Cheese", "1.3e5", "2.3e12", "Square"},
                { "Venus", "White", "Gas", "4.3e5", "2.3e12",
                        "A funny irregular shape whose name is longer than the table width"},
                { "Jupiter", "Black", "Marshmallow", "4.3e6", "2.3e12",
                        "Zigzag"},
                { "Neptune", "Purple", "Gas", "1.2e6", "2.4e2", "Elliptical"},
                { "Saturn", "Yellow", "Gas", "1.1e7", "1.4e6", "Circular"}};

        /*
         * The following inner class overrides the processKeyEvent() method of
         * JTable, so that we can display the selected rows and columns.
         */
        _table = new JTable(data, headings) {

            /*
             * Gets called when the user presses a key in the JTable.
             */
            public void processKeyEvent(KeyEvent e_) {
                super.processKeyEvent(e_);
                if (e_.getKeyCode() != KeyEvent.VK_ENTER) return;

                int[] rows = getSelectedRows();
                StringBuffer buf = new StringBuffer();
                for (int i = 0; i < rows.length; i++) {
                    buf.append(rows[ i]);
                    buf.append(' ');
                }
                _selectedRows.setText(buf.toString());

                int[] columns = getSelectedColumns();
                buf = new StringBuffer();
                for (int i = 0; i < columns.length; i++) {
                    buf.append(columns[ i]);
                    buf.append(' ');
                }
                _selectedColumns.setText(buf.toString());
            }
        };
        _table.setPreferredScrollableViewportSize(new Dimension(30, 5));
        //_table.setValueAt("Yellow", 5, 2);
        //_table.setValueAt("Red", 7, 4);
        //_table.setValueAt("Magenta", 1, 5);
        JScrollPane scrollPane = new JScrollPane(_table);
        TitledBorder border = new TitledBorder(new LineBorder(Color.cyan));
        border.setTitle("The Heavenly Bodies");
        scrollPane.setViewportBorder(border);
        //  scrollPane.setSize(25, 6);
        centerpan.add(scrollPane);

        return centerpan;
    }

    private JPanel makeEastPanel() {
        JPanel eastpan = new JPanel();
        eastpan.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        gbc.anchor = GridBagConstraints.WEST;
        gbc.gridwidth = 2;
        eastpan.add(_checkBoxAllowRowSelection, gbc);
        _checkBoxAllowRowSelection.addItemListener(this);
        _checkBoxAllowRowSelection.setSelected(true);

        gbc.gridy = 1;
        eastpan.add(_checkBoxAllowColumnSelection, gbc);
        _checkBoxAllowColumnSelection.addItemListener(this);
        _checkBoxAllowColumnSelection.setSelected(true);

        gbc.gridy = 2;
        eastpan.add(_checkBoxAllowMultipleSelection, gbc);
        _checkBoxAllowMultipleSelection.addItemListener(this);
        _checkBoxAllowMultipleSelection.setSelected(false);

        gbc.gridy = 3;
        gbc.gridwidth = 1;
        eastpan.add(new JLabel(""), gbc);

        gbc.anchor = GridBagConstraints.EAST;
        gbc.gridy = 4;
        eastpan.add(new JLabel("selected columns: "), gbc);

        gbc.gridy = 5;
        eastpan.add(new JLabel("selected rows: "), gbc);

        gbc.gridx = 1;
        gbc.gridy = 4;
        gbc.anchor = GridBagConstraints.WEST;
        _selectedColumns.setEnabled(false);
        eastpan.add(_selectedColumns, gbc);

        gbc.gridy = 5;
        _selectedRows.setEnabled(false);
        eastpan.add(_selectedRows, gbc);

        return eastpan;
    }
}

/**
* This class demonstrates how to listen for KeyEvents generated by a
* component, and modify the component's default reaction to such KeyEvents.
*/

class KeyEventTest extends JDialog implements ActionListener, KeyListener {

    private JCheckBox _checkBox1 = new JCheckBox("System ON");

    private JCheckBox _checkBox2 = new JCheckBox("Alarm ON");

    private JCheckBox _checkBox3 = new JCheckBox("System Armed");

    private charva.awt.util.CapsTextField _capsField;

    KeyEventTest(Frame owner_) {
        super(owner_, "KeyEvent Test");
        Container contentPane = getContentPane();

        contentPane.add(makeNorthPanel(), BorderLayout.NORTH);

        contentPane.add(makeCenterPanel(), BorderLayout.CENTER);

        JPanel southpan = new JPanel();
        JButton okButton = new JButton("OK");
        okButton.addActionListener(this);
        southpan.add(okButton);

        contentPane.add(southpan, BorderLayout.SOUTH);

        pack();
    }

    /**
     * Implements the ActionListener interface
     */
    public void actionPerformed(ActionEvent e_) {
        String cmd = e_.getActionCommand();
        if (cmd.equals("OK")) hide();
    }

    /**
     * Implements the KeyListener interface
     */
    public void keyPressed(KeyEvent e_) {
        Component src = (Component) e_.getSource();
        int key = e_.getKeyCode();
        if (key == KeyEvent.VK_DOWN
                && (src == _checkBox1 || src == _checkBox2 || src == _checkBox3)) {

            /*
             * Move the keyboard input focus to the textfield below.
             */
            _capsField.requestFocus();

            /*
             * "Consume" the keystroke so that it is not interpreted further by
             * the JCheckBox which generated it.
             */
            e_.consume();

            /*
             * Repaint the dialog-box to update the cursor position.
             */
            repaint();
        }
    }

    /**
     * Implements the KeyListener interface
     */
    public void keyTyped(KeyEvent e_) {
    }

    public void keyReleased(KeyEvent e_) {
    }

    private JPanel makeNorthPanel() {
        JPanel northpan = new JPanel();
        northpan.setBorder(new TitledBorder("A set of JCheckBoxes"));
        northpan.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 3;
        gbc.insets = new Insets(1, 1, 1, 1);
        JLabel label = new JLabel(
                "Press CURSOR-DOWN to move to the text-field below");
        northpan.add(label, gbc);

        gbc.gridy = 1;
        gbc.gridwidth = 1;
        northpan.add(_checkBox1, gbc);
        _checkBox1.addKeyListener(this);

        gbc.gridx = 1;
        northpan.add(_checkBox2, gbc);
        _checkBox2.addKeyListener(this);

        gbc.gridx = 2;
        northpan.add(_checkBox3, gbc);
        _checkBox3.addKeyListener(this);

        return northpan;
    }

    private JPanel makeCenterPanel() {
        JPanel centerpan = new JPanel();
        centerpan.setBorder(new TitledBorder(
                "A Text Field that converts to uppercase"));
        centerpan.setLayout(new BorderLayout());

        JLabel label1 = new JLabel(
                "The CapsTextField is a subclass of JTextField");
        label1.setBorder(new EmptyBorder(1, 1, 0, 1));
        centerpan.add(label1, BorderLayout.NORTH);

        JLabel label2 = new JLabel(
                "that overrides the processKeyEvent() method");
        label2.setBorder(new EmptyBorder(0, 1, 1, 1));
        centerpan.add(label2, BorderLayout.CENTER);

        JPanel southpan = new JPanel();
        southpan.add(new JLabel("CapsTextField: "));
        _capsField = new CapsTextField(
                "THIS FIELD AUTOMATICALLY CONVERTS TO UPPERCASE");
        southpan.add(_capsField);
        centerpan.add(southpan, BorderLayout.SOUTH);

        return centerpan;
    }
}

/**
* This class demonstrates how to listen for FocusEvents which are generated
* when a component gains or loses the keyboard input focus.
*/

class FocusEventTest extends JDialog implements FocusListener, ActionListener {

    private JTextField _floatField = new JTextField(15);

    private JTextField _focusLostBy = new JTextField(15);

    private JTextField _focusGainedBy = new JTextField(15);

    private JButton _okButton = new JButton("OK");

    FocusEventTest(Frame owner_) {
        super(owner_, "FocusEvent Test");
        Container contentPane = getContentPane();

        contentPane.add(makeNorthPanel(), BorderLayout.NORTH);

        contentPane.add(makeCenterPanel(), BorderLayout.CENTER);

        JPanel southpan = new JPanel();
        _okButton.addActionListener(this);
        _okButton.addFocusListener(this);
        southpan.add(_okButton);
        contentPane.add(southpan, BorderLayout.SOUTH);

        pack();
    }

    public void actionPerformed(ActionEvent e_) {
        if (e_.getActionCommand().equals("OK")) {
            hide();
        }
    }

    public void focusGained(FocusEvent e_) {
        Object src = e_.getSource();
        if (src == _floatField) {
            _focusGainedBy.setText("_floatField");
        } else if (src == _okButton) {
            _focusGainedBy.setText("_okButton");
        }
    }

    public void focusLost(FocusEvent e_) {
        Object src = e_.getSource();
        if (src == _floatField) {
            _focusLostBy.setText("_floatField");

            try {
                Float.parseFloat(_floatField.getText());
            } catch (NumberFormatException e) {
                JOptionPane.showMessageDialog(this,
                        "Must be a valid floating-point number", "Error",
                        JOptionPane.PLAIN_MESSAGE);
                _floatField.requestFocus();
            }
        } else if (src == _okButton) {
            _focusLostBy.setText("_okButton");
        }
    }

    private JPanel makeNorthPanel() {
        JPanel northpan = new JPanel();
        northpan.setBorder(new TitledBorder("A floating-point input field"));
        northpan.setLayout(new BorderLayout());

        JLabel label1 = new JLabel("Enter a non-numeric value, and then");
        label1.setBorder(new EmptyBorder(1, 1, 0, 1));
        northpan.add(label1, BorderLayout.NORTH);

        JLabel label2 = new JLabel("try pressing TAB");
        label2.setBorder(new EmptyBorder(0, 1, 1, 1));
        northpan.add(label2, BorderLayout.CENTER);

        northpan.add(_floatField, BorderLayout.SOUTH);
        _floatField.addFocusListener(this);

        return northpan;
    }

    private JPanel makeCenterPanel() {
        JPanel centerpan = new JPanel();
        centerpan.setBorder(new TitledBorder("Status"));
        centerpan.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();

        gbc.anchor = GridBagConstraints.EAST;
        centerpan.add(new JLabel("Focus lost by: "), gbc);

        gbc.gridy = 1;
        centerpan.add(new JLabel("Focus gained by: "), gbc);

        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.EAST;
        centerpan.add(_focusLostBy, gbc);
        _focusLostBy.setEnabled(false);

        gbc.gridy = 1;
        centerpan.add(_focusGainedBy, gbc);
        _focusGainedBy.setEnabled(false);

        return centerpan;
    }
}

//========================================================================
/**
* This class demonstrates how to run a long-duration task in a separate thread
* and display the task's progress in a JProgressBar component.
*/

class ProgressBarTest extends JDialog implements ActionListener {

    private JProgressBar _progressBar = new JProgressBar();

    private Thread _taskThread;

    ProgressBarTest(Frame owner_) {
        super(owner_, "JProgressBar Test");
        Container contentPane = getContentPane();

        contentPane.add(makeNorthPanel(), BorderLayout.NORTH);

        contentPane.add(makeCenterPanel(), BorderLayout.CENTER);

        JPanel southpan = new JPanel();
        JButton startButton = new JButton("Start Task");
        startButton.addActionListener(this);
        southpan.add(startButton);

        JButton okButton = new JButton("OK");
        okButton.addActionListener(this);
        southpan.add(okButton);

        JButton cancelButton = new JButton("Cancel");
        cancelButton.addActionListener(this);
        southpan.add(cancelButton);

        contentPane.add(southpan, BorderLayout.SOUTH);

        pack();
    }

    /**
     * Implements the ActionListener interface
     */
    public void actionPerformed(ActionEvent e_) {
        String cmd = e_.getActionCommand();
        if (cmd.equals("Start Task")) {
            if (_taskThread != null && _taskThread.isAlive()) {
                JOptionPane.showMessageDialog(this,
                        "The task is already running", "Error",
                        JOptionPane.PLAIN_MESSAGE);
            } else {
                _taskThread = new TaskThread();
                _taskThread.start();
            }
        } else if (cmd.equals("OK")) {
            if (_taskThread != null && _taskThread.isAlive()) {
                JOptionPane.showMessageDialog(this,
                        "The task is still running", "Error",
                        JOptionPane.PLAIN_MESSAGE);
            } else
                hide();
        } else if (cmd.equals("Cancel")) {
            if (_taskThread != null && _taskThread.isAlive()) {
                _taskThread.interrupt();
            }
            hide();
        }
    }

    private JPanel makeNorthPanel() {
        JPanel northpan = new JPanel();
        northpan.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 2;
        gbc.anchor = GridBagConstraints.WEST;
        gbc.insets = new Insets(1, 1, 1, 1);
        JLabel label = new JLabel(
                "Press START TASK to run a long task in a separate thread.");
        northpan.add(label, gbc);

        gbc.gridy = 1;
        gbc.gridwidth = 2;
        gbc.insets = new Insets(0, 1, 0, 1);
        label = new JLabel(
                "While the task is running, press TAB and then enter some");
        northpan.add(label, gbc);

        gbc.gridy = 2;
        gbc.gridwidth = 2;
        gbc.insets = new Insets(0, 1, 0, 1);
        label = new JLabel(
                "text in the TextField to verify that the user interface");
        northpan.add(label, gbc);

        gbc.gridy = 3;
        gbc.gridwidth = 2;
        gbc.insets = new Insets(0, 1, 1, 1);
        label = new JLabel("is still responsive.");
        northpan.add(label, gbc);

        gbc.gridy = 4;
        gbc.gridwidth = 2;
        gbc.insets = new Insets(0, 1, 0, 1);
        label = new JLabel(
                "The progress bar will start in indeterminate mode, indicating");
        northpan.add(label, gbc);

        gbc.gridy = 5;
        gbc.gridwidth = 2;
        gbc.insets = new Insets(0, 1, 0, 1);
        label = new JLabel(
                "that the task duration is initially unknown; then it will");
        northpan.add(label, gbc);

        gbc.gridy = 6;
        gbc.gridwidth = 2;
        gbc.insets = new Insets(0, 1, 1, 1);
        label = new JLabel("change to determinate mode.");
        northpan.add(label, gbc);

        gbc.gridx = 0;
        gbc.gridy = 7;
        gbc.gridwidth = 1;
        gbc.anchor = GridBagConstraints.EAST;
        northpan.add(new JLabel("Enter some text here:"), gbc);

        gbc.gridx = 1;
        gbc.anchor = GridBagConstraints.WEST;
        northpan.add(new JTextField(20), gbc);
        gbc.insets = new Insets(0, 1, 1, 1);

        return northpan;
    }

    private JPanel makeCenterPanel() {
        JPanel centerpan = new JPanel();
        centerpan.setBorder(new TitledBorder("Task Progress"));
        centerpan.setLayout(new BorderLayout());

        _progressBar.setStringPainted(true);
        centerpan.add(_progressBar, BorderLayout.CENTER);

        return centerpan;
    }

    /**
     * A nonstatic inner class that pretends to perform a time-consuming task.
     */
    private class TaskThread extends Thread {

        /** Constructor */
        private TaskThread() {
        }

        /**
         * Pretend to do a task that takes a long time. Twice per second, wake
         * up and update the progress bar. Note that since this thread is not
         * the event-dispatching thread, we cannot manipulate the screen
         * components directly; instead, we must call the static method
         * "invokeLater()" of the SwingUtilities class, which will cause the
         * event-dispatching thread to update the progress bar. See "Core Java,
         * Volume II" by Horstmann and Cornell, chapter 1; Also see
         * http://java.sun.com/docs/books/tutorial/uiswing/overview/threads.html
         */
        public void run() {

            try {
                // Initially, set the progressbar to indeterminate mode
                // for 5 seconds (i.e. pretend we don't initially know
                // the duration of the task).
                _progressBar.setIndeterminate(true);
                Thread.sleep(5000L);
                _progressBar.setIndeterminate(false);

                for (int percent = 0; percent <= 100; percent += 2) {

                    Thread.sleep(500L);
                    Runnable updater = new ProgressBarUpdater(percent);
                    SwingUtilities.invokeLater(updater);
                }
            } catch (InterruptedException e) {
                System.err.println("TaskThread was interrupted");
                return;
            }
        }
    }

    /**
     * This is a nonstatic inner class that implements the Runnable interface;
     * instances of this can be passed to the SwingUtilities.invokeLater()
     * method. A shortcut method of invoking code in the event-dispatch thread,
     * involving the use of anonymous inner classes, is shown in "Core Java
     * Volume II" by Horstmann and Cornell, chapter 1, in the "Threads and
     * Swing" subsection.
     */
    private class ProgressBarUpdater implements Runnable {

        private int _percent;

        private ProgressBarUpdater(int percent_) {
            _percent = percent_;
        }

        public void run() {
            String str = Integer.toString(_percent) + "%";
            _progressBar.setString(str);
            _progressBar.setValue(_percent);
        }
    }
}
TOP

Related Classes of charva.awt.Tutorial

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.