为什么我们的Java应用程序不能在第二个显示器上显示窗口?

12

我们有一个存在多年的Java/Swing客户端。当我从XP升级到Vista时(仅在Windows上运行客户端),我发现每当在我的辅助显示器上创建新窗口(通常是JFrame子类)时,该窗口最初会显示为空白,即不会显示窗口的正常内容,而是一块纯灰色的块。如果我将该窗口拖到主显示器上,它立即跨越监视器边界时就会正确地绘制自己,然后我可以将其拖回到副显示器上。如果该窗口在主显示器上创建,则始终完美存在。在XP上我从来没有遇到过这个问题,只出现在Vista上。由于缺少双显示器的Windows 7机器,我无法轻松测试它。

任何人有任何想法吗?这可能是已知的Java错误吗?我也正在运行最新的Java 1.6 SDK。


检查Java客户端是否实际被告知要重新绘制。 - Thorbjørn Ravn Andersen
你可以尝试使用GraphicsEnvironment类进行操作。这将允许你获取连接到计算机的所有监视器列表。 - Michael
我在我的游戏中遇到了类似的问题,如果我将窗口拖到我的辅助显示器上,它会变成白色,直到我将其拖回来。拖回来后,屏幕不再更新。 - 8bitslime
1个回答

16

检查视频驱动程序和JRE是否最新。 (有可能JDK是最新的,但是JRE是旧版本。)

Java会将缓冲委托给DirectDraw和/或Direct3D。您可以使用以下JVM选项禁用此功能:

  • -Dsun.java2d.d3d=false
  • -Dsun.java2d.noddraw=true

这里详细介绍了其他选项.

如果主监视器在辅助监视器的右侧,则辅助监视器上的屏幕位置将具有负X值。 (同样,如果辅助监视器在主监视器上方,则位置将具有负Y值。) 可能存在无法处理负值的代码。


我更新了视频驱动程序并检查了JRE,但没有任何变化。然后我添加了提到的两个JVM选项,问题就解决了。感谢您的提示! - Morinar
1
很棒。这对我在Win10上的第三方Java客户端也起作用了。 - squillman

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