JMenuBar菜单栏构建添加

wen java案例 1

本文目录导读:

JMenuBar菜单栏构建添加

  1. 基本结构
  2. 添加事件监听
  3. 高级功能示例
  4. 关键要点

我来为您详细介绍如何构建和添加JMenuBar菜单栏,包括完整示例:

基本结构

import javax.swing.*;
public class MenuExample {
    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("文件(F)");
        JMenu editMenu = new JMenu("编辑(E)");
        JMenu helpMenu = new JMenu("帮助(H)");
        // 3. 创建菜单项
        // 文件菜单项
        JMenuItem newItem = new JMenuItem("新建");
        JMenuItem openItem = new JMenuItem("打开");
        JMenuItem saveItem = new JMenuItem("保存");
        JMenuItem exitItem = new JMenuItem("退出");
        // 编辑菜单项
        JMenuItem cutItem = new JMenuItem("剪切");
        JMenuItem copyItem = new JMenuItem("复制");
        JMenuItem pasteItem = new JMenuItem("粘贴");
        // 帮助菜单项
        JMenuItem aboutItem = new JMenuItem("quot;);
        // 4. 添加菜单项到菜单
        fileMenu.add(newItem);
        fileMenu.add(openItem);
        fileMenu.add(saveItem);
        fileMenu.addSeparator(); // 添加分隔线
        fileMenu.add(exitItem);
        editMenu.add(cutItem);
        editMenu.add(copyItem);
        editMenu.add(pasteItem);
        helpMenu.add(aboutItem);
        // 5. 添加菜单到菜单栏
        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        menuBar.add(helpMenu);
        // 6. 设置菜单栏到窗口
        frame.setJMenuBar(menuBar);
        frame.setVisible(true);
    }
}

添加事件监听

// 文件菜单事件
exitItem.addActionListener(e -> System.exit(0));
newItem.addActionListener(e -> 
    JOptionPane.showMessageDialog(frame, "新建文件"));
openItem.addActionListener(e -> {
    JFileChooser fileChooser = new JFileChooser();
    int result = fileChooser.showOpenDialog(frame);
    if (result == JFileChooser.APPROVE_OPTION) {
        System.out.println("选择文件: " + fileChooser.getSelectedFile());
    }
});

高级功能示例

