广告

Java图形菜单制作教程与代码实例(Swing/JavaFX实战案例)

Swing 菜单制作入门与实战

Swing 的菜单组件与结构

在 Swing 中,菜单系统由 JMenuBarJMenuJMenuItem 组成。JMenuBar 通常作为顶层容器附着到 JFrame 的顶部区域,通过 setJMenuBar 显式设置。

通过 JMenu 可以对菜单栏进行分组,JMenuItem 则是具体的可点击选项。事件处理 通过实现 ActionListener 或使用 lambda 表达式绑定至 JMenuItem 的操作。

另外,快捷键(Mnemonic)和 快捷键组合(Accelerator)可以提升使用体验。要注意语言和区域的本地化,确保菜单文本清晰易懂。

Java图形菜单制作教程与代码实例(Swing/JavaFX实战案例)

// Swing 示例:简单的菜单栏
import javax.swing.*;
import java.awt.event.*;public class SwingMenuDemo {public static void main(String[] args) {SwingUtilities.invokeLater(() -> {JFrame frame = new JFrame("Swing 菜单示例");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JMenuBar bar = new JMenuBar();JMenu fileMenu = new JMenu("文件");// Mnemonic: Alt+FfileMenu.setMnemonic('F');JMenuItem newItem = new JMenuItem("新建");newItem.addActionListener(e -> System.out.println("新建"));JMenuItem openItem = new JMenuItem("打开");openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));openItem.addActionListener(e -> System.out.println("打开"));JMenuItem exitItem = new JMenuItem("退出");exitItem.addActionListener(e -> System.exit(0));fileMenu.add(newItem);fileMenu.add(openItem);fileMenu.addSeparator();fileMenu.add(exitItem);bar.add(fileMenu);frame.setJMenuBar(bar);frame.setSize(400, 300);frame.setLocationRelativeTo(null);frame.setVisible(true);});}
}

JavaFX 菜单制作要点与示例

JavaFX 的菜单结构和控件

在 JavaFX 中,菜单条由 MenuBarMenuMenuItem 组成。MenuBar 通常放置在布局的顶部区域,并可通过场景图的节点树进行布局。

与 Swing 的事件模型不同,JavaFX 使用 EventHandler<ActionEvent>,通过 setOnAction 将处理逻辑绑定到 MenuItem键盘快捷键 通过 Accelerator 的等效概念在 JavaFX 的 KeyCombination 中实现。

另外,FXML 与代码式创建在 JavaFX 中同样常见,适合分层开发和 UI 设计分离。

// JavaFX 示例:简单的菜单条
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;public class JavaFXMenuDemo extends Application {@Overridepublic void start(Stage stage) {MenuBar menuBar = new MenuBar();Menu fileMenu = new Menu("文件");MenuItem newItem = new MenuItem("新建");newItem.setOnAction(e -> System.out.println("新建"));MenuItem openItem = new MenuItem("打开");openItem.setOnAction(e -> System.out.println("打开"));SeparatorMenuItem sep = new SeparatorMenuItem();MenuItem exitItem = new MenuItem("退出");exitItem.setOnAction(e -> stage.close());fileMenu.getItems().addAll(newItem, openItem, sep, exitItem);menuBar.getMenus().add(fileMenu);BorderPane root = new BorderPane();root.setTop(menuBar);Scene scene = new Scene(root, 400, 300);stage.setScene(scene);stage.setTitle("JavaFX 菜单示例");stage.show();}public static void main(String[] args) {launch(args);}
}

Swing 与 JavaFX 的对比与迁移要点

API 差异与迁移要诀

Swing 的 API 曾经更为成熟,布局与事件模型 直接;JavaFX 倾向于声明式和场景图,属性绑定FXML 提供了更高的灵活性。

在迁移时,关注点主要在于 事件对象类型控件命名空间 的变化,以及 键盘快捷键设置方式 的差异。务必使用相同的 UI 逻辑来避免用户混淆。

菜单的交互模式与可访问性

快捷键与键盘导航

设计应确保 Alt 与菜单可通过键盘打开,Accelerator 与快捷键组合应遵循操作系统约定。

通过在 JMenuMenuItem 设置 MnemonicAccelerator,提升无鼠标场景的可用性。

可访问性与国际化

文本标签、提示语应支持 国际化,并结合 屏幕阅读器友好描述,确保 辅助功能 不被忽略。

实战案例:简单文本编辑器的菜单实现

Swing 实现示例

该示例展示了一个最小文本编辑器的菜单结构,包含 新建打开保存退出 等项,核心在于 JTextArea 与菜单事件的联动。

在 Swing 中,JTextArea 提供文本区域,Document 与撤销重做可以通过额外的 UndoManager 实现。以下代码给出一个简化版本。

// Swing 文本编辑器菜单(简化版)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;public class SwingTextEditor {public static void main(String[] args) {SwingUtilities.invokeLater(() -> {JFrame f = new JFrame("Swing 文本编辑器");f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JTextArea textArea = new JTextArea();f.add(new JScrollPane(textArea), BorderLayout.CENTER);JMenuBar bar = new JMenuBar();JMenu file = new JMenu("文件");file.setMnemonic('F');JMenuItem newItem = new JMenuItem("新建");newItem.addActionListener(e -> textArea.setText(""));JMenuItem openItem = new JMenuItem("打开");openItem.addActionListener(e -> System.out.println("打开(示意)"));JMenuItem saveItem = new JMenuItem("保存");saveItem.addActionListener(e -> System.out.println("保存(示意)"));JMenuItem exitItem = new JMenuItem("退出");exitItem.addActionListener(e -> System.exit(0));file.add(newItem);file.add(openItem);file.add(saveItem);file.addSeparator();file.add(exitItem);bar.add(file);f.setJMenuBar(bar);f.setSize(600, 400);f.setLocationRelativeTo(null);f.setVisible(true);});}
}

JavaFX 实现示例

JavaFX 版本同样提供直观的菜单结构,且更易于与现代 UI 组件协同工作。下列代码展示了一个含有文本区域的文本编辑器菜单。

// JavaFX 文本编辑器菜单(简化版)
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;public class JavaFXTextEditor {@Overridepublic void start(Stage stage) {MenuBar menuBar = new MenuBar();Menu fileMenu = new Menu("文件");MenuItem newItem = new MenuItem("新建");newItem.setOnAction(e -> System.out.println("新建"));MenuItem openItem = new MenuItem("打开");openItem.setOnAction(e -> System.out.println("打开"));MenuItem saveItem = new MenuItem("保存");saveItem.setOnAction(e -> System.out.println("保存"));MenuItem exitItem = new MenuItem("退出");exitItem.setOnAction(e -> stage.close());fileMenu.getItems().addAll(newItem, openItem, saveItem, new SeparatorMenuItem(), exitItem);menuBar.getMenus().add(fileMenu);TextArea textArea = new TextArea();BorderPane root = new BorderPane(textArea, null, null, null, null);root.setTop(menuBar);stage.setScene(new Scene(root, 600, 400));stage.setTitle("JavaFX 文本编辑器");stage.show();}public static void main(String[] args) {launch(args);}
}

广告

后端开发标签