JMenu菜单项层级结构

wen java案例 2

本文目录导读:

JMenu菜单项层级结构

  1. 核心组件说明
  2. 代码示例
  3. 层级关系示意图
  4. 关键API
  5. 常见使用模式

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);

这个层级结构让菜单支持:

  • 无限制嵌套(虽然界面友好度有限)
  • 多种选择控件(复选框、单选、标准项)
  • 快捷键和助记符
  • 启用/禁用控制
  • 动态添加/移除

抱歉,评论功能暂时关闭!