java - 如果节点具有焦点,某些关键事件不会到达场景

标签 java javafx

我正在尝试跟踪全局按键事件,特别是按下的箭头键。为此,我将一个处理程序附加到当前 Activity 的场景:

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

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

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

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

最佳答案

事实证明,事件不是由单独聚焦的节点捕获的,而是由包裹所有事件的 ScrollPane 捕获的。它会捕获这些键以在必要时滚动视口(viewport),并且如果无法滚动,仍然不会使它们冒泡。

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

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

关于java - 如果节点具有焦点,某些关键事件不会到达场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42167830/

相关文章:

Java 在进程中执行某事

java - Spring - RestTemplate 调用 https rest 服务时出错(证书错误)

javafx - 如何在 javafx-8 的 FXML 文件中绑定(bind)我自己的组件的自定义属性?

Java webstart字符编码问题

javafx i18n : "No resources specified" exception

java - 在自定义 JavaFX FXML 控件上添加特定节点列表

java - 什么是NullPointerException,我该如何解决?

java - Android 增强现实应用程序从屏幕点转换列表位置

java - 是否可以使用过滤器查看整个 REST 请求正文/有效负载

java - 将语言从英语更改为荷兰语