从触发菜单栏项目停止AltGr?

时间:2017-01-17 17:03:09

标签: javafx

简介

每当我按下AltGr key时,我的MenuItem内的第一个MenuBar就会获得焦点。这绝不是一种想要的行为 - 尽管它似乎是MenuBar本身提供的默认行为。

这有点令人讨厌,因为我在Swedish keyboard - 意味着使用 AltGr 键调用[]{}。< / p>

问题

我想删除功能,而在键盘上按下 AltGr 时,MenuItem内的第一个MenuBar会被激活。

研究

像往常一样,我一直在浏览 Stackoverflow 以期找到答案 - 但徒劳无功。由于大多数 Stackoverflow 实际上没有使用瑞典语键盘布局,所以之前没有人遇到过这个问题,这真是不足为奇。

而且

也许有人要么在某个地方看过这样的帖子 - 在这种情况下,请将此标记为重复 - 在任何其他情况下,要么指出我和任何可能在正确的方向上遇到这个问题的人,或者只是回答这个问题问题有一个浅薄的例子。

2 个答案:

答案 0 :(得分:1)

我遇到了完全相同的问题,根据以上答案,我可以使用以下代码解决问题:

mainAnchorPane.addEventFilter(KeyEvent.KEY_PRESSED, e -> {
        if (e.isAltDown() || KeyCode.ALT_GRAPH == e.getCode()) {
            e.consume();
        }
    });

在我的环境中,当我按下AltGr时,事件报告按此确切顺序按下了Ctrl和AltGr按钮。我并不在意Ctrl,但是Alt令人讨厌,所以我用上面的代码杀死了我的两个Alt。

答案 1 :(得分:0)

查看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();
            }
        });

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

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

        if (e.getCode() == KeyCode.ALT_GRAPH)
        {
            e.consume();
            return;
        }
});

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