Java Swing 屏幕 Artifact

标签 java swing repaint artifact

我的 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 上绘制。

有人知道是什么原因造成的吗?

enter image description here

最佳答案

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

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/

相关文章:

java - 您如何在 Android Pay 或 Google 电子钱包中存储 QR 码

Java 的 JDB(和 Eclipse)在连接到具有许多线程的远程 JVM 时挂起(即通过 TCPIP 传输线程调试信息)

java - 基于 Spring Boot 的测试中的上下文层次结构

java - 在Java中单击按钮时更改jframe上的图像

java - Repaint方法更新太慢

java - 使用 Jersey 将 xml 转换为 json 格式的 Restful WebService

java - 在表单上设置相同大小的按钮

Java 软件看起来一半是 Windows,一半是 Metal

java - Java 重绘中的组合框

java - 更改 JComponent 上的文本