public class AdvancedMenuExample extends JFrame {
    private JTextArea textArea;
    public AdvancedMenuExample() {
        setTitle("高级菜单示例");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(600, 400);
        // 创建文本区域用于测试
        textArea = new JTextArea();
        add(new JScrollPane(textArea), BorderLayout.CENTER);
        // 构建完整菜单
        createMenuBar();
        setVisible(true);
    }
    private void createMenuBar() {
        JMenuBar menuBar = new JMenuBar();
        // 文件菜单
        JMenu fileMenu = createFileMenu();
        // 编辑菜单
        JMenu editMenu = createEditMenu();
        // 视图菜单
        JMenu viewMenu = createViewMenu();
        // 帮助菜单
        JMenu helpMenu = createHelpMenu();
        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        menuBar.add(viewMenu);
        menuBar.add(Box.createHorizontalGlue()); // 右对齐
        menuBar.add(helpMenu);
        setJMenuBar(menuBar);
    }
    private JMenu createFileMenu() {
        JMenu fileMenu = new JMenu("文件");
        // 使用图标
        JMenuItem newItem = new JMenuItem("新建", new ImageIcon("new.png"));
        JMenuItem openItem = new JMenuItem("打开");
        JMenuItem saveItem = new JMenuItem("保存");
        JMenuItem saveAsItem = new JMenuItem("另存为...");
        // 添加快捷键
        newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 
            InputEvent.CTRL_DOWN_MASK));
        openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, 
            InputEvent.CTRL_DOWN_MASK));
        saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, 
            InputEvent.CTRL_DOWN_MASK));
        // 事件处理
        newItem.addActionListener(e -> textArea.setText(""));
        openItem.addActionListener(e -> openFile());
        saveItem.addActionListener(e -> saveFile());
        // 子菜单
        JMenu recentMenu = new JMenu("最近打开");
        recentMenu.add(new JMenuItem("文件1.txt"));
        recentMenu.add(new JMenuItem("文件2.txt"));
        fileMenu.add(newItem);
        fileMenu.add(openItem);
        fileMenu.addSeparator();
        fileMenu.add(saveItem);
        fileMenu.add(saveAsItem);
        fileMenu.addSeparator();
        fileMenu.add(recentMenu);
        fileMenu.addSeparator();
        // 复选框菜单项
        JCheckBoxMenuItem autoSaveItem = new JCheckBoxMenuItem("自动保存");
        autoSaveItem.addActionListener(e -> {
            if (autoSaveItem.isSelected()) {
                System.out.println("自动保存已开启");
            }
        });
        fileMenu.add(autoSaveItem);
        fileMenu.addSeparator();
        JMenuItem exitItem = new JMenuItem("退出");
        exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 
            InputEvent.CTRL_DOWN_MASK));
        exitItem.addActionListener(e -> System.exit(0));
        fileMenu.add(exitItem);
        return fileMenu;
    }
    private JMenu createEditMenu() {
        JMenu editMenu = new JMenu("编辑");
        JMenuItem undoItem = new JMenuItem("撤销");
        JMenuItem redoItem = new JMenuItem("重做");
        JMenuItem cutItem = new JMenuItem("剪切");
        JMenuItem copyItem = new JMenuItem("复制");
        JMenuItem pasteItem = new JMenuItem("粘贴");
        JMenuItem selectAllItem = new JMenuItem("全选");
        // 添加快捷键
        undoItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, 
            InputEvent.CTRL_DOWN_MASK));
        redoItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, 
            InputEvent.CTRL_DOWN_MASK));
        cutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, 
            InputEvent.CTRL_DOWN_MASK));
        copyItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, 
            InputEvent.CTRL_DOWN_MASK));
        pasteItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, 
            InputEvent.CTRL_DOWN_MASK));
        // 事件处理
        cutItem.addActionListener(e -> textArea.cut());
        copyItem.addActionListener(e -> textArea.copy());
        pasteItem.addActionListener(e -> textArea.paste());
        selectAllItem.addActionListener(e -> textArea.selectAll());
        editMenu.add(undoItem);
        editMenu.add(redoItem);
        editMenu.addSeparator();
        editMenu.add(cutItem);
        editMenu.add(copyItem);
        editMenu.add(pasteItem);
        editMenu.addSeparator();
        editMenu.add(selectAllItem);
        return editMenu;
    }
    private JMenu createViewMenu() {
        JMenu viewMenu = new JMenu("视图");
        // 单选按钮菜单项组
        ButtonGroup fontSizeGroup = new ButtonGroup();
        JRadioButtonMenuItem smallFont = new JRadioButtonMenuItem("小字体");
        JRadioButtonMenuItem mediumFont = new JRadioButtonMenuItem("中字体", true);
        JRadioButtonMenuItem largeFont = new JRadioButtonMenuItem("大字体");
        fontSizeGroup.add(smallFont);
        fontSizeGroup.add(mediumFont);
        fontSizeGroup.add(largeFont);
        smallFont.addActionListener(e -> textArea.setFont(new Font("宋体", Font.PLAIN, 12)));
        mediumFont.addActionListener(e -> textArea.setFont(new Font("宋体", Font.PLAIN, 16)));
        largeFont.addActionListener(e -> textArea.setFont(new Font("宋体", Font.PLAIN, 20)));
        viewMenu.add(smallFont);
        viewMenu.add(mediumFont);
        viewMenu.add(largeFont);
        viewMenu.addSeparator();
        JCheckBoxMenuItem lineWrap = new JCheckBoxMenuItem("自动换行", true);
        lineWrap.addActionListener(e -> textArea.setLineWrap(lineWrap.isSelected()));
        viewMenu.add(lineWrap);
        return viewMenu;
    }
    private JMenu createHelpMenu() {
        JMenu helpMenu = new JMenu("帮助");
        JMenuItem aboutItem = new JMenuItem("quot;);
        aboutItem.addActionListener(e -> 
            JOptionPane.showMessageDialog(this, 
                "菜单示例程序\n版本 1.0", 
                "quot;, 
                JOptionPane.INFORMATION_MESSAGE));
        helpMenu.add(aboutItem);
        return helpMenu;
    }
    private void openFile() {
        JFileChooser fileChooser = new JFileChooser();
        int result = fileChooser.showOpenDialog(this);
        if (result == JFileChooser.APPROVE_OPTION) {
            try {
                File file = fileChooser.getSelectedFile();
                BufferedReader reader = new BufferedReader(new FileReader(file));
                textArea.read(reader, null);
                reader.close();
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this, "打开文件失败:" + ex.getMessage());
            }
        }
    }
    private void saveFile() {
        JFileChooser fileChooser = new JFileChooser();
        int result = fileChooser.showSaveDialog(this);
        if (result == JFileChooser.APPROVE_OPTION) {
            try {
                File file = fileChooser.getSelectedFile();
                BufferedWriter writer = new BufferedWriter(new FileWriter(file));
                textArea.write(writer);
                writer.close();
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this, "保存文件失败:" + ex.getMessage());
            }
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new AdvancedMenuExample());
    }
}

关键要点

  1. 层次结构:JMenuBar → JMenu → JMenuItem
  2. 快捷键:使用 setAccelerator() 设置
  3. 分隔线:使用 addSeparator() 添加
  4. 特殊菜单项
    • JCheckBoxMenuItem:复选框
    • JRadioButtonMenuItem:单选按钮
    • 子菜单:JMenu作为子菜单

这样可以构建功能完整、专业美观的菜单栏。

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