在我的自签名小程序(在不久的将来可能成为 CA 签名的小程序)中,我有一个相当复杂的 Swing GUI,我需要检测用户何时按下了 SHIFT 或 CONTROL 键。我将它与组件相关的 MouseEvents 和 MouseMotionEvents 结合使用,随时进行特殊的鼠标事件处理。不久:
当我在一个不同的组件上收到鼠标运动事件时,我需要检测是否按住(按下)了 CONTROL 或 SHIFT。问题是,用户将在他/她将鼠标移动到感兴趣的组件之前按下 shift/control。这是我真正的“可用性”问题!
在 Java 7 更新 21 之前,我能够使用我添加到默认工具包中的 JVM 全局 AWTKeyListener 来完成此操作。这不再被允许(由于 Java 7 更新 21 的安全要求——尽管如此,我正在 JNLP 在一个不同且独立的 JVM 中启动我的小程序,但这是另一个话题)。
那我有什么:
我试图用我的小程序的“主”面板注册一个 KeyListener,但键事件似乎被“吞下”(被我的 GUI 中具有键盘焦点的任何组件)。
然后我尝试为我的主面板(顶级容器)使用键绑定,为“shift”、“control”和“escape”添加绑定。唯一的绑定工作是“逃脱”,它总是会击中我的“释放”动作。“Shift”和“control”永远不会被击中(通知)。我正在使用我的主面板的 WHEN_IN_FOCUSED_WINDOW 输入图。
我需要在应用程序范围内(而不是在 JVM 范围内)检测键盘事件。我怎样才能做到这一点?是否可以通过其他方式在我的组件层次结构中的某个级别“拦截”键盘事件?
我不介意重写 Swing/AWT 方法来完成它——我只是绝望地寻找解决方案。
感谢任何建议,否则我会阻止客户将 Java 更新到 7 upd 21。谢谢!
阿隆
PS:为什么Java中不支持“应用程序”-全局资源。它适用于 Authenticators、Keylisteners、Default Locale 等。?尽管我们(作为 applet 开发人员)只在应用程序级别需要它,但它始终在 JVM 全局基础上。