MenuTest.java// Fig. 22.5-6: MenuTest.java
// Demonstrating menus.
import java.awt.Color;
import java.awt.Font;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JFrame;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.ButtonGroup;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
class MenuFrame extends JFrame
{
private final Color[] colorValues =
{Color.BLACK, Color.BLUE, Color.RED, Color.GREEN};
private final JRadioButtonMenuItem[] colorItems; // color menu items
private final JRadioButtonMenuItem[] fonts; // font menu items
private final JCheckBoxMenuItem[] styleItems; // font style menu items
private final JLabel displayJLabel; // displays sample text
private final ButtonGroup fontButtonGroup; // manages font menu items
private final ButtonGroup colorButtonGroup; // manages color menu items
private int style; // used to create style for font
// no-argument constructor set up GUI
public MenuFrame()
{
super("Using JMenus");
JMenu fileMenu = new JMenu("File"); // create file menu
fileMenu.setMnemonic('F'); // set mnemonic to F
// create About... menu item
JMenuItem aboutItem = new JMenuItem("About...");
aboutItem.setMnemonic('A'); // set mnemonic to A
fileMenu.add(aboutItem); // add about item to file menu
aboutItem.addActionListener(
new ActionListener() // anonymous inner class
{
// display message dialog when user selects About...
@Override
public void actionPerformed(ActionEvent event)
{
JOptionPane.showMessageDialog(MenuFrame.this,
"This is an example\nof using menus",
"About", JOptionPane.PLAIN_MESSAGE);
}
}
);
JMenuItem exitItem = new JMenuItem("Exit"); // create exit item
exitItem.setMnemonic('x'); // set mnemonic to x
fileMenu.add(exitItem); // add exit item to file menu
exitItem.addActionListener(
new ActionListener() // anonymous inner class
{
// terminate application when user clicks exitItem
@Override
public void actionPerformed(ActionEvent event)
{
System.exit(0); // exit application
}
}
);
JMenuBar bar = new JMenuBar(); // create menu bar
setJMenuBar(bar); // add menu bar to application
bar.add(fileMenu); // add file menu to menu bar
JMenu formatMenu = new JMenu("Format"); // create format menu
formatMenu.setMnemonic('r'); // set mnemonic to r
// array listing string colors
String[] colors = {"Black", "Blue", "Red", "Green"};
JMenu colorMenu = new JMenu("Color"); // create color menu
colorMenu.setMnemonic('C'); // set mnemonic to C
// create radio button menu items for colors
colorItems = new JRadioButtonMenuItem[colors.length];
colorButtonGroup = new ButtonGroup(); // manages colors
ItemHandler itemHandler = new ItemHandler(); // handler for colors
// create color radio button menu items
for (int count = 0; count < colors.length; count++)
{
colorItems[count] =
new JRadioButtonMenuItem(colors[count]); // create item
colorMenu.add(colorItems[count]); // add item to color menu
colorButtonGroup.add(colorItems[count]); // add to group
colorItems[count].addActionListener(itemHandler);
}
colorItems[0].setSelected(true); // select first Color item
formatMenu.add(colorMenu); // add color menu to format menu
formatMenu.addSeparator(); // add separator in menu
// array listing font names
String[] fontNames = {"Serif", "Monospaced", "SansSerif"};
JMenu fontMenu = new JMenu("Font"); // create font menu
fontMenu.setMnemonic('n'); // set mnemonic to n
// create radio button menu items for font names
fonts = new JRadioButtonMenuItem[fontNames.length];
fontButtonGroup = new ButtonGroup(); // manages font names
// create Font radio button menu items
for (int count = 0; count < fonts.length; count++)
{
fonts[count] = new JRadioButtonMenuItem(fontNames[count]);
fontMenu.add(fonts[count]); // add font to font menu
fontButtonGroup.add(fonts[count]); // add to button group
fonts[count].addActionListener(itemHandler); // add handler
}
fonts[0].setSelected(true); // select first Font menu item
fontMenu.addSeparator(); // add separator bar to font menu
String[] styleNames = {"Bold", "Italic"}; // names of styles
styleItems = new JCheckBoxMenuItem[styleNames.length];
StyleHandler styleHandler = new StyleHandler(); // style handler
// create style checkbox menu items
for (int count = 0; count < styleNames.length; count++)
{
styleItems[count] =
new JCheckBoxMenuItem(styleNames[count]); // for style
fontMenu.add(styleItems[count]); // add to font menu
styleItems[count].addItemListener(styleHandler); // handler
}
formatMenu.add(fontMenu); // add Font menu to Format menu
bar.add(formatMenu); // add Format menu to menu bar
// set up label to display text
displayJLabel = new JLabel("Sample Text", SwingConstants.CENTER);
displayJLabel.setForeground(colorValues[0]);
displayJLabel.setFont(new Font("Serif", Font.PLAIN, 72));
getContentPane().setBackground(Color.CYAN); // set background
add(displayJLabel, BorderLayout.CENTER); // add displayJLabel
} // end MenuFrame constructor
// inner class to handle action events from menu items
private class ItemHandler implements ActionListener
{
// process color and font selections
@Override
public void actionPerformed(ActionEvent event)
{
// process color selection
for (int count = 0; count < colorItems.length; count++)
{
if (colorItems[count].isSelected())
{
displayJLabel.setForeground(colorValues[count]);
break;
}
}
// process font selection
for (int count = 0; count < fonts.length; count++)
{
if (event.getSource() == fonts[count])
{
displayJLabel.setFont(
new Font(fonts[count].getText(), style, 72));
}
}
repaint(); // redraw application
}
} // end class ItemHandler
// inner class to handle item events from checkbox menu items
private class StyleHandler implements ItemListener
{
// process font style selections
@Override
public void itemStateChanged(ItemEvent e)
{
String name = displayJLabel.getFont().getName(); // current Font
Font font; // new font based on user selections
// determine which CheckBoxes are checked and create Font
if (styleItems[0].isSelected() &&
styleItems[1].isSelected())
font = new Font(name, Font.BOLD + Font.ITALIC, 72);
else if (styleItems[0].isSelected())
font = new Font(name, Font.BOLD, 72);
else if (styleItems[1].isSelected())
font = new Font(name, Font.ITALIC, 72);
else
font = new Font(name, Font.PLAIN, 72);
displayJLabel.setFont(font);
repaint(); // redraw application
}
} // end class StyleHandler
} // end class MenuFrame
public class MenuTest
{
public static void main(String[] args)
{
MenuFrame menuFrame = new MenuFrame();
menuFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
menuFrame.setSize(500, 200);
menuFrame.setVisible(true);
}
} // end class MenuTest
Maintained by John Loomis, updated Mon Feb 27 11:26:01 2017