菜单组件
在GUI程序开发中,菜单是很常见的组件,利用Swing提供的菜单组件可以创建出多种样式的菜单,接下来重点对下拉式菜单和弹出式菜单进行介绍。
1.下拉式菜单
对于下拉式菜单,大家肯定很熟悉,因为计算机中很多文件的菜单都是下拉式的,如记事本的菜单。在Swing中,创建下拉式菜单需要使用三个组件:JmenuBar(菜单栏)、Jmenu(菜单)和JmenuItem(菜单项),以记事本为例,这三个组件在菜单中对应的位置如图1所示。

图1 菜单组件
在图1中,分别指出了菜单的三个组件,接下来针对这三个组件进行详细讲解。
(1)JMenuBar:JMenuBar表示一个水平的菜单栏,它用来管理一组菜单,不参与同用户的交互式操作。菜单栏可以放在容器的任何位置,但通常情况下会使用顶级容器(如JFrame、Jdialog)的setJMenuBar()方法将它放置在顶级容器的顶部。JMenuBar有一个无参构造方法,创建菜单栏时,只需要使用new关键字创建JMenubar对象即可。创建完菜单栏对象后,可以调用它的add(JMenu c)方法为其添加JMenu菜单。
(2)JMenu:JMenu表示一个菜单,它用来整合管理菜单项。菜单可以是单一层次的结构,也可以是多层次的结构。大多情况下,会使用JMenu(String text)构造函数创建JMenu菜单,参数text表示菜单上的文本内容。
JMenu中还有一些常用的方法,如表1所示。
表1 JMenu常用方法
| 方法声明 | 功能描述 | 
|---|---|
| JMenuItem add(JMenuItem menuItem) | 将菜单项添加到菜单末尾,返回此菜单项 | 
| void addSeparator() | 将分隔符添加到菜单的末尾 | 
| JMenuItem getItem(int pos) | 返回指定索引处的菜单项,第一个菜单项的索引为0 | 
| int getItemCount() | 返回菜单上的项数,菜单项和分隔符都计算在内 | 
| JMenuItem insert(JmenuItem menuItem,int pos) | 在指定索引处插入菜单项 | 
| void insertSeparator(int pos) | 在指定索引处插入分隔符 | 
| void remove(int pos) | 从菜单中移除指定索引处的菜单项 | 
| void remove(JMenuItem menuItem) | 从菜单中移除指定的菜单项 | 
| void removeAll() | 从菜单中移除所有的菜单项 | 
(3)JMenuItem:JMenuItem表示一个菜单项,它是菜单系统中最基本的组件。在创建JMenuItem菜单项时,通常会使用JMenumItem(String text)这个构造方法为菜单项指定文本内容。
JMenuItem继承自AbstractButton类,因此可以把它看成是一个按钮,如果使用无参的构造方法创建了一个菜单项,则可以调用从AbstractButton类中继承的setText(String text)方法和setIcon()方法为其设置文本和图标。
介绍完创建菜单所需的三个基本组件后,接下来通过一个案例来学习一下菜单组件的基本使用,如文件1所示。
文件1 Example16.java
 1    import javax.swing.*;
 2    public class Example16 {
 3        private static void createAndShowGUI() {
 4            // 1、创建一个JFrame容器窗口
 5            JFrame f = new JFrame("JFrame窗口");
 6            f.setSize(350, 300);
 7            f.setLocation(300, 200);
 8            f.setVisible(true);
 9            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 10            // 2、创建菜单栏组件JMenuBar
 11            JMenuBar menuBar = new JMenuBar(); 
 12            // 2.1、创建2个JMenu菜单组件,并加入JMenuBar中
 13            JMenu menu1 = new JMenu("文件(F)");
 14            JMenu menu2 = new JMenu("帮助(H)");
 15            menuBar.add(menu1);
 16            menuBar.add(menu2);
 17            // 2.2、创建2个JMenuItem菜单项组件,并加入JMenu中
 18            JMenuItem item1 = new JMenuItem("新建(N)");
 19            JMenuItem item2 = new JMenuItem("退出(X)");
 20            menu1.add(item1);
 21            menu1.addSeparator();   // 设置分隔符
 22            menu1.add(item2);
 23            // 2.3、分别创建2个JMenuItem菜单项监听器
 24            item1.addActionListener(e -> {
 25                // 创建一个JDialog弹窗
 26                JDialog dialog = new JDialog(f,"无标题",true);
 27                dialog.setSize(200, 100);
 28                dialog.setLocation(300, 200);
 29                dialog.setVisible(true);
 30                dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
 31            });
 32            item2.addActionListener(e -> System.exit(0));
 33            // 3、向JFrame窗口容器中加入JMenuBar菜单组件
 34            f.setJMenuBar(menuBar);
 35        }
 36        public static void main(String[] args) {
 37            // 使用SwingUtilities工具类调用createAndShowGUI()方法并显示GUI程序
 38            SwingUtilities.invokeLater(Example16::createAndShowGUI);
 39        }
 40    }运行结果如图2示。

