【问题标题】:How to differentiate left/right shift, ctrl, alt and enter keys in JavaFX?如何区分 JavaFX 中的左/右移、ctrl、alt 和输入键?
【发布时间】:2014-08-31 19:49:02
【问题描述】:

JavaFX 8 控制器如何判断 ShiftCtrlAltEnter 键是否位于在键盘的左侧还是右侧?

不幸的是,java.awt.event.KeyEvent 中的 getKeyLocation() 方法对于 javafx.scene.input.KeyEvent 类不存在。

我还尝试通过拦截 window.onkeydown 在 Javascript 中检查 event.location,但与 V8 或其他 JS 引擎不同,似乎 Nashorn 库不会区分它们并返回 DOM_KEY_LOCATION_STANDARD 无论密钥在哪里位于。

由于整体密钥捕获似乎非常糟糕(KeyEvent::getCode/keyText 方法中的不一致),我开始认为外部库将是必要的。 JavaFX(或Java)库中是否有解决方案,如果没有,可以在不同平台(Windows、Linux 和 Mac OS)上提供相同功能的轻量级库?

提前致谢!

更新

尝试使用 JavaFX + awt 组件(请参阅 suggestion below),但无法正常工作,因为 JavaFX 似乎提供并转换了事件 - 不正确。

尝试使用JNativeHook(他们recently moved),它几乎可以作为一种解决方法,但无法识别某些键,时间不精确并且实施起来有点尴尬,尤其是因为我无法为所有平台编译本机代码。许可条款也有点混乱(稳定版本的 GPL,在我的情况下不是一个选项,可能会转向 LGPL...)。

【问题讨论】:

    标签: java keyboard javafx javafx-8 keyboard-events


    【解决方案1】:

    据我所知,目前没有用于确定在 JavaFX 中按下了哪个物理键的 API。很难看出第三方库如何实现这一点,因为它必须以此类代码无法真正访问的方式拦截 JavaFX 的低级实现。

    如果这对您很重要,我建议您通过 https://javafx-jira.kenai.com/ 提交功能请求

    【讨论】:

    • 与此同时,我发现了 JNativeHook,我迫不及待地想试一试。感谢您的链接,我可能应该报告关键事件系统的不稳定和不完整的行为。
    • 请提交错误报告。 JavaFX 团队对错误报告和功能请求做出了很好的回应。
    • 我做到了。还注意到他们没有在事件上实现任何时间戳(getWhen),这对于该框架来说几乎是不可行的。恐怕我必须切换到 .NET 并等到 JavaFX 成熟(希望 Java 8 也成熟),然后再考虑支持多平台:(
    • 你能发布一个指向 jira 请求的链接吗?
    【解决方案2】:

    我建议只使用java.awt,因为它可以完美地满足您的需求。它非常轻量级,更重要的是,它提供对 Windows、Linux 和 Mac OS 的支持。你可以找到一个简单的例子here

    我认为最有帮助的一点是,它确实通过KEY_LOCATION_RIGHTKEY_LOCATION_LEFT 提供了左右之间的区别,如here 中提到的文档中所述

    例如:getKeyCode 可能会返回VK_SHIFT,然后getKeyLocation 可能会返回KEY_LOCATION_RIGHT,这显然表明按下了右Shift 键,此时您可以执行任何您需要执行的操作。

    祝你好运!

    【讨论】:

    • 这是一种想法,尽管 JavaFX 中的行为不支持 getKeyLocation,但返回值始终为 KEY_LOCATION_UNKNOWN。他们在 Java 8 上确实做得很好;)此外,我并不热衷于将 JavaFX 与 Awt 混合使用——如果可行的话,可以作为一种解决方法,但显然情况并非如此。
    猜你喜欢
    • 2016-03-14
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多