在 GUI 程序中,菜单是很常见的组件,利用 Swing 提供的菜单组件可以创建处多种样式的菜单。接下来重点对下拉式菜单和弹出式菜单进行介绍。
1、下拉式菜单
对于下拉式菜单,计算机中很多文件的菜单都是下拉式的,如记事本的菜单。在 GUI 程序中,创建下拉式菜单需要使用 3 个组件:JMenuBar(菜单栏)、JMenu(菜单)和 JMenuItem(菜单项)**。以记事本为例,这三个组件在菜单栏中对于的位置如下如所示。
上图中分别指出了菜单的 3 个组件,接下来针对这 3 个组件进行详细的讲解。
(1)JMenuBar:JMenBar **表示一个水平的菜单栏,它用来管理菜单,不参与同用户的交互式操作。菜单栏可以放在容器的任何位置,但通常情况下会使用顶级窗口(如 JFrame、JDialog)的 _setJMenuBar(JMemuBar menuBar)_方法将它放置在顶级窗口的顶部。JMenuBar 有一个无参的构造方法,创建菜单栏时,只需要使用 new 关键字创建 JMenuBar 对象即可。创建完菜单栏对象后,可以调用它的_ add(JMemu c)_方法为其添加 JMenu 菜单。**
(2)JMenu:JMenu** 表示一个菜单,它用来整合管理菜单项。菜单可以是单一层次的结构,也可以是多层次的结构。大多情况下,会使用构造方法 _JMenu(String text)_创建 JMenu 菜单,其中的参数 text 表示菜单上的文本。
JMenu 中还有一些常用的方法,如下表所示。
| 方法声明 | 功能描述 |
|---|---|
| void JMenuItem add(JMenuItem menuItem) | 将菜单添加到菜单末尾,返回此菜单项 |
| void addSeparator() | 将分隔符添加到菜单的**末尾** |
| JMenuItem getItem(int pos) | 返回指定引索处的菜单项,第一个菜单项的引索为 0 |
| int getItemCount() | 返回菜单上的项数,菜单项和分隔符都计算在内 |
| void JMenuItem insert(JMenuItem menuItem, int pos) | 在指定引索处插入菜单项 |
| void insertSepartator(int pos) | 在指定引索处插入分隔符 |
| void remove(int pos) | 从菜单中移除指定引索处的菜单项 |
| void remove(JMenuItem menuItem) | 从菜单中移除指定的菜单项 |
| void removeall() | 从菜单中移除所有的菜单项 |
(3)JMenuItem:JMenuItem** 表示一个菜单项,它是菜单系统中最基本的组件。和 JMenu 菜单一样,在创建 JMenuItem 菜单项中,通常会使用构造方法_ JMenuItem(String text)_为菜单项指定文本内容。由于 JMenuItem 类是继承自 AbstractButton 类的,因此可以把它看成是一个按钮。如果使用无参的构造方法创建了一个菜单栏,则可以调用从 AbstractButton 类中继承的_ setText(String text)_方法和_ setIcon()_方法为其设置文本和图标。**
接下来通过一个案例来学习一下菜单的创建和使用,如下所示。
import java.awt.event.*;import javax.swing.*;public class example22 extends JFrame{public example22(){JMenuBar menuBar = new JMenuBar(); //创建菜单栏this.setJMenuBar(menuBar); //将菜单栏添加到 JFrame 窗口中JMenu menu = new JMenu("操作"); //创建菜单menuBar.add(menu); //将菜单添加到菜单栏上、//创建两个菜单项JMenuItem item1 = new JMenuItem("弹出窗口");JMenuItem item2 = new JMenuItem("关闭");//为菜单项添加事件监听器item1.addActionListener(new ActionListener() {//创建一个 JDialog 窗口,设置为模态对话框JDialog dialog = new JDialog(example22.this, true);dialog.setTitle("弹出窗口");dialog.setSize(200, 200);dialog.setLocation(50, 50);dialog.setVisible(true);}});item2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.exit(0);}});menu.add(item1); //将菜单项添加到菜单中menu.addSeparator(); //添加一个分隔符menu.add(item2);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setSize(300, 300);this.setVisible(true);}public static void main(String[] args) {new example22();}}
运行程序后,会生成一个窗体,单击窗体中的“操作”菜单,如下图所示。
上述代码块中,定义了一个继承自 JFrame 的 example22 类,使用该类创建了一个窗口,并在窗口的顶部添加了一个下拉式菜单。
创建和添加下拉式菜单,一般分为以下几个步骤
- 创建一个 JMenuBar 菜单栏对象,将其放置在 JFrame 窗口的顶部
- 创建 JMenu 菜单对象,将其添加到 JMenuBar 菜单栏中
- 创建 JMenuItem 菜单项,将其添加到 JMenu 菜单中
2、弹出式菜单
对于弹出式菜单,在 Windows 桌面单击鼠标右键会出现一个菜单,那就是弹出式菜单。在 Java 的 Swing 组件中,弹出式菜单用 JPopupMenu 表示。
JPopupMenu 弹出式菜单和下拉式菜单一样,都通过调用 add()方法添加 JMenuItem 菜单项,但它默认是不可见的。如果想要显示出来,则必须调用它的 show(Component involer, int x, int y)方法。该方法中参数 **invoker 表示 JPopupMenu 菜单显示位置的参考组件,x 和 y 表示 invoker 组件坐标空间中的一个坐标,显示的是 JPopupMenu 菜单的左上角坐标**。
接下来通过一个案例来演示 JPopupMenu 组件的用法,如下所示。
import java.awt.*;import java.awt.event.*import javax.swing.*;public class example23 extends JFrame{private JPopupMenu popupMenu;public example23() {//添加一个 JPopuMenu 菜单popupMenu = new JPopupMenu();//创建三个 JMenuItem 菜单项JMenuItem refreshItem = new JMenuItem("refresh");JMenuItem createItem = new JMenuItem("create");JMenuItem exitItem = new JMenuItem("exit");//为 exitItem 菜单项添加事件监听器exitiItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.exit(0);}});//往 JPopupMenu 菜单添加菜单项popupMenu.add(refreshItem);popupMenu.add(createItem);popupMenu.addSeparator();popupMenu.add(exitItem);//为 JFrame 窗口添加 Clicked 鼠标事件监听器this.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e) {//如果单击的是鼠标的右键,则显示 JPopupMenu 菜单if(e.getButton() == e.BUTTON3) {//popupMenu.show(example23.this, e.getX(), e.getY());popupMenu.show(e.getComponent(), e.getX(), e.getY());}}});this.setSize(300, 300);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}public static void main(String[] args) {new example23();}}
上述代码块中,定义了一个继承自 JFrame 的 example23 类。在 example23 中创建了一个 JPopupMenu 菜单,并为其添加了 refreshItem、createItem 和 exitItem 3 个 JMenuItem 菜单项。
当鼠标按下时,调用 MouseEvent 的 getButton()判断是否按下了鼠标的右键(BUTTON 3),如果是,就调用 JPopupMenu 的 show()方法将其显示,并将鼠标单击的坐标作为弹出菜单的左上角坐标。
点击运行,在生成的窗口内单击鼠标右键,如下图所示。
当鼠标按下时,调用 MouseEvent 的 getButton()判断是否按下了鼠标的右键(BUTTON 3),如果是,就调用 JPopupMenu 的 show()方法将其显示,并将鼠标单击的坐标作为弹出菜单的左上角坐标。
