我正在开发一个包含许多不同窗口/框架/ Pane /选项卡的大型应用程序,其中许多可能随时打开。要求调用一些热键,将焦点放在特定窗口中的特定选项卡上。我想避免在每个可能具有焦点的窗口/组件上注册一个 KeyListener;因此,我尝试了以下操作
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher(){
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getKeyChar() == '-'){
doTheThing();
return false;
}
return false;
}
});
第一个“return false”允许该字符传递给其他可能的消费者,例如文本输入字段。问题是代码仍然会触发,并且会将用户猛拉回有问题的选项卡(如果是同一窗口中的另一个选项卡,则可能会使他们离开他们正在做的事情。)
有没有办法让这段代码在全局范围内触发,除非它会进入文本面板? (也许是一种添加处理程序的方法,使其成为“最后”而不是“第一个” - 所以它只会在没有其他东西消耗该事件时触发?)
我是 UI 设计的新手,如果这是一个愚蠢的问题,我深表歉意,在此先感谢您的帮助。
最佳答案
尝试使用 KeyboardFocusManager#getFocusOwner
并确定它是否为 JTextComponent
...
if (!(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() instanceof JTextComponent)) {
//...
}
或类似的
关于java - "Global"文本输入中的热键除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36322228/