【问题标题】:Handle keypress in java (globally)在java中处理按键(全局)
【发布时间】:2013-06-11 21:49:49
【问题描述】:

我尝试了处理按键的常用方法:实现 KeyListener 并覆盖 keyPressed()。但是有很多swing组件,如果我在一个combobox上,combobox“认为”关键是他。我想主应用程序捕获按键,如何?

【问题讨论】:

  • 你的意思是向所有组件添加相同的行为?例如当你按右箭头转移焦点时??
  • 类似的东西 :) 捕获所有按键事件,无论是否有任何组件处于焦点
  • 我找到了最简单的解决方案:stackoverflow.com/questions/12434740/…

标签: java swing keylistener key-bindings key-events


【解决方案1】:

你正在寻找这个Key Bindings

【讨论】:

  • 是的,解决方案将与键绑定有关。但是,如果他有一个有焦点的JTextField,而您想要全局响应 Ctrl+C 怎么办?该教程没有帮助。请参阅下面的答案,了解如何执行此类操作。
【解决方案2】:

你可以使用:

KeyEventPostProcessor kepp = new KeyEventPostProcessor() {
  @Override 
  boolean postProcessKeyEvent(KeyEvent e) {
     // handle key event globally
  }
};

KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
kfm.addKeyEventPostProcessor(kepp);

【讨论】:

  • "在所有未使用 KeyEvents的最终分辨率中与当前KeyboardFocusManager合作。"可能对他的需求没有用处。
  • Javadoc 有点误导。重要的一句话是:“通常,KeyEvent 后处理将用于实现需要全局 KeyEvent 后处理的功能,例如菜单快捷方式。”
  • 这两个陈述不一定矛盾。它是如何误导的?
  • 在我看来这是一种误导,因为您引用的句子听起来像是只接收 JComponent 未使用的 KeyEvents。然而事实并非如此。
  • 我做了一个测试,证明你是对的。我不明白。该文档并没有太大的误导性,因为它是错误
【解决方案3】:

这比你想象的要难。例如,here's the effort you have to put in to get this working on a Panel with a JFileChooser in it. 这是我过去问过的类似问题。我认为这将帮助您解决问题。您应该阅读给出的两个答案,因为它们都是有效的。

总而言之,您必须迭代所有 InputMap 和 InputMap 的父级,并清除您想要全局使用的键。然后将您的操作应用于 KeyMap。

你需要这个:

private static void clearInputMap(InputMap inputMap) {
    inputMap.clear();
    while ((inputMap = inputMap.getParent()) != null) {
        inputMap.clear();
    }
}

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多