我正在尝试将键盘快捷键添加到现有的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中也可以正常工作。
我的问题是:
焦点子系统如何决定使用KeyboardFocusManager
?是否有类似getCurrentKeyboardFocusManager().isItBlank()
或以编程方式检查其内容的任何方式?
不幸的是,该项目是相当模块化的,我无法在我的“swing包”中定义键盘快捷键的操作,因为我的“Main”包导入了“Swing”而Java不喜欢循环依赖;如果不是我可以为每个子对象定义键盘管理器,包括单独的Jviewer,但我不能!是否有要设置的属性,以便给定窗口中的所有组件都使用相同的KeyboardFocusManager
?
仅供参考,Maven版本:3.2.5并使用与我的IDE相同的Java JDK。
答案 0 :(得分:0)
可以通过清除全局焦点所有者来解决焦点管理器问题:
KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();