我的 Swing 应用程序存在某种重绘问题。当屏幕 (JFrame) 关闭时,来自该屏幕的 Artifact 有时会绘制在其他屏幕上。在我们办公室的 100 多台开发人员机器和使用该软件的数千名用户中的大多数人身上,它是完全不可重现的。在过去的几年里,关于这个问题的报道零星出现,但我们总是把责任归咎于显卡或驱动程序。不过,在过去几个月中,有关该问题的报告数量急剧上升,因此我们需要找出真正的原因。
几乎我们所有的客户端都在 Windows 上运行,它会影响 Windows 7 和 8 机器。我们通常在 JRE 1.6.0_29 上运行,但在 1.6.0_45 和 1.7.0_51 上也会出现此问题。
下图说明了这个问题。我用红色勾勒出 Artifact 的轮廓 - 这是另一个已关闭的 JFrame 的一部分。当 JFrame 可见时,它不在屏幕上的那个位置。另请注意, Artifact 上方的 JTable 列超出了行。最后,请注意 Artifact 并没有在 JTable 上绘制,而是在其父 JScrollPane 和屏幕最底部的单独 JPanel 上绘制。
有人知道是什么原因造成的吗?
最佳答案
为了在这里“关闭”(即回答)这个问题,评论的结果:
Marco13 : Although I have never encountered such an error, it might be worth trying -Dsun.java2d.opengl=true or -Dsun.java2d.d3d=false
(指在 http://docs.oracle.com/javase/7/docs/technotes/guides/2d/flags.html#d3d 中列出的 VM 标志)
Jason : Adding -Dsun.java2s.d3d corrected the issue.
(我假设这是指设置 -Dsun.java2s.d3d=false,因为它默认启用)
关于上一条评论的问题:
“您认为启用 Direct3D 支持(对于数据输入应用程序)有某种性能优势吗?”
我还没有使用 d3d
标志,只使用了 opengl
标志,用于一些实验,而不是用于性能测试。所以我不知道这个标志对性能有多大影响。同样,我的直觉是,对于简单的应用程序,这应该不会产生明显的影响。对于“简单”,我指的是仅使用标准 GUI 组件且不通过重写的 paintComponent
方法中的 Graphics2D
执行复杂的自定义呈现操作的应用程序。但根据屏幕截图,此应用程序可能至少涉及 Swing 中存在的最复杂的“标准 GUI 组件”——即 JTable。因此,例如,如果您在 ScrollPane 中有一个大型 JTable,可能带有复杂的自定义 CellRenderer,您应该考虑对某些(最好是最慢的)目标机器的性能影响进行专门测试,如果可能的话。
关于Java Swing 屏幕 Artifact ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21681071/