在 GUI 程序中,菜单是很常见的组件,利用 Swing 提供的菜单组件可以创建处多种样式的菜单。接下来重点对下拉式菜单和弹出式菜单进行介绍。

1、下拉式菜单


对于下拉式菜单,计算机中很多文件的菜单都是下拉式的,如记事本的菜单。在 GUI 程序中,
创建下拉式菜单需要使用 3 个组件:JMenuBar(菜单栏)、JMenu(菜单)和 JMenuItem(菜单项)**。以记事本为例,这三个组件在菜单栏中对于的位置如下如所示。
QQ截图20200627112419.png
上图中分别指出了菜单的 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()_方法为其设置文本和图标。**

接下来通过一个案例来学习一下菜单的创建和使用,如下所示。

  1. import java.awt.event.*;
  2. import javax.swing.*;
  3. public class example22 extends JFrame{
  4. public example22(){
  5. JMenuBar menuBar = new JMenuBar(); //创建菜单栏
  6. this.setJMenuBar(menuBar); //将菜单栏添加到 JFrame 窗口中
  7. JMenu menu = new JMenu("操作"); //创建菜单
  8. menuBar.add(menu); //将菜单添加到菜单栏上、
  9. //创建两个菜单项
  10. JMenuItem item1 = new JMenuItem("弹出窗口");
  11. JMenuItem item2 = new JMenuItem("关闭");
  12. //为菜单项添加事件监听器
  13. item1.addActionListener(new ActionListener() {
  14. //创建一个 JDialog 窗口,设置为模态对话框
  15. JDialog dialog = new JDialog(example22.this, true);
  16. dialog.setTitle("弹出窗口");
  17. dialog.setSize(200, 200);
  18. dialog.setLocation(50, 50);
  19. dialog.setVisible(true);
  20. }
  21. });
  22. item2.addActionListener(new ActionListener() {
  23. public void actionPerformed(ActionEvent e) {
  24. System.exit(0);
  25. }
  26. });
  27. menu.add(item1); //将菜单项添加到菜单中
  28. menu.addSeparator(); //添加一个分隔符
  29. menu.add(item2);
  30. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  31. this.setSize(300, 300);
  32. this.setVisible(true);
  33. }
  34. public static void main(String[] args) {
  35. new example22();
  36. }
  37. }

运行程序后,会生成一个窗体,单击窗体中的“操作”菜单,如下图所示。
QQ截图20200627160810.png
上述代码块中,定义了一个继承自 JFrame 的 example22 类,使用该类创建了一个窗口,并在窗口的顶部添加了一个下拉式菜单。

创建和添加下拉式菜单,一般分为以下几个步骤

  1. 创建一个 JMenuBar 菜单栏对象,将其放置在 JFrame 窗口的顶部
  2. 创建 JMenu 菜单对象,将其添加到 JMenuBar 菜单栏中
  3. 创建 JMenuItem 菜单项,将其添加到 JMenu 菜单中

2、弹出式菜单

对于弹出式菜单,在 Windows 桌面单击鼠标右键会出现一个菜单,那就是弹出式菜单。在 Java 的 Swing 组件中,弹出式菜单用 JPopupMenu 表示。

JPopupMenu 弹出式菜单和下拉式菜单一样,都通过调用 add()方法添加 JMenuItem 菜单项,但它默认是不可见的。如果想要显示出来,则必须调用它的 show(Component involer, int x, int y)方法。该方法中参数 **invoker 表示 JPopupMenu 菜单显示位置的参考组件x y 表示 invoker 组件坐标空间中的一个坐标,显示的是 JPopupMenu 菜单的左上角坐标**。

接下来通过一个案例来演示 JPopupMenu 组件的用法,如下所示。

  1. import java.awt.*;
  2. import java.awt.event.*
  3. import javax.swing.*;
  4. public class example23 extends JFrame{
  5. private JPopupMenu popupMenu;
  6. public example23() {
  7. //添加一个 JPopuMenu 菜单
  8. popupMenu = new JPopupMenu();
  9. //创建三个 JMenuItem 菜单项
  10. JMenuItem refreshItem = new JMenuItem("refresh");
  11. JMenuItem createItem = new JMenuItem("create");
  12. JMenuItem exitItem = new JMenuItem("exit");
  13. //为 exitItem 菜单项添加事件监听器
  14. exitiItem.addActionListener(new ActionListener() {
  15. public void actionPerformed(ActionEvent e) {
  16. System.exit(0);
  17. }
  18. });
  19. //往 JPopupMenu 菜单添加菜单项
  20. popupMenu.add(refreshItem);
  21. popupMenu.add(createItem);
  22. popupMenu.addSeparator();
  23. popupMenu.add(exitItem);
  24. //为 JFrame 窗口添加 Clicked 鼠标事件监听器
  25. this.addMouseListener(new MouseAdapter() {
  26. public void mouseClicked(MouseEvent e) {
  27. //如果单击的是鼠标的右键,则显示 JPopupMenu 菜单
  28. if(e.getButton() == e.BUTTON3) {
  29. //popupMenu.show(example23.this, e.getX(), e.getY());
  30. popupMenu.show(e.getComponent(), e.getX(), e.getY());
  31. }
  32. }
  33. });
  34. this.setSize(300, 300);
  35. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  36. this.setVisible(true);
  37. }
  38. public static void main(String[] args) {
  39. new example23();
  40. }
  41. }

上述代码块中,定义了一个继承自 JFrame 的 example23 类。在 example23 中创建了一个 JPopupMenu 菜单,并为其添加了 refreshItem、createItem 和 exitItem 3 个 JMenuItem 菜单项。

当鼠标按下时,调用 MouseEvent 的 getButton()判断是否按下了鼠标的右键(BUTTON 3),如果是,就调用 JPopupMenu 的 show()方法将其显示,并将鼠标单击的坐标作为弹出菜单的左上角坐标。

点击运行,在生成的窗口内单击鼠标右键,如下图所示。
QQ截图20200703142802.png

当鼠标按下时,调用 MouseEvent 的 getButton()判断是否按下了鼠标的右键(BUTTON 3),如果是,就调用 JPopupMenu 的 show()方法将其显示,并将鼠标单击的坐标作为弹出菜单的左上角坐标。