如果节点具有焦点,则某些关键事件无法到达场景

时间:2017-02-10 20:07:48

标签: java javafx

我试图跟踪全局关键事件,特别是按下箭头键。为此,我将处理程序附加到当前活动的场景:

scene.setOnKeyPressed(event ->
        System.out.println("KEY PRESSED: " + event.getCode())
)

但是,虽然始终检测到大多数键,如字母,ctrl和tab,但空格和箭头键仅在没有元素具有焦点时起作用。也就是说,当我点击窗口中的任何位置时,某些元素会获得焦点并按下空格或箭头不会再触发该事件。通过CSS样式我发现,一旦点击场景,总会出现一个聚焦元素,在这种情况下上面的键停止工作。

我的猜测是,有针对性的节点会听取关键事件,如果有空格或箭头,则拒绝冒泡它们。我的问题是:

  1. 为什么要抓住这些钥匙?我没有看到任意UI组件必须始终处理箭头和空格键事件。
  2. 我可以阻止节点窃取关键事件,即让它们始终冒泡吗?如果没有,是否有另一种检测按键的方法?

1 个答案:

答案 0 :(得分:1)

事实证明,事件不是由单独聚焦的节点捕获的,而是ScrollPane包装所有事件。如有必要,它会捕获这些键以滚动视口,如果不能滚动,它仍然不会冒泡它们。

this answer中所述,可以使用ScrollPane#addEventFilter来改变此行为,但应注意不要以负面方式影响可用性。

从这个意义上讲,将箭头和空格保留为默认行为(滚动)并切换到不同的键可能会更好。