Linux 中的全屏 Swing 框架无法正确对焦(Windows 很好)
Posted
技术标签:
【中文标题】Linux 中的全屏 Swing 框架无法正确对焦(Windows 很好)【英文标题】:Fullscreen Swing frames not focusing correctly in Linux (Windows is fine) 【发布时间】:2011-10-03 19:09:14 【问题描述】:我有一个应用程序,它产生几个全屏无装饰帧(基本上控制所有屏幕空间)。我的问题是某些框架上的某些按钮被设计为“切换屏幕”,这基本上意味着显示另一个框架而不是当前框架。
我在 Windows 中使用这个很容易做到这一点:
target.setVisible(true);
target.requestFocus();
this.parent.setVisible(false);
target
是我要切换到的框架。这是可行的,因为最初,我将所有帧都设置为不可见,除了第一个“主”帧。
现在,当我将它移植到 Linux 环境中时,在更改帧时会出现难看的“闪烁”。在这一瞬间,我可以看到我的桌面背景以及我的应用程序后面存在的任何打开的窗口。我之前在 Windows 中遇到过这个问题,并通过在使旧框架不可见之前聚焦目标框架来修复它。
关于如何解决这个 Linux 特定问题的任何想法?
编辑:
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setUndecorated(true);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(0,0,screenSize.width, screenSize.height);
this.getContentPane().setLayout(null);
setVisible(true);
validate();
【问题讨论】:
请阅读[此线程][1] [1]:***.com/questions/6586064/… 谢谢,我去看看。 @mKorbel - 我不认为这正是我想要的。 OP 正在处理击键问题,他的问题与我的不完全相同。 whatsKeyStrokes
与 Focus
有关系,也许更多信息(实际上对于所有可能的事件都未完成)***.com/questions/309023/…,或者 OP
has some problem with set Focus
to the concrete JComponents
???
我有直接绘制到显卡的全屏框架,而不是窗口。问题不在于将焦点显式更改为框架,因为我可以在 Windows 环境中执行此操作。但是,我的代码在 Linux 中失败了。我在问为什么它在 Linux 中失败,我怎么不能让它在 Linux 中失败。
【参考方案1】:
target.requestFocus();
来自 JavaDocs:
请注意,不鼓励使用此方法,因为它的行为取决于平台。相反,我们建议使用
requestFocusInWindow()
。如果您想了解更多关于焦点的信息,请参阅 Java 教程中的部分How to Use the Focus Subsystem。
【讨论】:
【参考方案2】:CardLayout
可能是一个不错的单帧替代方案。您可以使用combo box 或buttons 或两者进行导航。
更新:这个example 导致在 Java 版本为 1.6.0_20 的 Ubuntu 10.04.3 LTS 上没有闪存。
【讨论】:
【参考方案3】:检查此线程以避免可能的内存不足,例如非常懒惰的重复,通过创建新的对象失去性能......等等
1/ 每个 Native OS assingned/adds available memory for JVM 略有不同且数量不同,有关详细信息,请使用一些 JProfiler(活动对象、变量、已用/可用内存、通过 GC'ing 回收内存)检查您的代码)
2/ 只创建一个 JFrame 和其他***容器将是 JDialog/JWindow, 不要创建大量的 JDialogs/JWindows,每次重用都通过删除所有 JComponents 更多信息here
3/ GPU 补丁和驱动程序的健康问题
【讨论】:
【参考方案4】:从 Java6 开始就有了 FullScreen API。考虑使用它: http://download.oracle.com/javase/tutorial/extra/fullscreen/index.html
【讨论】:
你能详细说明这可能有什么帮助吗?以上是关于Linux 中的全屏 Swing 框架无法正确对焦(Windows 很好)的主要内容,如果未能解决你的问题,请参考以下文章
Python:文本覆盖在所有窗口之上,包括 Linux 中的全屏