gpt4 book ai didi

java - 小程序 Java 7 更新 21 : Cannot set AWTKeyListener on default Toolkit

转载 作者:行者123 更新时间:2023-11-29 09:03:42 25 4
gpt4 key购买 nike

在我的自签名小程序(在不久的将来可能成为 CA 签名的小程序)中,我有一个相当复杂的 Swing GUI,我需要检测用户是否按下了 SHIFT 或 CONTROL 键。我将其与组件相关的 MouseEvents 和 MouseMotionEvents 结合使用,以随时进行特殊的鼠标事件处理。很快:

当我在不同的组件上收到鼠标移动事件时,我需要检测是否按住(按下)了 CONTROL 或 SHIFT。问题是,用户在将鼠标移动到感兴趣的组件之前会按下 shift/control。这才是我真正的“可用性”问题!

在 Java 7 update 21 之前,我能够使用添加到默认工具包中的 JVM 全局 AWTKeyListener 来完成此操作。这不再被允许(由于 Java 7 更新 21 的安全要求——尽管如此,我正在 JNLP 中——在一个不同的和独立的 JVM 中启动我的小程序,但这是另一个话题)。

那我有什么:

我试图在我的小程序的“主”面板上注册一个 KeyListener,但按键事件似乎被“吞没”了(被我的 GUI 中具有键盘焦点的任何组件)。

然后我尝试为我的主面板(顶级容器)使用键绑定(bind),为“shift”、“control”和“escape”添加绑定(bind)。唯一的绑定(bind)工作是“逃脱”,它总是命中我的“释放” Action 。 “Shift”和“control”永远不会被击中(通知)。我正在使用主面板的 WHEN_IN_FOCUSED_WINDOW 输入映射。

我需要在应用程序范围内(而非 JVM 范围内)检测键盘事件。我怎样才能做到这一点?是否可以通过其他方式在我的组件层次结构中的某个级别“拦截”键盘事件?

我不介意重写 Swing/AWT 方法来完成它 - 我只是急于找到解决方案。

我很感激任何建议,否则我会阻止客户将 Java 更新到 7 upd 21。谢谢!

阿隆

PS:为什么Java不支持“application”——全局资源。它适用于身份 validator 、 key 监听器、默认语言环境等。?它始终基于 JVM 全局,尽管我们(作为 applet 开发人员)仅在应用程序级别需要它。

最佳答案

您可以使用传递给您的事件的方法来确定修改键的当前状态。例如,event.isControlDown() 会告诉您在相关鼠标事件发生时控制键是否仍被按下。同样,您可以为 shift 键调用 event.isShiftDown()。

关于java - 小程序 Java 7 更新 21 : Cannot set AWTKeyListener on default Toolkit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16119539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com