阻止 AltGr 触发菜单栏项目?

D. *_*aro 5 javafx

介绍

每当我按下AltGr 键时,我MenuItem里面的第一个MenuBar就会收到焦点。这绝不是一种想要的行为——尽管它看起来好像是它本身提供的默认行为。MenuBar

这有点烦人,因为我使用的是瑞典语键盘——这意味着使用该键会调用[]和。{}AltGr

问题

我想,而首先删除功能MenuItemMenuBar顺利通过按下激活AltGr键盘上。

研究

像往常一样,我一直在浏览Stackoverflow,希望能找到答案——但徒劳无功。老实说,由于大多数Stackoverflow实际上并没有使用瑞典语键盘布局,因此之前没有人遇到过这个问题,这并不奇怪。

而且

也许有人在某处看到过这样的帖子——在这种情况下,把它标记为重复——在任何其他情况下,要么指出我和任何可能在正确方向上遇到这个问题的人,要么简单地回答这个问题有点肤浅的例子。

Nei*_*own 1

查看 MenuBarSkin 的构造函数,它添加了一个场景事件键处理程序,如果涉及 Alt 的任何按键在到达场景时未消耗,则该处理程序将聚焦菜单:

        // put focus on the first menu when the alt key is pressed
        scene.addEventHandler(KeyEvent.KEY_PRESSED, e -> {
            if (e.isAltDown()  && !e.isConsumed()) {
                firstMenuRunnable.run();
            }
        });
Run Code Online (Sandbox Code Playgroud)

我通过在窗口的主内容窗格上放置一个事件处理程序来解决此问题,该处理程序查找 ALT_GRAPH 的按键事件并使用它。由于我的处理程序位于场景处理程序之前,因此它应该防止触发菜单焦点行为。大致:

tabPane.addEventFilter(KeyEvent.KEY_PRESSED, e -> {

        if (e.getCode() == KeyCode.ALT_GRAPH)
        {
            e.consume();
            return;
        }
});
Run Code Online (Sandbox Code Playgroud)

我不确定 AltGr 是否总是显示为 ALT_GRAPH;我相信我已经看到它显示为 ALT 且 e.isControlDown() 为 true,但是如果您的菜单快捷方式都不涉及 Ctrl+Alt,您也可以使用该事件(我猜他们不会,因为它们会由 AltGr 触发,因为它映射到 Windows 上的 Ctrl+Alt)。