我们的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等?
根据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实现中,如果不处理"子图形"对象并不重要.(不要引用我的话.)
您可能希望将该注释位委托给另一个对象.