我正在尝试将键盘快捷键添加到现有的 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 中也可以正常工作。
我的问题是:
- 是什么导致了问题?在呈现这些内部流 JPanel 之后,Jviewer 是否以某种方式没有“重新验证”?
- 为什么相同的构建在 Windows 中有效,而在 linux 中无效?与 LookAndFeel 有关吗?
- 在 Windows 上,为什么 IntelliJ 构建工作正常而 Maven 构建却不行?他们似乎确实有不同的路径来查找库等。
焦点子系统如何决定
KeyboardFocusManager
要使用的?有没有类似的东西:getCurrentKeyboardFocusManager().isItBlank()
或以编程方式检查其内容的任何方式?不幸的是,该项目是相当模块化的,我无法在我的“swing 包”中定义键盘快捷键的操作,因为我的“主”包导入“Swing”并且 Java 不喜欢循环依赖;如果不是,我可以为每个子对象定义键盘管理器,包括单独的 Jviewer,但我不能!是否有要设置的属性,以便给定窗口中的所有组件都使用相同的
KeyboardFocusManager
?
仅供参考,Maven 版本:3.2.5 并使用与我的 IDE 相同的 Java JDK。