目录
菜单是图形用户界面程序中最常用的一种组件。根据显示方式,菜单可分为下拉式菜单和弹出式菜单。菜单组件主要包括:菜单栏(JMenuBar)、下拉式菜单(JMenu)、菜单项(JMenuItem)和弹出式菜单(JPopupMenu)等。
1. 下拉式菜单
下拉式菜单是放置在菜单栏上的组件。菜单栏(JMenuBar)是窗口中的主菜单,可以包含一组下拉式菜单。菜单栏通过JMenuBar类来实现,其只有一个默认的构造方法。在JFrame等类顶层容器类中定义了setJMenuBar(JMenuBar menu)方法,可以将菜单栏放到窗口的上方,通过JMenuBar类的add(JMenu c)方法可以把菜单加入到菜单栏上。下拉式菜单是通过JMenu类来实现,下拉式菜单可以包含菜单或菜单项。JMenu类提供了setMnemonic(char mnemonic)方法来设置菜单的快捷键。可以使用JMenu类中定义的addSeparator()和insertSeparator(int index)方法在菜单项之间插入分隔符。
例如,下面代码创建菜单栏和下拉式菜单,并将菜单栏放到窗口上以及将下拉式菜单放到菜单栏上。
JFrame frame=new JFrame("菜单示例"); JMenuBar menuBar=new JMenuBar();//创建菜单栏 frame.setJMenuBar(menuBar);//将菜单栏放到窗口上 JMenu fileMenu=new JMenu("File");//创建File菜单 fileMenu.setMnemonic(KeyEvent.VK_F);//设置快捷键(Alt+F) menuBar.add(fileMenu);//将File菜单放到菜单栏上 JMenu editMenu=new JMenu("Edit");//创建Edit菜单 editMenu.setMnemonic(KeyEvent.VK_E);//设置快捷键(Alt+E) menuBar.add(editMenu);//将Edit菜单放到菜单栏上 JMenu newMenu=new JMenu("New");//创建New菜单 fileMenu.add(newMenu);//将New菜单放到File菜单上 |
如果将整个菜单系统看作是一棵树,那么菜单项就是这棵树的叶子,是菜单系统的最下一级。基本菜单项是由JMenuItem类来实现,其主要构造方法如下:
- JMenuItem(String text):创建一个显示文本的菜单栏。
- JMenuItem(Icon icon):创建一个显示图标的菜单栏。
- JMenuItem(String text, Icon icon):创建一个同时显示文本和图标的菜单栏。
- JMenuItem(String text, int mnemonic):创建一个显示文本和快捷键的菜单项。
其中,文本由参数text指定,图标由参数icon指定,快捷键由参数mnemonic指定。例如:
//创建菜单项 JMenuItem menuItem1=new JMenuItem("Java Project",KeyEvent.VK_J); JMenuItem menuItem2=new JMenuItem("Web Project",KeyEvent.VK_W); //将菜单项放到菜单上 newMenu.add(menuItem1); newMenu.add(menuItem2); |
可以使用JMenuItem类的setAccelerator(KeyStroke keystroke)方法设置菜单项的快捷键。KeyStroke是一个表示键盘操作的类,可以使用该类的静态方法getKeyStroke()设置相应的快捷键,其定义如下:
- public static KeyStroke getKeyStroke(char keyChar);
- public static KeyStroke getKeyStroke(int keyCodem, int modifiers);
例如:
//设置快捷键(J) menuItem1.setAccelerator(KeyStroke.getKeyStroke("J")); //设置快捷键(Ctr+W) menuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,ActionEvent.CTRL_MASK)); |
当菜单中的菜单项被选中时,将会触发一个ActionEvent事件,因此,需要为菜单项注册ActionListener事件监听器,以便对ActionEvent事件做出响应。
复选菜单项(JCheckBoxMenuItem)和单选菜单项(JRadioButtonMenuItem)是两种特殊的菜单项,它们与普通菜单项类似,可以显示文本和图标,但由于复选菜单项和单选菜单项具有选中和不选中状态,因此,在构造方法中可以用boolean型参数指定菜单的初始状态。当复选菜单项和单选菜单项的状态发生变化时,将会触发ItemEvent事件,因此,需要为复选菜单项和单选菜单项注册ItemListener事件监听器,以便捕获其状态的变化。
【例1】下拉式菜单的使用。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JMenuDemo extends JFrame implements ActionListener,ItemListener{
JMenuBar menuBar; //菜单栏
JMenu menu,subMenu; //菜单、子菜单
JMenuItem menuItem; //菜单项
JCheckBoxMenuItem checkBoxMenuItem;//复选菜单项
JRadioButtonMenuItem radioButtonMenuItem;//单项菜单项
JTextField textField;//文本框
public JMenuDemo() {
setTitle("下拉式菜单示例");
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
menuBar=new JMenuBar();//创建菜单栏
setJMenuBar(menuBar);//将菜单栏加入到窗口上
//创建文File菜单
menu=new JMenu("File");
menu.setMnemonic(KeyEvent.VK_F);//设置快捷键(ALt+F)
menuBar.add(menu);
//创建File菜单的New子菜单
subMenu=new JMenu("New");
menu.add(subMenu);
//创建Java Project菜单项
menuItem=new JMenuItem("Java Project",KeyEvent.VK_J);
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_J,
ActionEvent.CTRL_MASK)); //快捷键(Ctrl+J)
menuItem.addActionListener(this);//注册ActionListener事件监听器
subMenu.add(menuItem);//添加到New菜单上
//创建Web Project菜单项
menuItem=new JMenuItem("Web Project");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,
ActionEvent.CTRL_MASK)); //快捷键(Ctrl+D)
menuItem.addActionListener(this);//注册ActionListener事件监听器
subMenu.add(menuItem);//添加到New菜单上
//创建Open菜单项
menuItem=new JMenuItem("Open");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
ActionEvent.CTRL_MASK)); //快捷键(Ctrl+O)
menuItem.addActionListener(this);//注册ActionListener事件监听器
menu.add(menuItem);//添加到File菜单上
//创建File菜单的Exit菜单项
menuItem=new JMenuItem("Exit");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,
ActionEvent.CTRL_MASK)); //快捷键(Ctrl+E)
menuItem.addActionListener(this);//注册ActionListener事件监听器
menu.add(menuItem);
//创建文Edit菜单
menu=new JMenu("Edit");
menu.setMnemonic(KeyEvent.VK_E);
menuBar.add(menu);
//创建Undo菜单项
menuItem=new JMenuItem("Undo");
menu.add(menuItem);//添加到Edit菜单上
//创建Redo菜单项
menuItem=new JMenuItem("Redo");
menu.add(menuItem);//添加到Edit菜单上
menu.addSeparator();//加入分割线
//创建复选菜单项
checkBoxMenuItem=new JCheckBoxMenuItem("Smart Insert Mode");
checkBoxMenuItem.addItemListener(this);//注册ItemListener事件监听器
menu.add(checkBoxMenuItem);//添加到Edit菜单上
menu.addSeparator();//加入分割线
//创建单项菜单项
ButtonGroup group=new ButtonGroup();//创建按钮组
radioButtonMenuItem=new JRadioButtonMenuItem("Samll");
radioButtonMenuItem.addItemListener(this);//注册ItemListener事件监听器
menu.add(radioButtonMenuItem);//添加到Edit菜单上
group.add(radioButtonMenuItem);//添加到按钮组中
radioButtonMenuItem=new JRadioButtonMenuItem("Large");
radioButtonMenuItem.addItemListener(this);//注册ItemListener事件监听器
menu.add(radioButtonMenuItem);//添加到Edit菜单上
group.add(radioButtonMenuItem);//添加到按钮组中
textField=new JTextField();
add(textField,BorderLayout.SOUTH);
setVisible(true);
}
//实现ActionListener接口中的方法
public void actionPerformed(ActionEvent e) {
String command=e.getActionCommand();
textField.setText(command);
}
//实现ItemListener接口中的方法
public void itemStateChanged(ItemEvent e) {
JMenuItem menuItem=(JMenuItem)e.getSource();
String command=menuItem.getText();
int state=e.getStateChange();
if(state==ItemEvent.SELECTED) {
command+=" SELECTED";
}else if(state==ItemEvent.DESELECTED) {
command+=" DESELECTED";
}
textField.setText(command);
}
public static void main(String[] args) {
JMenuDemo frame=new JMenuDemo();
}
}
运行上述程序,生成的菜单结构如图1所示。由于快捷键的设置,按Ctr+J键,触发ActionEvent事件,引发actionPerformed(ActionEvent e)方法的执行,在窗口下方的文本框中显示Java Project,类似地,按Ctrl+W、Ctrl+O和Ctrl+E键,将会显示相应菜单项的文本信息。点击Edit菜单下的复选菜单项和单选菜单项,将触发ItemEvent事件,从而引发itemStateChanged(ItemEvent e)方法的执行,在窗口下方的文本框中显示菜单项文本+状态信息。
(a) | (b) |
图1. 下拉式菜单使用示例
2. 弹出式菜单
弹出式菜单(JPopupMenu)是一种相对独立的菜单,可根据需要显示在指定的位置,在弹出式菜单中可以添加菜单或菜单项。JPopupMenu类的构造方法如下:
- JPopupMenu():创建一个没有名称的弹出式菜单。
- JPopupMenu(String label):创建一个有指定名称的弹出式菜单。
一般来说,单击鼠标的右键可以触发一个弹出式菜单,如果希望在某一组件中弹出菜单,可以使用该组件的setComponentPopupMenu(JpopupMenu popup)方法,其中,popup是希望触发的弹出式菜单。
【例2】弹出式菜单的使用。
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
public class JPopupMenuDemo extends JFrame implements ActionListener{
JPopupMenu popupMenu=new JPopupMenu("PopupMenu");//创建弹出式菜单
JTextField textField=new JTextField();
JPanel panel=new JPanel();
JMenuItem menuItem;
public JPopupMenuDemo() {
setTitle("弹出式菜单示例");
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
//菜单项:Copy
menuItem=new JMenuItem("Copy");
menuItem.addActionListener(this);
popupMenu.add(menuItem);
//菜单项:Cut
menuItem=new JMenuItem("Cut");
menuItem.addActionListener(this);
popupMenu.add(menuItem);
//菜单项:Paste
menuItem=new JMenuItem("Paste");
menuItem.addActionListener(this);
popupMenu.add(menuItem);
panel.setComponentPopupMenu(popupMenu);//点击面板右键触发弹出式菜单
add(panel,BorderLayout.CENTER);
add(textField,BorderLayout.SOUTH);
setVisible(true);
}
//实现ActionListener接口中的方法
public void actionPerformed(ActionEvent e) {
String command=e.getActionCommand();
textField.setText(command);
}
public static void main(String[] args) {
JPopupMenuDemo frame=new JPopupMenuDemo();
}
}
运行上述程序,执行结果如图2所示。在窗口中间区域点击鼠标右键触发弹出式菜单,如图2(a)所示,点击相应的菜单项则会在窗口下方的文本框中显示菜单项的文本,如图2(b)所示。
(a) | (b) |
图2. 弹出式菜单使用示例