本文目录导读:

JMenu 菜单项(MenuItem)在 Swing 中的层级结构如下:
JMenuBar (菜单栏)
├── JMenu (一级菜单)
│ ├── JMenuItem (菜单项)
│ ├── JMenuItem (菜单项)
│ ├── JSeparator (分隔线)
│ ├── JCheckBoxMenuItem (带复选框)
│ ├── JRadioButtonMenuItem (带单选框)
│ └── JMenu (子菜单,可继续嵌套)
│ ├── JMenuItem
│ ├── JMenuItem
│ └── ...
├── JMenu (另一个一级菜单)
│ ├── JMenuItem
│ └── ...
└── ...
核心组件说明
JMenuBar
- 顶级容器,通常放在 JFrame 顶部
- 多个 JMenu 的集合
JMenu
- 可展开的菜单(含标题)
- 包含:JMenuItem、JSeparator、子 JMenu 等
- 可以无限嵌套(不推荐超过2-3层)
JMenuItem
- 实际可点击执行的菜单项
- 三种子类:
JMenuItem:标准项JCheckBoxMenuItem:复选框JRadioButtonMenuItem:单选框
JSeparator
- 分隔线,用于分组
代码示例
import javax.swing.*;
import java.awt.event.ActionEvent;
public class MenuDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("菜单层级示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
// 1. 创建菜单栏
JMenuBar menuBar = new JMenuBar();
// 2. 创建一级菜单:文件
JMenu fileMenu = new JMenu("文件");
fileMenu.setMnemonic('F'); // Alt+F
// 3. 添加菜单项
JMenuItem newItem = new JMenuItem("新建", 'N');
newItem.setAccelerator(KeyStroke.getKeyStroke("ctrl N"));
newItem.addActionListener((ActionEvent e) -> System.out.println("新建"));
JMenuItem openItem = new JMenuItem("打开", 'O');
openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));
// 分隔线
fileMenu.add(newItem);
fileMenu.add(openItem);
fileMenu.add(new JSeparator()); // 分隔线
JMenuItem exitItem = new JMenuItem("退出");
exitItem.addActionListener(e -> System.exit(0));
fileMenu.add(exitItem);
// 4. 创建一级菜单:编辑(含复选框和子菜单)
JMenu editMenu = new JMenu("编辑");
JCheckBoxMenuItem autoSave = new JCheckBoxMenuItem("自动保存", true);
editMenu.add(autoSave);
JRadioButtonMenuItem left = new JRadioButtonMenuItem("左对齐", true);
JRadioButtonMenuItem center = new JRadioButtonMenuItem("居中");
JRadioButtonMenuItem right = new JRadioButtonMenuItem("右对齐");
ButtonGroup alignGroup = new ButtonGroup();
alignGroup.add(left);
alignGroup.add(center);
alignGroup.add(right);
editMenu.add(new JSeparator());
editMenu.add(left);
editMenu.add(center);
editMenu.add(right);
// 5. 子菜单
JMenu subMenu = new JMenu("更多选项");
subMenu.add(new JMenuItem("选项A"));
subMenu.add(new JMenuItem("选项B"));
JMenuItem advancedItem = new JMenuItem("高级");
// 给菜单项添加子菜单(不常见做法)
editMenu.add(new JSeparator());
editMenu.add(subMenu); // 子菜单直接添加到父菜单
editMenu.add(advancedItem);
// 6. 添加到菜单栏
menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(new JMenu("帮助")); // 简化:直接添加空菜单
// 7. 设置到窗口
frame.setJMenuBar(menuBar);
frame.setVisible(true);
}
}
层级关系示意图
JMenuBar
├── "文件"
│ ├── "新建" (JMenuItem)
│ ├── "打开" (JMenuItem)
│ ├── ----------- (JSeparator)
│ └── "退出" (JMenuItem)
│
├── "编辑"
│ ├── ✓ 自动保存 (JCheckBoxMenuItem)
│ ├── ----------- (JSeparator)
│ ├── ○ 左对齐 (JRadioButtonMenuItem)
│ ├── ○ 居中 (JRadioButtonMenuItem)
│ └── ○ 右对齐 (JRadioButtonMenuItem)
│ ├── ----------- (JSeparator)
│ └── "更多选项" (JMenu - 子菜单)
│ ├── "选项A" (JMenuItem)
│ └── "选项B" (JMenuItem)
│
└── "帮助"
└── (等待添加)
关键API
| 组件 | 作用 | 常用方法 |
|---|---|---|
| JMenuBar | 菜单容器 | add(JMenu) |
| JMenu | 菜单(可展开) | add(JComponent), addSeparator(), setMnemonic(char) |
| JMenuItem | 菜单项 | addActionListener(...), setAccelerator(...), setEnabled(boolean) |
| JCheckBoxMenuItem | 复选框菜单项 | getState(), setState(boolean) |
| JRadioButtonMenuItem | 单选框菜单项 | 需与ButtonGroup搭配 |
| JSeparator | 分隔线 | 无特殊API |
| ButtonGroup | 单选组 | add(AbstractButton) |
常见使用模式
JMenu menu = new JMenu("操作");
menu.add(new JMenuItem("复制")); // 基础项
menu.addSeparator(); // 分隔
menu.add(new JCheckBoxMenuItem("只读")); // 选择项
menu.add(new JRadioButtonMenuItem("大")); // 单选,需加组
JMenu sub = new JMenu("更多"); // 子菜单
sub.add(new JMenuItem("子项1"));
menu.add(sub);
这个层级结构让菜单支持:
- 无限制嵌套(虽然界面友好度有限)
- 多种选择控件(复选框、单选、标准项)
- 快捷键和助记符
- 启用/禁用控制
- 动态添加/移除