代码之家  ›  专栏  ›  技术社区  ›  banjollity

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

  •  4
  • banjollity  · 技术社区  · 15 年前

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

    有些问题很容易处理。只在事件分派线程上处理组件,异步处理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参数将在其他绘制中重复使用,那么我不需要将其恢复到良好状态、撤消仿射变换等吗。?

    2 回复  |  直到 15 年前
        1
  •  5
  •   Tom Hawtin - tackline    15 年前

    根据肮脏富有的客户,你不应该改变 Graphics 对象传递给您(在IMO中,它作为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实现中,不处理“子图形”对象并不重要。(不要引用我的话。)

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

        2
  •  -1
  •   Marko    15 年前