KeyboardFocusManager问题,Maven vs IDE构建

时间:2015-04-07 14:31:01

标签: java swing maven keyboardfocusmanager

我正在尝试将键盘快捷键添加到现有的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-tab键盘再次工作。在那之后,它工作正常。此外,这仅在第一次加载流时发生。

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

我的问题是:

  1. 导致问题的原因是什么?在呈现那些内部流JPanels之后,Jviewer不会“重新验证”吗?
  2. 为什么同样的构建在Windows中而不是在linux中工作?与LookAndFeel有关吗?
  3. 在Windows上,为什么IntelliJ构建工作正常并且Maven构建没有?他们似乎有不同的路径来查找库等。
  4. 焦点子系统如何决定使用KeyboardFocusManager?是否有类似getCurrentKeyboardFocusManager().isItBlank()或以编程方式检查其内容的任何方式?

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

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

1 个答案:

答案 0 :(得分:0)

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