【问题标题】:JavaFX InputMap/ActionMap equivalent?JavaFX InputMap/ActionMap 等价物?
【发布时间】:2017-07-31 12:25:21
【问题描述】:

我终于完全切换到 JavaFX。

我非常热衷于按键功能。

是否有与您在 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 用户熟悉所有这些东西,但就个人而言,作为键盘狂热者,我广泛使用此功能。

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

最终,对于 Swing,在幕后显然有一个非常复杂的机制,涉及击键被“传递”JComponent 对象的层次结构,直到它们被 InputMap“捕获”(或没有).. ..大概JavaFX中一定有这样的东西。有章有节就好了……

【问题讨论】:

  • 你在寻找类似this的东西吗?
  • @ToddSewell 谢谢...开始回答,是的...

标签: java swing user-interface javafx hotkeys


【解决方案1】:

在 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

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

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

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

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

【讨论】:

  • 谢谢...请查看我的更新。实际上,我没有发现该方法,因为我像个白痴一样(在 Javadoc 中)将 TextField 的继承 properties 的巨大列表误认为 methods
  • 不用担心。我已更新我的答案以提供有关事件传播的信息。如果总体而言,您认为此答案对您有所帮助,或者更重要的是,可以帮助将来访问此帖子的其他人,请考虑将其标记为已接受。干杯。
  • 有用的链接,去看看它散发出什么光芒。我当然会在适当的时候接受一个答案……但过早做这件事并不太好,因为“已回答”的问题会阻碍未来的潜在答案。当我在 SO 上回答 q 时,我对赞成、反对或确实接受没有任何期望。
  • 抱歉,迈克,我并不是要催你或暗示如果你不想接受我的回答,你就必须接受我的回答。我猜它出来错了。干杯。
【解决方案2】:

啊哈。

This question,从一年前开始,已经与 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 月左右发布,确切地说……但是尝试在谷歌上搜索 JavaFX 9 的 API Javadoc,我还看不到任何 com.sun.javafx.scene.control.inputmap.InputMap 的迹象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-07
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    相关资源
    最近更新 更多