JavaFX InputMap / ActionMap等价?

我终于完全切换到了JavaFX。

我非常热衷于按键function。

你在Swing找到的(非常好的)有一个等效的热键架构吗? 它如何在JavaFX文本控制对象的情况下工作? 如果我看一下javafx.scene.control.TextInputControl我认为一切都会变得清晰。 当然也尝试使用谷歌搜索。

但我不是更聪明的人。 据推测,在编辑文本时,必须有一个最小击键绑定源? 它是否同样等级?

使用Swing,每个JComponent都可以使用1个ActionMap和3个InputMaps (所有这些都可以使用“祖先”映射)。 3个InputMap “类型”由JComponent常量WHEN_FOCUSEDWHEN_IN_FOCUSED_WINDOWWHEN_ANCESTOR_OF_FOCUSED_COMPONENT确定,它们是非常不言自明的名称。 我真的很想知道有多少Swing用户熟悉所有这些东西,但就个人而言,作为键盘狂热者,我广泛使用这个function。

能够使用setOnKeyPressed将键绑定附加到给定的javafx.scene.Node大概相当于使用WHEN_FOCUSED Swingfunction……但是我想知道其他两个类别呢? 它们是否在当前的JavaFX实现中缺席?

最后,使用Swing,在幕后显然有一个非常复杂的机制,包括击键被“传递”到JComponent对象的层次结构,直到它们被一个InputMap “抓住”(或者没有)…可能必须有一些东西在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有关,它揭示了com.sun.javafx.scene.control.inputmap.InputMap JavaFX中未来的存在……显然目前包com.sun.javafx.scene.control.inputmap不存在(在Java 8中)(除非我非常错误)。

提出这个问题的人,Kleopatra,是Java Swing的专家,现在可能是JavaFX。 我们看到Java 9的一些早期版本现在正在发生,即2017年3月,正是……但是我已经尝试用Google搜索Java JAVadoc for JavaFX 9,我还没有看到任何com.sun.javafx.scene.control.inputmap.InputMap迹象com.sun.javafx.scene.control.inputmap.InputMap