损坏的Java Swing窗口

我写的一个Java swing GUI程序的用户之一是有一个问题,主摆动窗口不能正确渲染到屏幕上,并且GUI冻结。 下面是他屏幕上的屏幕截图(顶部)和应该显示的底部(底部)的比较:

替代文字http://www.shapecollage.com/temp/SwingCorruption.jpg

他使用Java 1.6.0_13运行Windows XP SP3,他的显卡是带有双显示器设置的ATI X1600。

该程序(如果你想自己testing)在:
www.shapecollage.com/download.html

我有几千个用户,没有其他人报告这个错误,我已经在Windows XP上进行了彻底的testing。 任何计算都是在一个独立于常规GUI线程的线程中完成的,而且这个程序可以在许多其他计算机上工作,所以我不认为这是程序本身的问题,而是他的特定设置有问题。

有没有人在系统上看到过这种types的错误,或者对这个用户系统上可能会出现什么问题有任何build议,会导致这样的问题?

谢谢,
文森特

我们有一个非常类似的问题,通过更新图形驱动程序来解决这个问题。 这个问题可能来自双显示器的设置导致VRAM腐败,所以你的客户可能会尝试,如果只有一个显示器会更好。 虽然您可能预期Java不会非常依赖硬件,但我们的图形加强型应用程序在运行特定投影机类型时始终会导致蓝屏死机。

也许在Java和图形驱动程序和/或图形硬件之间存在一个有问题的交互。

有几个标志可以影响Java如何绘制到屏幕上 。

您可能想尝试使用以下任何标志启动应用程序:

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

这些标志切换OpenGL管道,使用Direct3D的转向和分别禁用DirectDraw的使用。

如果其中任何一个解决了你的问题,那么你可能会考虑用太阳提交一个Bug,因为这可能不是在这里有错误的应用程序。

我还没有看到特定类型的损坏的图形,但是当扩展显示控制面板中的硬件加速减少时,我发现Windows上的Java图形问题消失了。

Swing不是线程安全的,所以如果你在GUI线程以外的地方进行渲染,你可以期待这样的事情。

我看到像这样的图形损坏,但从来没有在Java。 我见过的地方是在windows的绘图/ etc代码中,而平铺和雪的外观通常表示了一些东西,例如告诉图像绘制代码,您将绘制一定大小和深度的图像,然后填充具有不同位深度的图像缓冲区。 像用来自整数RGBA源的数据填充字节数组并将其放入整数RGB目的地?

但是从屏幕截图中,用户看起来像是也在运行其他类型的应用程序,因为按最小化/最大化/关闭按钮有一个额外的按钮,所以其他一些第三方应用程序正在修改窗口。 也许这是搞乱了呢?

否则,我会说驱动程序问题。 总是有一些解决方案,如禁用d3d绘图或其他绘图优化,虚拟机现在自动执行,也许解决了这个问题?