Java Swing屏幕工件

Java Swing屏幕工件,java,swing,repaint,artifact,Java,Swing,Repaint,Artifact,我有一个Swing应用程序,有一些重绘问题。当一个屏幕(JFrame)关闭时,来自该屏幕的工件有时会绘制在其他屏幕上。在我们办公室的100多台开发人员机器上以及使用该软件的数千名用户中的大多数用户上,它是完全不可生产的。在过去的几年里,有关于这个问题的零星报道,但我们总是把责任归咎于图形卡或驱动程序。不过,在过去几个月里,有关该问题的报告数量急剧增加,因此我们需要找出真正的原因 我们几乎所有的客户端都在Windows上运行,它同时影响Windows 7和8机器。我们通常在JRE 1.6.0_29

我有一个Swing应用程序,有一些重绘问题。当一个屏幕(JFrame)关闭时,来自该屏幕的工件有时会绘制在其他屏幕上。在我们办公室的100多台开发人员机器上以及使用该软件的数千名用户中的大多数用户上,它是完全不可生产的。在过去的几年里,有关于这个问题的零星报道,但我们总是把责任归咎于图形卡或驱动程序。不过,在过去几个月里,有关该问题的报告数量急剧增加,因此我们需要找出真正的原因

我们几乎所有的客户端都在Windows上运行,它同时影响Windows 7和8机器。我们通常在JRE 1.6.0_29上运行,但问题也发生在1.6.0_45和1.7.0_51上

下图说明了这个问题。我用红色勾勒出了这个工件——这是另一个关闭的JFrame的一部分。当JFrame可见时,它不在屏幕上的那个位置。还要注意,工件上方的JTable列是不一致的。最后,请注意,工件并不仅仅绘制在JTable上,而是绘制在其父JScrollPane和屏幕最底部的单独JPanel上

有人知道这是什么原因吗


为了在此处“关闭”(即回答)此问题,评论的结果:

Marco13:虽然我从未遇到过这样的错误,但可能值得尝试-Dsun.java2d.opengl=true或-Dsun.java2d.d3d=false

(参考中列出的VM标志)

Jason:添加-Dsun.java2s.d3d纠正了该问题

(我假设这是指设置-Dsun.java2s.d3d=false,因为它在默认情况下是启用的)


关于上次评论中的问题:

“您认为启用Direct3D支持(对于数据输入应用程序)会有某种性能优势吗?”

我还没有在一些实验中使用
d3d
标志,而只是在性能测试中使用了
opengl
标志。所以我不知道这个标志在多大程度上影响了性能。同样,我的直觉是,对于简单的应用程序,这不应该真的有明显的效果。对于“简单”,我指的是只使用标准GUI组件的应用程序,而不通过覆盖的
paintComponent
方法中的
Graphics2D
执行复杂的自定义渲染操作。但根据屏幕截图,该应用程序可能至少涉及Swing中存在的最复杂的“标准GUI组件”——即JTable。因此,如果在滚动窗格中有一个大的JTALE,可能有复杂的自定义CeleReNeRever,那么如果可能的话,您应该考虑对目标机器的一些(最好是最慢的)性能影响的专用测试。p> “-Dsun.java2d.opengl=true”在我遇到类似的jTables问题时帮了我一把


然而“-Dsun.java2d.d3d=false”并没有让我满意。

当您调整剩余窗口的大小,触发重新绘制时,会发生什么?此外,工件组件是否可以点击或以任何方式响应用户交互?您是否有关于发生此错误的机器的进一步信息?特别是图形卡类型(供应商,可能还有驱动程序版本)?或发生此错误时在后台运行的任何第三方软件?这种情况发生在不同的操作系统和不同的JRE上,这表明这些机器一定有其他共同点导致了这种错误。@Luigidelcarno调整窗口的大小会触发重新绘制,而工件会消失。工件组件不响应用户交互。如果您单击它们(在屏幕截图的情况下),它将选择底层JTable中该位置的行,该行将被重新绘制。@Marco13否,我没有任何进一步的信息可以说明这些机器的共同点。很难从最终用户那里获得这种相当深入的信息。如果以前见过的人认为这可能与图形卡有关,我可以编写一个脚本来收集图形卡类型和驱动程序版本。我明白了,这种错误是一种痛苦。。很难调试。到目前为止,我所能说的是,过时的图形卡驱动程序确实会导致任意奇怪的渲染瑕疵。这种情况是否只发生在后台的应用程序也是Java/Swing应用程序时,还是发生在其他应用程序之上?您可以尝试使用Java2D标志(或d3d),但只要无法可靠地再现错误,就很难发现这是否有帮助。。。