5

我有一个带有某种重绘问题的 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 上绘制。

任何人有任何想法可能导致这种情况?

在此处输入图像描述

4

2 回答 2

6

为了让这个问题在这里“关闭”(即回答),评论的结果:

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

(参考http://docs.oracle.com/javase/7/docs/technotes/guides/2d/flags.html#d3d中列出的 VM 标志)

Jason:添加 -Dsun.java2s.d3d 纠正了这个问题。

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


关于上一条评论中的问题:

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

我还没有使用d3d标志,而只是opengl标志,用于一些实验,而不是用于性能测试。所以我不知道这个标志对性能的影响有多大。同样,我的直觉是,对于简单的应用程序,这应该不会产生明显的影响。对于“简单”,我的意思是仅使用标准 GUI 组件的应用程序,并且不通过Graphics2D覆盖的 in执行复杂的自定义渲染操作paintComponent方法。但根据截图,这个应用程序至少可能涉及到 Swing 中存在的最复杂的“标准 GUI 组件”——即 JTable。因此,例如,如果您在 ScrollPane 中有一个大型 JTable,可能带有复杂的自定义 CellRenderers,则应考虑对某些(最好是最慢的)目标机器的性能影响进行专门测试,如果可能的话。

于 2014-02-12T14:34:37.260 回答
4

当我遇到与 jTables 类似的问题时,“-Dsun.java2d.opengl=true”为我解决了问题。

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

于 2014-11-06T22:13:14.187 回答