JavaFX InputMap/ActionMap 等效?

JavaFX InputMap/ActionMap equivalent?

我终于完全切换到 JavaFX。

我非常喜欢按键功能。

是否有与您在 Swing 中找到的(非常好的)热键体系结构等效的热键体系结构?它在 JavaFX 文本控件对象的情况下如何工作?我想如果我看一下 javafx.scene.control.TextInputControl,一切都会清楚的。当然也尝试了谷歌搜索。

但我 none 更聪明。大概必须有编辑文本时所需的最少击键绑定的来源?它是否具有类似的层次结构?

使用 Swing,每个 JComponent 可以使用 1 个 ActionMap 和 3 个 InputMaps(所有这些都可以有 "ancestor" 映射)。 3 InputMap "types" 由 JComponent 常量 WHEN_FOCUSEDWHEN_IN_FOCUSED_WINDOWWHEN_ANCESTOR_OF_FOCUSED_COMPONENT 决定,这些名称不言自明。我真的很想知道有多少 Swing 用户熟悉所有这些东西,但就个人而言,作为一个键盘狂热者,我广泛使用了这个功能。

能够使用 setOnKeyPressed 将键绑定附加到给定的 javafx.scene.Node 大概等同于使用 WHEN_FOCUSED Swing 功能...但是其他两个类别呢,我想知道?它们是否在当前的 JavaFX 实现中根本不存在?

最终,对于 Swing,在幕后显然有一个非常复杂的机制,涉及击键是 "passed up" JComponent 对象的层次结构,直到它们被 [="caught" 15=] (or not)...大概JavaFX中一定有类似这样的东西。有章有节就好了...

在 JavaFX 中,您可以为 KeyPressed 事件注册回调。

例如:

myTextField.setOnKeyPressed(event->{
    if (event.getCode() == KeyCode.ENTER){
        //do something here
    }
}

如果您想注册一个全局组合键(例如,典型的 Ctrl-S 用于保存),您可以改为使用:

myScene.getAccellerators().put(
    new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN),
            () -> { /** save my work **/ }
    )

可用的 KeyCodeCombinations 列表:https://docs.oracle.com/javafx/2/api/javafx/scene/input/KeyCodeCombination.html

编辑(1):事件传播的工作原理

来自http://docs.oracle.com/javafx/2/events/processing.htm

事件传递过程包含以下步骤:

  • 目标选择
  • 路线建设
  • 事件捕获
  • 事件冒泡

啊哈。

,从一年前开始,已经与 Java 9 相关,揭示了 JavaFX 中 com.sun.javafx.scene.control.inputmap.InputMap 的未来存在......显然在此时此刻 包 com.sun.javafx.scene.control.inputmap 不存在(在 Java 8 中)(除非我大错特错)。

提出这个问题的人 Kleopatra 是 Java Swing 方面的专家,现在大概是 JavaFX 方面的专家。我们看到 Java 9 的一些早期版本发生在 2017 年 3 月左右,准确地说......但是已经尝试使用谷歌搜索 API Javadoc for JavaFX 9,我目前还看不到 com.sun.javafx.scene.control.inputmap.InputMap.

的任何迹象