Jas*_*son 3 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上.
有人有什么想法会导致这个吗?

为了让这个问题在这里"关闭"(即回答),评论的结果如下:
Marco13:虽然我从未遇到过这样的错误,但值得尝试-Dsun.java2d.opengl = true或-Dsun.java2d.d3d = false
(参考http://docs.oracle.com/javase/7/docs/technotes/guides/2d/flags.html#d3d中列出的VM标志)
杰森:添加-Dsun.java2s.d3d纠正了这个问题.
(我假设这指的是设置-Dsun.java2s.d3d = false,因为它默认启用)
关于上次评论的问题:
" 你认为启用Direct3D支持(数据输入应用程序)有哪些性能优势? "
我还没有使用过d3d旗帜,但只有opengl旗帜用于一些实验,而不是用于性能测试.所以我不知道这面旗帜在多大程度上会对性能产生显着影响.同样,我的直觉是,对于简单的应用程序,这应该不会产生明显的影响."简单"是指仅使用标准GUI组件的应用程序,并且不通过Graphics2D重写paintComponent方法执行复杂的自定义渲染操作.但是根据屏幕截图,这个应用程序可能至少涉及Swing中存在的最复杂的"标准GUI组件" - 即JTable.因此,如果你有一个ScrollPane中的大型JTable,可能有复杂的自定义CellRenderers,你应该考虑对目标机器的某些(最好是最慢的)性能影响的专用测试,如果可能的话.