【发布时间】:2014-02-10 15:23:47
【问题描述】:
我有一个存在某种重绘问题的 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 上绘制。
有人知道是什么原因造成的吗?
【问题讨论】:
-
当你调整剩余窗口的大小,触发重绘时会发生什么?此外,工件组件是否可点击或以任何方式响应用户交互?
-
您有关于发生此错误的机器的更多信息吗?特别是显卡类型(供应商,可能还有驱动程序版本)?或者发生此错误时在后台运行的任何第三方软件?它发生在不同的操作系统和不同的 JRE 上的事实表明,这些机器肯定有其他共同点会导致这个错误。
-
@LuigiEdlCarno 调整窗口大小会触发重绘并且工件消失。工件组件不响应用户交互。如果您单击它们(在屏幕截图的情况下),它将选择底层 JTable 中该位置的行,并且该行将被重新绘制。
-
@Marco13 不,我没有任何进一步的信息可以表明这些机器有什么共同点。很难从最终用户那里获得这种相当深入的信息。如果之前看过这个的人认为它可能与显卡有关,我可以编写一个脚本来收集显卡类型和驱动程序版本。
-
我明白了,这种错误是一种痛苦......难以调试。到目前为止,我只能说过时的显卡驱动程序确实会导致任意奇怪的渲染伪影。这是否仅在后台应用程序也是 Java/Swing 应用程序时发生,或者它是否也发生在其他应用程序之上?您可以尝试使用 Java 2D 标志(docs.oracle.com/javase/7/docs/technotes/guides/2d/… 或 d3d),但只要没有办法可靠地重现错误,就很难知道这是否有帮助...
标签: java swing repaint artifact