问题 为什么我们的Java应用程序不在辅助监视器上显示窗口?


我们有一个Java / Swing客户端已经存在了很多年。当我从XP迁移到Vista(客户端仅在Windows上运行)时,我注意到在我的辅助监视器上创建新窗口(通常是JFrame后代)时,窗口最初显示为空白,即不显示正常内容窗户,它只是一块坚固的灰色。如果我然后将该窗口拖到主监视器上,第二个窗口穿过监视器边界,它会正确绘制,我可以将其拖回辅助监视器。如果窗口是在主监视器上创建的,它总是完美地存在。我从来没有在XP上遇到过这个问题,仅限于Vista。我无法在Windows 7上轻松测试它,缺少双显示器Windows 7机器。

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


12905
2017-08-30 17:08


起源

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


答案:


检查视频驱动程序和 JRE 是最新的。 (可能有一个当前的JDK,但旧的JRE。)

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

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

还有其他选项详述 这里

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


15
2017-08-30 21:01



我更新了视频驱动程序并检查了JRE。不用找了。我添加了提到的两个JVM选项,问题就消失了。谢谢你的提示! - Morinar
真棒。这对我来说也适用于Win10上的第三方Java客户端。 - squillman