因此,每当用户在我的Swing应用程序中的任何位置按空格键时,我想触发一个事件(暂停/取消暂停某些媒体)。
由于有很多控件和面板可以集中注意力,因此无法向所有控件和面板添加关键事件(更不用说粗略)了。
所以我找到了
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()
这很棒,你可以注册全局按键预处理程序。但是有一个主要问题 - 在输入字段,表格单元格等中会一直输入空格,我显然不想触发暂停事件!
那么任何想法? 也许有办法全局检测光标是否专注于允许文本输入的内容,而无需检查所有可编辑控件的列表(呕吐!)?
答案 0 :(得分:2)
我认为你自己也回答了 - 是的我认为你可以找到当前具有焦点的元素,如果它是某个字段类的实例,则为了暂停事件的目的而忽略该空间。如果它接缝很重,请不要担心,对于JVM来说,instanceof是非常快的(并且无论如何你都在谈论对处理器来说是人类规模的事件)。
答案 1 :(得分:1)
我在Swing上生锈了,但我认为你应该尝试使用Toolkit.addAWTEventListener和KEY_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;
}
});
它完全粗暴,我讨厌它。 我希望我能找到一种方法来检查按键是否已被任何组件消耗 - 然后我只能在按键未被任何组件操作时执行暂停事件。