JavaFX中如何为Menu(而非MenuItem)添加快捷键
问题1:ALT+F快捷键无法触发菜单展开
你当前的问题是给Menu设置了Accelerator,但Accelerator通常用于直接触发MenuItem的执行命令,而要展开菜单本身,应该用**助记符(Mnemonic)**才对,具体修复步骤:
- 把菜单文本改成
"&File",&符号会自动标记后面的F为助记符 - 必须给你的
Scene开启助记符解析:scene.setMnemonicParsing(true);(默认是关闭状态,手动开启后ALT+F才能生效) - 不需要给
Menu设置Accelerator,助记符会自动绑定ALT+对应字母的组合键来展开菜单
问题2:给菜单名称添加下划线样式
这个需求刚好可以和助记符设置结合实现:
- 在菜单文本里用
&标记需要带下划线的字母(比如"&File"会让F显示下划线) - 配合
scene.setMnemonicParsing(true),下划线会自动显示,同时还能支持ALT+对应字母的快捷键
完整代码示例
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCodeCombination; import javafx.scene.input.KeyCombination; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class MenuFixExample extends Application { @Override public void start(Stage stage) { // 创建File菜单,&标记F为助记符(自动带下划线) Menu fileMenu = new Menu("&File"); // 给菜单项设置快捷键(示例) MenuItem openItem = new MenuItem("&Open"); openItem.setAccelerator(new KeyCodeCombination(KeyCode.O, KeyCombination.CONTROL_DOWN)); fileMenu.getItems().add(openItem); MenuItem exitItem = new MenuItem("E&xit"); exitItem.setAccelerator(new KeyCodeCombination(KeyCode.X, KeyCombination.CONTROL_DOWN)); fileMenu.getItems().add(exitItem); // 组装菜单栏 MenuBar menuBar = new MenuBar(); menuBar.getMenus().add(fileMenu); // 构建场景 VBox root = new VBox(menuBar); Scene scene = new Scene(root, 350, 250); // 关键:启用助记符解析,否则&符号和ALT快捷键都不生效 scene.setMnemonicParsing(true); stage.setTitle("Menu Fix Demo"); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } }
额外注意
如果是MacOS系统,助记符的触发键会变成ALT+CTRL而非单纯的ALT,这是系统层面的差异,属于正常现象。
内容的提问来源于stack exchange,提问作者user5182503
相关产品推荐
相关产品推荐

