KeyboardFocusManager 问题,Maven 与 IDE 构建

KeyboardFocusManager issue, Maven vs IDE build

我正在尝试向现有 Java 应用程序添加键盘快捷键。相关部分如下:

    public final class Main{        

    ...
    private MyKeyEventDispatcher keyDispatcher; /*implements KeyEventDispatcher*/
    ...
    KeyboardFocusManager manager =KeyboardFocusManager.getCurrentKeyboardFocusManager();
    keyDispatcher = new MyKeyEventDispatcher(this);
    manager.addKeyEventDispatcher(keyDispatcher);
    viewer = makeJViewer(); /*an extension of JPanel, which shows a video stream.*/
    ...
    }

现在,键盘焦点系统的工作方式与软件渲染的预期一致。但是,由于添加了 GL 渲染支持,行为有所不同。启动程序后,键盘管理器工作正常。 Main 的子对象具有焦点,焦点管理器的行为与 Main 中定义的一样。但是,当我单击 stream-video 按钮时,即。当 Jviewer 中的内部 JPanels 第一次渲染时,虽然相同的按钮和面板保持焦点,但键盘管理器突然停止工作。我将不得不单击 Jviewer 或 gui 工具(如按钮等)或 Tab-out,然后在程序中使用 Tab-in,键盘才能再次工作。之后,它工作正常。此外,这只会在第一次加载流时发生。

我还应该说,这种行为只发生在我的 windows 机器上,而 linux 机器可以很好地处理相同的 (maven) 构建。有趣的是,如果我在 JDK java 1.6.0.39 的 IntelliJ 构建环境中 运行 相同的程序,它在 windows 中也能正常工作。

我的问题是:

  1. 导致问题的原因是什么?在渲染那些内部流 JPanel 之后,Jviewer 是否以某种方式不 "revalidated"?
  2. 为什么相同的构建在 Windows 中有效而在 linux 中无效?与 LookAndFeel 有关?
  3. 关于 Windows,为什么 IntelliJ 构建可以正常工作而 Maven 构建不能?他们似乎确实有不同的路径来查找图书馆等。
  4. 焦点子系统如何决定使用KeyboardFocusManager?是否有类似的东西:getCurrentKeyboardFocusManager().isItBlank() 或以编程方式检查其内容的任何方式?

  5. 不幸的是,该项目是相当模块化的,我无法在我的 "swing package" 中定义键盘快捷键的操作,因为我的 "Main" 包导入 "Swing" 和Java 不喜欢循环依赖;如果不是,我可以为每个子对象定义键盘管理器,包括单独的 Jviewer,但我不能!是否可以设置 属性 以便给定 window 中的所有组件都使用相同的 KeyboardFocusManager?

仅供参考,Maven 版本:3.2.5 并使用与我的 IDE.

相同的 Java JDK

可以通过清除全局焦点所有者来解决焦点管理器问题: KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();