因此,每当用户在我的Swing应用程序中的任何位置按下空格键时,我都想触发一个事件(暂停/取消暂停某些媒体)。
由于有太多的控件和面板可以有焦点,所以不可能将关键事件全部添加到它们中(更不用说总量了)。
所以我找到
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()
这太棒了,您可以注册全局按键预处理程序。不过,有一个主要问题——在输入字段、表单元格等中总是会键入空格,我显然不想触发暂停事件!
有什么想法吗?也许有一种方法可以全局检测光标是否集中在允许文本输入的东西上,而不必检查所有可编辑控件的列表(呕吐!)?
我想你自己也回答了——是的,我认为你可以找到当前有焦点的元素,如果它是某个字段类的实例,那么为了暂停事件,你可以忽略这个空间。如果它的接缝很重,不要担心,instanceof对JVM来说是非常快的(在任何情况下,你都在谈论人工规模的事件,这对处理器来说都是一个问题)。
我对Swing有些生疏,但我认为您应该尝试使用带有KEY_EVENT_MASK
的Toolkit.addAWTEventListener注册全局侦听器。然后,您可以根据AWTEvent处理的类型和来源对其进行筛选。
好的。。。我试着根据来源进行过滤。问题是我的可编辑组合框。。。它们是的实例
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;
}
});
它太恶心了,我讨厌它。我希望我能找到一种方法来检查按键是否已被任何组件占用——然后我只能在任何组件未执行按键时执行暂停事件。