Java Swing屏幕工件

时间:2014-02-10 15:23:47

标签: java swing repaint artifact

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

任何人都有任何想法会导致这种情况吗?

enter image description here

2 个答案:

答案 0 :(得分:5)

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

  

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 overridden paintComponent方法执行复杂的自定义呈现操作。但是根据屏幕截图,这个应用程序可能至少涉及Swing中存在的最复杂的“标准GUI组件” - 即JTable。因此,如果你有一个ScrollPane中的大型JTable,可能还有复杂的自定义CellRenderers,你应该考虑对目标机器的某些(最好是最慢的)性能影响的专用测试,如果可能的话。

答案 1 :(得分:2)

" -Dsun.java2d.opengl =真"当我遇到与jTables类似的问题时,为我做了诀窍。

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