【问题标题】:What's the best way of dealing with AWT Graphics contexts?处理 AWT 图形上下文的最佳方式是什么?
【发布时间】:2010-10-10 19:15:17
【问题描述】:

我们的 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 等吗?

【问题讨论】:

    标签: java swing graphics awt


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      根据 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 的实现中,如果您不处理“子图形”对象并不重要。 (不要引用我的话。)

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

      【讨论】:

        猜你喜欢
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 2018-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        相关资源
        最近更新 更多