在Java中捕获全局按键

时间:2008-11-05 09:37:35

标签: java global keypress

因此,每当用户在我的Swing应用程序中的任何位置按空格键时,我想触发一个事件(暂停/取消暂停某些媒体)。

由于有很多控件和面板可以集中注意力,因此无法向所有控件和面板添加关键事件(更不用说粗略)了。

所以我找到了

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()

这很棒,你可以注册全局按键预处理程序。但是有一个主要问题 - 在输入字段,表格单元格等中会一直输入空格,我显然不想触发暂停事件!

那么任何想法? 也许有办法全局检测光标是否专注于允许文本输入的内容,而无需检查所有可编辑控件的列表(呕吐!)?

3 个答案:

答案 0 :(得分:2)

我认为你自己也回答了 - 是的我认为你可以找到当前具有焦点的元素,如果它是某个字段类的实例,则为了暂停事件的目的而忽略该空间。如果它接缝很重,请不要担心,对于JVM来说,instanceof是非常快的(并且无论如何你都在谈论对处理器来说是人类规模的事件)。

答案 1 :(得分:1)

我在Swing上生锈了,但我认为你应该尝试使用Toolkit.addAWTEventListenerKEY_EVENT_MASK注册一个全局监听器。然后,您可以根据其类型和来源过滤AWTEvent处理。

答案 2 :(得分:0)

好的... 好吧我试图根据来源过滤。问题是我的可编辑组合框... 他们是实例

javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField

由于BorderlessTextField是一个私有的内部类,我显然无法对它进行检查。

想法?

编辑: 好的,这样可行....

 KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(new KeyEventPostProcessor() {

            public boolean postProcessKeyEvent(KeyEvent e) {
                if (e.getID() == KeyEvent.KEY_PRESSED) {
                    Object s = e.getComponent();
                    if (!(s instanceof JTextField) &&
                        !(s instanceof JTable && ((JTable) s).isEditing())
                        ) {
                        music_player.pauseEvent();
                    }

                    //System.out.println(s.getClass().toString());
                }
                return true;
            }
        });

它完全粗暴,我讨厌它。  我希望我能找到一种方法来检查按键是否已被任何组件消耗 - 然后我只能在按键未被任何组件操作时执行暂停事件。