学科分类
目录
Java基础

菜单组件

在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窗口注册了一个鼠标事件监听器,用于显示鼠标右键单击后的弹窗列表。

点击此处
隐藏目录