全屏摇摆框架在Linux下无法正确聚焦(Windows系统正常)

5
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个应用程序,它会生成几个全屏无装饰框架(基本上控制整个屏幕空间)。我的问题是,在某些框架上的某些按钮被设计为“切换屏幕”,这基本上意味着显示另一个框架而不是当前的框架。

在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
请阅读此帖子 - mKorbel
谢谢,我会看一下的。 - user623990
@mKorbel - 我不认为那正是我所寻找的。OP在处理按键时,他的问题并不完全与我的相同。 - user623990
我有全屏帧,直接绘制到显卡而非窗口。问题不在于明确将焦点更改为帧,因为我可以在Windows环境中做到这一点。然而,我的代码在Linux中失败了。我想知道为什么它在Linux中失败,并且如何避免在Linux中失败。 - user623990
你尝试过将 parent.setVisible(false); 延迟放入 SwingUtilities.invokeLater() 中吗?这样或许会有所帮助。 - jfpoilpret
显示剩余5条评论
4个回答

5
target.requestFocus();

从JavaDocs中:

请注意,不建议使用此方法,因为其行为取决于平台。相反,我们建议使用requestFocusInWindow()。如果您想了解有关焦点的更多信息,请参见如何使用焦点子系统,这是Java教程中的一节。


5

CardLayout 可能是一个不错的单框架替代方案。你可以使用 组合框按钮 或两者共同导航。

更新:这个 示例 在 Ubuntu 10.04.3 LTS 上使用 Java 版本 1.6.0_20 不会闪烁。


3

请查看此线程以避免可能的内存不足问题,例如非常慢的重绘、通过创建新对象等导致性能下降...

1/ 每个本地操作系统分配/添加给JVM的可用内存略有不同,具体信息可以使用一些JProfiler(活动对象、变量、已使用/可用内存、通过GC回收内存)来检查您的代码。

2/ 只创建一个JFrame和其他顶级容器将是JDialog/JWindow,不要创建大量的JDialogs/JWindows,每次重复使用时都要删除所有JComponents,更多信息请在此处查看

3/ GPU补丁和驱动程序健康问题。


1

你能详细说明一下这可能如何有帮助吗? - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接