java - "Global"文本输入中的热键除外

标签 java swing user-interface

我正在开发一个包含许多不同窗口/框架/ 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/

相关文章:

java - 在 CardLayout 中设置面板布局

java - 从线程框架上拆下面板

jquery - "Chaining"到可拖动调用以启用触摸功能

java - 编辑比较两个字符串之间的单词之间的距离

java - 如何捕获 JFrame/Swing 中的所有鼠标事件?

java - 使用 Java mouseClicked 事件处理程序来更改图标

java - 如何将一个 JPanel 的特定坐标绘制到另一个 JPanel 上

java - 静态引用 WebSecurityConfigurerAdapter 来获取随机 CSP 随机数哈希?

java - 为什么我的 HashSet 不允许我添加两个相同的实例,如果它们的 equals() 说它们是假的?

java - 如何将 java KeyStore 转换为 PKCS7 .p7b 文件?