在 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()方法将其显示,并将鼠标单击的坐标作为弹出菜单的左上角坐标。