2015-04-20 15:36:01 -07:00
|
|
|
//: gui/Menus.java
|
|
|
|
// Submenus, check box menu items, swapping menus,
|
|
|
|
// mnemonics (shortcuts) and action commands.
|
|
|
|
import javax.swing.*;
|
|
|
|
import java.awt.*;
|
|
|
|
import java.awt.event.*;
|
|
|
|
import static net.mindview.util.SwingConsole.*;
|
|
|
|
|
|
|
|
public class Menus extends JFrame {
|
|
|
|
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 {
|
2015-05-05 11:20:13 -07:00
|
|
|
@Override
|
2015-04-20 15:36:01 -07:00
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
|
|
JMenuBar m = getJMenuBar();
|
|
|
|
setJMenuBar(m == mb1 ? mb2 : mb1);
|
|
|
|
validate(); // Refresh the frame
|
|
|
|
}
|
|
|
|
}
|
|
|
|
class ML implements ActionListener {
|
2015-05-05 11:20:13 -07:00
|
|
|
@Override
|
2015-04-20 15:36:01 -07:00
|
|
|
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(String flavor : flavors)
|
|
|
|
if(s.equals(flavor))
|
|
|
|
chosen = true;
|
|
|
|
if(!chosen)
|
|
|
|
t.setText("Choose a flavor first!");
|
|
|
|
else
|
|
|
|
t.setText("Opening " + s + ". Mmm, mm!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
class FL implements ActionListener {
|
2015-05-05 11:20:13 -07:00
|
|
|
@Override
|
2015-04-20 15:36:01 -07:00
|
|
|
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 {
|
2015-05-05 11:20:13 -07:00
|
|
|
@Override
|
2015-04-20 15:36:01 -07:00
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
|
|
t.setText("Foo selected");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
class BarL implements ActionListener {
|
2015-05-05 11:20:13 -07:00
|
|
|
@Override
|
2015-04-20 15:36:01 -07:00
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
|
|
t.setText("Bar selected");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
class BazL implements ActionListener {
|
2015-05-05 11:20:13 -07:00
|
|
|
@Override
|
2015-04-20 15:36:01 -07:00
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
|
|
t.setText("Baz selected");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
class CMIL implements ItemListener {
|
2015-05-05 11:20:13 -07:00
|
|
|
@Override
|
2015-04-20 15:36:01 -07:00
|
|
|
public void itemStateChanged(ItemEvent e) {
|
|
|
|
JCheckBoxMenuItem target =
|
|
|
|
(JCheckBoxMenuItem)e.getSource();
|
|
|
|
String actionCommand = target.getActionCommand();
|
2015-05-05 11:20:13 -07:00
|
|
|
switch (actionCommand) {
|
|
|
|
case "Guard":
|
|
|
|
t.setText("Guard the Ice Cream! " +
|
|
|
|
"Guarding is " + target.getState());
|
|
|
|
break;
|
|
|
|
case "Hide":
|
|
|
|
t.setText("Hide the Ice Cream! " +
|
|
|
|
"Is it hidden? " + target.getState());
|
|
|
|
break;
|
|
|
|
}
|
2015-04-20 15:36:01 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
public Menus() {
|
|
|
|
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();
|
|
|
|
int n = 0;
|
|
|
|
for(String flavor : flavors) {
|
|
|
|
JMenuItem mi = new JMenuItem(flavor);
|
|
|
|
mi.addActionListener(fl);
|
|
|
|
m.add(mi);
|
|
|
|
// Add separators at intervals:
|
|
|
|
if((n++ + 1) % 3 == 0)
|
|
|
|
m.addSeparator();
|
|
|
|
}
|
|
|
|
for(JCheckBoxMenuItem sfty : safety)
|
|
|
|
s.add(sfty);
|
|
|
|
s.setMnemonic(KeyEvent.VK_A);
|
|
|
|
f.add(s);
|
|
|
|
f.setMnemonic(KeyEvent.VK_F);
|
2015-05-18 23:05:20 -07:00
|
|
|
for(JMenuItem file1 : file) {
|
2015-05-05 11:20:13 -07:00
|
|
|
file1.addActionListener(ml);
|
|
|
|
f.add(file1);
|
2015-04-20 15:36:01 -07:00
|
|
|
}
|
|
|
|
mb1.add(f);
|
|
|
|
mb1.add(m);
|
|
|
|
setJMenuBar(mb1);
|
|
|
|
t.setEditable(false);
|
|
|
|
add(t, BorderLayout.CENTER);
|
|
|
|
// Set up the system for swapping menus:
|
|
|
|
b.addActionListener(new BL());
|
|
|
|
b.setMnemonic(KeyEvent.VK_S);
|
|
|
|
add(b, BorderLayout.NORTH);
|
|
|
|
for(JMenuItem oth : other)
|
|
|
|
fooBar.add(oth);
|
|
|
|
fooBar.setMnemonic(KeyEvent.VK_B);
|
|
|
|
mb2.add(fooBar);
|
|
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
|
|
run(new Menus(), 300, 200);
|
|
|
|
}
|
|
|
|
} ///:~
|