在Java中捕获全局按键

在Java中捕获全局按键,java,global,keypress,Java,Global,Keypress,因此,每当用户在my Swing应用程序中的任意位置按下空格键时,我希望触发一个事件(暂停/取消暂停某些媒体) 因为有太多的控件和面板可以具有焦点,所以不可能将keyevents添加到所有控件和面板中(更不用说gross了) 所以我发现 KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher() 这太棒了,你可以注册全局按键预处理程序。不过有一个大问题-空格将一直在输入字段、表格单元格等中键入,我显

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

因为有太多的控件和面板可以具有焦点,所以不可能将keyevents添加到所有控件和面板中(更不用说gross了)

所以我发现

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()
这太棒了,你可以注册全局按键预处理程序。不过有一个大问题-空格将一直在输入字段、表格单元格等中键入,我显然不想触发暂停事件

有什么想法吗?
也许有一种方法可以全局检测光标是否集中在允许文本输入的内容上,而不必检查所有可编辑控件的列表(呕吐!)

我想你自己也回答了这个问题-是的,我想你可以找到有焦点的当前元素,如果它是某个字段类的实例,那么为了暂停事件,你可以忽略空格。如果它很重,不要担心,instanceof对于JVM来说非常快(而且在任何情况下,您都在谈论人类规模的事件,这些事件是处理器的eon)。

我对Swing有些生疏,但我认为您应该尝试使用
键事件掩码注册一个全局侦听器。然后,您可以根据其类型和源过滤AWTEvent处理

好的。。。 嗯,我试着根据来源进行过滤。问题是我的可编辑组合框。。。 它们是

javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField
由于BorderlessTextField是一个私有的内部类,我显然不能对它进行instanceof检查

想法

编辑: 好的,这样就行了

 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;
            }
        });
这太恶心了,我讨厌它。 我希望我能找到一种方法来检查按键是否被任何组件使用-然后我只能在按键没有被任何组件操作时执行暂停事件