Mega Code Archive

 
Categories / Java / Swing JFC
 

Submenus, checkbox menu items, swapping menus,mnemonics (shortcuts) and action commands

// : 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);   } } ///:~