Java 什么';处理AWT图形上下文的最佳方法是什么?

Java 什么';处理AWT图形上下文的最佳方法是什么?,java,swing,graphics,awt,Java,Swing,Graphics,Awt,我们Swing应用程序的一些用户报告说,屏幕上出现了奇怪的人工制品。这包括组件在一两秒钟内没有正确地重新喷漆,直到应用程序的整个部分被重新喷漆,就像窗口区域上的瓷砖墙纸一样 从有经验的Java开发人员到刚从大学毕业的年轻人,各个级别的开发人员在五年左右的时间里都在开发这个应用程序,正如你所料,一些AWT代码完全是一团糟。我现在面临的任务是,在未来几个月左右的时间里,尽可能多地纠正这些不好的地方 有些问题很容易处理。只在事件分派线程上处理组件,异步处理IO之类的事情,我希望能将消息传达给团队的其他

我们Swing应用程序的一些用户报告说,屏幕上出现了奇怪的人工制品。这包括组件在一两秒钟内没有正确地重新喷漆,直到应用程序的整个部分被重新喷漆,就像窗口区域上的瓷砖墙纸一样

从有经验的Java开发人员到刚从大学毕业的年轻人,各个级别的开发人员在五年左右的时间里都在开发这个应用程序,正如你所料,一些AWT代码完全是一团糟。我现在面临的任务是,在未来几个月左右的时间里,尽可能多地纠正这些不好的地方

有些问题很容易处理。只在事件分派线程上处理组件,异步处理IO之类的事情,我希望能将消息传达给团队的其他成员

我想知道的是处理图形上下文的最佳方法,特别是在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参数将在其他油漆中重复使用,那么我不需要将其恢复到良好状态、撤消仿射变换等吗?

我听说这已在jdk-1.6.12中修复,但没有尝试过。

根据肮脏的富客户端,您不应该更改传递给您的
图形
对象(在我看来,这是一个糟糕的API)

正确的处理方法稍微冗长一些:

public void paintComponent(Graphics g1) {
    super.paintComponent(g1);
    final Graphics2D g = (Graphics2D)g1.create();
    try {
         // ...Whole lotta drawing code...
    } finally {
         g.dispose();
    }
}
IIRC,在Sun实现中,不处理“子图形”对象并不重要。(不要引用我的话。)

您可能希望将该注释位委托给另一个对象