本文目录导读:

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);
这个层级结构让菜单支持:
- 无限制嵌套(虽然界面友好度有限)
- 多种选择控件(复选框、单选、标准项)
- 快捷键和助记符
- 启用/禁用控制
- 动态添加/移除
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播