4

我们的 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 参数要在其他绘画中重复使用,那么我不需要将其恢复到良好状态,撤消 AffineTransforms 等吗?

4

2 回答 2

5

根据肮脏的富客户端的说法,您不应该更改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 实现中,如果您不处理“子图形”对象并不重要。(不要引用我的话。)

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

于 2009-03-02T15:41:21.817 回答
-1

听说jdk-1.6.12已经修复了这个,但是没试过。

于 2009-03-02T15:21:37.933 回答