0

我正在尝试将键盘快捷键添加到现有的 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. 但是,当我单击流视频按钮时,即。当 Jviewer 内部的 JPanel 首次渲染时,虽然相同的按钮和面板保持焦点,但键盘管理器突然停止工作。我将不得不单击 Jviewer 或 gui 工具(如按钮等)或 Tab-out,然后在程序中使用 tab-in 以使键盘再次工作。之后,它工作正常。此外,这只发生在第一次加载流时。

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

我的问题是:

  1. 是什么导致了问题?在呈现这些内部流 JPanel 之后,Jviewer 是否以某种方式没有“重新验证”?
  2. 为什么相同的构建在 Windows 中有效,而在 linux 中无效?与 LookAndFeel 有关吗?
  3. 在 Windows 上,为什么 IntelliJ 构建工作正常而 Maven 构建却不行?他们似乎确实有不同的路径来查找库等。
  4. 焦点子系统如何决定KeyboardFocusManager要使用的?有没有类似的东西:getCurrentKeyboardFocusManager().isItBlank()或以编程方式检查其内容的任何方式?

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

仅供参考,Maven 版本:3.2.5 并使用与我的 IDE 相同的 Java JDK。

4

1 回答 1

0

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

于 2015-04-21T12:59:52.890 回答