文本输入中的“全局”热键除外

时间:2016-03-31 00:38:13

标签: java swing user-interface

我正在开发一个具有许多不同窗口/框架/窗格/标签的大型应用程序,其中许多可能随时打开。需求调用一些热键,这些热键将焦点放在某个窗口中的某个选项卡上。我想避免为每个可能具有焦点的窗口/组件注册KeyListener;因此,我尝试了以下

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher(){
        @Override
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getKeyChar() == '-'){
                doTheThing();
                return false;
            }
            return false;
        }
    });

第一个“return false”允许该角色进入其他可能的消费者,例如文本输入字段。问题是代码仍然会触发,并且会将用户拉回到相关选项卡(如果它是同一窗口中的另一个选项卡,则可能会将其从正在执行的操作中拉出来。)

有没有办法让这个代码全局触发,除非它否则会进入文本面板? (也许是一种添加处理程序的方法,它将“最后”而不是“第一” - 所以它只会在没有其他东西消耗该事件的情况下触发?)

我对UI设计很陌生,如果这是一个愚蠢的问题,请致以道歉,并提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

尝试使用Intel manual并确定它是JTextComponent还是不是......

if (!(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() instanceof JTextComponent)) {
    //...
}

或其他一些