【问题标题】:Java Swing screen artifactsJava Swing 屏幕工件
【发布时间】: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


【解决方案1】:

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

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 组件的应用程序,并且不通过覆盖 paintComponent 方法中的 Graphics2D 执行复杂的自定义渲染操作。但根据截图,这个应用程序至少可能涉及到 Swing 中存在的最复杂的“标准 GUI 组件”——即 JTable。因此,例如,如果您在 ScrollPane 中有一个大型 JTable,可能带有复杂的自定义 CellRenderers,则应考虑对某些(最好是最慢的)目标机器的性能影响进行专门测试,如果可能的话。

【讨论】:

    【解决方案2】:

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

    但是“-Dsun.java2d.d3d=false”让我不满意。

    【讨论】:

      猜你喜欢
      • 2012-06-02
      • 2013-10-24
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多