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