我们的Swing应用程序的一些用户报告显示器上出现了奇怪的人工制品。这包括组件不能正确地重新绘制一两秒,直到应用程序的整个部分被重新绘制,就像窗口区域上的平铺壁纸一样。
该应用程序已经由经验丰富的Java人员和大学之间的各个层级的开发人员在大约五年左右的时间里进行了工作,正如您所期望的那样,一些AWT代码是彻头彻尾的混乱。我现在面临着在接下来的几个月左右努力纠正尽可能多的坏事的任务。
其中一些很容易处理。仅在事件调度线程上处理组件,异步处理IO,有点事情,我希望将消息传递给团队的其他成员。
我想知道的是处理Graphics上下文的最佳方法,尤其是在paintComponent()上下文中。我看到很多......
public void paintComponent( Graphics g ) {
super.paintComponent( g );
Graphics2D gfx = (Graphics2D)g;
// ...Whole lotta drawing code...
}
这样做更好吗?
public void paintComponent( Graphics g ) {
super.paintComponent( g );
Graphics2D gfx = (Graphics2D)g.create();
// ...Whole lotta drawing code...
gfx.dispose();
}
如果g参数将在其他颜料中重复使用,那么我不需要将其恢复到良好状态,撤消AffineTransforms等吗?
答案 0 :(得分:5)
根据Filthy Rich Clients的说法,你不应该改变传递给你的Graphics
对象(作为API,IMO很糟糕)。
处理它的正确方法略显冗长:
public void paintComponent(Graphics g1) {
super.paintComponent(g1);
final Graphics2D g = (Graphics2D)g1.create();
try {
// ...Whole lotta drawing code...
} finally {
g.dispose();
}
}
IIRC,在Sun实现中,如果不处理“子图形”对象并不重要。 (不要引用我的话。)
您可能希望将该注释位委托给另一个对象。
答案 1 :(得分:-1)
我听说这已在jdk-1.6.12中修复,但没有尝试过。