图2 运行结果
文件1中,先定义了一个JFrame容器窗口,并使用顶级容器的setJMenuBar()方法向容器顶部添加了一个下拉式菜单JMenuBar,并在JMenuBar菜单栏中添加了2个菜单JMenu组件,在第一个菜单组件中添加了2个JMenuItem菜单项,同时为这两个菜单项注册了动作监听器,分别用来新建和退出窗口。
2.弹出式菜单
对于弹出式菜单,相信大家也不会陌生,在Windows桌面单击鼠标右键会出现一个菜单,这就是弹出式菜单。在Swing组件中,弹出式菜单可以用JPopupMenu来实现。
JPopupMenu弹出式菜单和下拉式菜单一样都通过调用add()方法添加JMenuItem菜单项,但它默认是不可见的,如果想要显示出来,则必须调用它的show(Component invoker,int x,int y)方法,该方法中的参数invoker表示JPopupMenu菜单显示位置的参考组件,x和y表示invoker组件坐标空间中的一个坐标,显示的是JPopupMenu菜单的左上角坐标。
接下来通过一个案例来演示一下JPopupMenu组件的用法,如文件1所示。
文件1 Example17.java
 1    import java.awt.event.*;
 2    import javax.swing.*;
 3    public class Example17 {
 4        private static void createAndShowGUI() {
 5            // 1、创建一个JFrame容器窗口
 6            JFrame f = new JFrame("JFrame窗口");
 7            f.setSize(300, 200);
 8            f.setLocation(300, 200);
 9            f.setVisible(true);
 10            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 11            // 2、创建JPopupMenu弹出式菜单
 12            JPopupMenu popupMenu = new JPopupMenu();
 13            // 2.1、创建两个JMenuItem菜单项,并加入到JPopupMenu组件中
 14            JMenuItem item1 = new JMenuItem("查看");
 15            JMenuItem item2 = new JMenuItem("刷新");
 16            popupMenu.add(item1);
 17            popupMenu.addSeparator();
 18            popupMenu.add(item2);
 19            // 3、为JFrame窗口添加鼠标事件监听器
 20            f.addMouseListener(new MouseAdapter() {
 21                public void mouseClicked(MouseEvent e) {
 22                    // 如果单击的是鼠标右键,显示JPopupMenu菜单
 23                    if (e.getButton() == MouseEvent.BUTTON3) {
 24                        popupMenu.show(e.getComponent(), e.getX(), e.getY());
 25                    }
 26                }
 27            });
 28        }
 29        public static void main(String[] args) {
 30            // 使用SwingUtilities工具类调用createAndShowGUI()方法并显示GUI程序
 31            SwingUtilities.invokeLater(Example17::createAndShowGUI);
 32        }
 33    }运行结果如图3所示。

图3 运行结果
在文件1中,首先定义了一个JFrame容器窗口,接着使用JPopupMenu创建并设置了一个弹出式菜单,并为该菜单添加了2个JMenuItem菜单项。由于JPopupMenu菜单默认情况下是不显示的,所以又为JFrame窗口注册了一个鼠标事件监听器,用于显示鼠标右键单击后的弹窗列表。










