2017-02-10 64 views
0

我正在尝试跟踪全局键事件,特别是正在按下的箭头键。对于这一点,我附加处理程序到当前活动场景:如果节点有焦点,某些关键事件不会到达场景

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

然而,虽然总是被检测封样,ctrl和标签最键,空格键和方向键只有在没有元素具有焦点工作。就是说,就像我在窗口中的任何地方点击一样,某些元素会获得焦点,按下空间或箭头不会再触发事件。通过CSS样式,我发现一旦场景被点击,总是存在一个焦点元素,并且在这种情况下上面的键停止工作。

我的猜测是,重点节点听重点事件,并拒绝如果它是空间或箭头泡沫。我的问题是:

  1. 为什么这些键被捕获?我没有看到任何UI组件都需要处理箭头键和空格键事件。
  2. 我可以防止节点窃取关键事件,即让它们始终冒泡吗?如果没有,是否有另一种检测按键的方法?
+1

您可以将事件过滤器添加到场景中,然后在滚动窗格消耗它们之前捕获按键事件。 –

回答

1

事实证明,事件并不是由单独关注的节点捕获的,而是包含所有这些事件的ScrollPane。它捕获那些按键以在必要时滚动视口,并且如果不能滚动则仍然不会冒泡。

正如在this answer中所解释的那样,可以通过使用ScrollPane#addEventFilter来改变这种行为,但应该注意不要以负面方式影响可用性。

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