本文目录导读:

我来为您详细介绍如何构建和添加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());
}
}
关键要点
- 层次结构:JMenuBar → JMenu → JMenuItem
- 快捷键:使用
setAccelerator()设置 - 分隔线:使用
addSeparator()添加 - 特殊菜单项:
JCheckBoxMenuItem:复选框JRadioButtonMenuItem:单选按钮- 子菜单:JMenu作为子菜单
这样可以构建功能完整、专业美观的菜单栏。