SwingMenus.java Source code

Java tutorial

Introduction

Here is the source code for SwingMenus.java

Source

// : c14:SwingMenus.java
// Submenus, checkbox menu items, swapping menus,
// mnemonics (shortcuts) and action commands.
// <applet code=SwingMenus width=300 height=100></applet>
// From 'Thinking in Java, 3rd ed.' (c) Bruce Eckel 2002
// www.BruceEckel.com. See copyright notice in CopyRight.txt.

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTextField;

public class SwingMenus extends JApplet {
    private String[] flavors = { "Chocolate", "Strawberry", "Vanilla Fudge Swirl", "Mint Chip",
            "Mocha Almond Fudge", "Rum Raisin", "Praline Cream", "Mud Pie" };

    private JTextField t = new JTextField("No flavor", 30);

    private JMenuBar mb1 = new JMenuBar();

    private JMenu f = new JMenu("File"), m = new JMenu("Flavors"), s = new JMenu("Safety");

    // Alternative approach:
    private JCheckBoxMenuItem[] safety = { new JCheckBoxMenuItem("Guard"), new JCheckBoxMenuItem("Hide") };

    private JMenuItem[] file = { new JMenuItem("Open") };

    // A second menu bar to swap to:
    private JMenuBar mb2 = new JMenuBar();

    private JMenu fooBar = new JMenu("fooBar");

    private JMenuItem[] other = {
            // Adding a menu shortcut (mnemonic) is very
            // simple, but only JMenuItems can have them
            // in their constructors:
            new JMenuItem("Foo", KeyEvent.VK_F), new JMenuItem("Bar", KeyEvent.VK_A),
            // No shortcut:
            new JMenuItem("Baz"), };

    private JButton b = new JButton("Swap Menus");

    class BL implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            JMenuBar m = getJMenuBar();
            setJMenuBar(m == mb1 ? mb2 : mb1);
            validate(); // Refresh the frame
        }
    }

    class ML implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            JMenuItem target = (JMenuItem) e.getSource();
            String actionCommand = target.getActionCommand();
            if (actionCommand.equals("Open")) {
                String s = t.getText();
                boolean chosen = false;
                for (int i = 0; i < flavors.length; i++)
                    if (s.equals(flavors[i]))
                        chosen = true;
                if (!chosen)
                    t.setText("Choose a flavor first!");
                else
                    t.setText("Opening " + s + ". Mmm, mm!");
            }
        }
    }

    class FL implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            JMenuItem target = (JMenuItem) e.getSource();
            t.setText(target.getText());
        }
    }

    // Alternatively, you can create a different
    // class for each different MenuItem. Then you
    // Don't have to figure out which one it is:
    class FooL implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            t.setText("Foo selected");
        }
    }

    class BarL implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            t.setText("Bar selected");
        }
    }

    class BazL implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            t.setText("Baz selected");
        }
    }

    class CMIL implements ItemListener {
        public void itemStateChanged(ItemEvent e) {
            JCheckBoxMenuItem target = (JCheckBoxMenuItem) e.getSource();
            String actionCommand = target.getActionCommand();
            if (actionCommand.equals("Guard"))
                t.setText("Guard the Ice Cream! " + "Guarding is " + target.getState());
            else if (actionCommand.equals("Hide"))
                t.setText("Hide the Ice Cream! " + "Is it hidden? " + target.getState());
        }
    }

    public void init() {
        ML ml = new ML();
        CMIL cmil = new CMIL();
        safety[0].setActionCommand("Guard");
        safety[0].setMnemonic(KeyEvent.VK_G);
        safety[0].addItemListener(cmil);
        safety[1].setActionCommand("Hide");
        safety[1].setMnemonic(KeyEvent.VK_H);
        safety[1].addItemListener(cmil);
        other[0].addActionListener(new FooL());
        other[1].addActionListener(new BarL());
        other[2].addActionListener(new BazL());
        FL fl = new FL();
        for (int i = 0; i < flavors.length; i++) {
            JMenuItem mi = new JMenuItem(flavors[i]);
            mi.addActionListener(fl);
            m.add(mi);
            // Add separators at intervals:
            if ((i + 1) % 3 == 0)
                m.addSeparator();
        }
        for (int i = 0; i < safety.length; i++)
            s.add(safety[i]);
        s.setMnemonic(KeyEvent.VK_A);
        f.add(s);
        f.setMnemonic(KeyEvent.VK_F);
        for (int i = 0; i < file.length; i++) {
            file[i].addActionListener(fl);
            f.add(file[i]);
        }
        mb1.add(f);
        mb1.add(m);
        setJMenuBar(mb1);
        t.setEditable(false);
        Container cp = getContentPane();
        cp.add(t, BorderLayout.CENTER);
        // Set up the system for swapping menus:
        b.addActionListener(new BL());
        b.setMnemonic(KeyEvent.VK_S);
        cp.add(b, BorderLayout.NORTH);
        for (int i = 0; i < other.length; i++)
            fooBar.add(other[i]);
        fooBar.setMnemonic(KeyEvent.VK_B);
        mb2.add(fooBar);
    }

    public static void main(String[] args) {
        run(new SwingMenus(), 300, 100);
    }

    public static void run(JApplet applet, int width, int height) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(applet);
        frame.setSize(width, height);
        applet.init();
        applet.start();
        frame.setVisible(true);
    }
} ///:~