3

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

由于有如此多的控件和面板可以具有焦点,因此实际上不可能将键事件都添加到它们中(更不用说粗略了)。

所以我发现

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()

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

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

4

3 回答 3

2

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

于 2008-11-05T09:45:29.277 回答
1

我对我的 Swing 生疏了,但我认为您应该尝试使用Toolkit.addAWTEventListenerKEY_EVENT_MASK. 然后,您可以根据 AWTEvent 处理的类型和来源对其进行过滤。

于 2008-11-05T18:29:25.210 回答
0

好的...好吧,我正在尝试根据来源进行过滤。问题是我的可编辑组合框...它们是 instanceof

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;
            }
        });

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

于 2008-11-05T22:52:17.317 回答