JPanel的paintComponent();

时间:2015-10-29 16:46:18

标签: java swing

以下是代码示例:

public class MyClass extends JPanel
{
      Image img;
      public MyClass(Image img) {
      this.img = img;
      }
      ...

      void paintComponent(Graphics g) {
           g.drawImage(img, 0, 0, this);
      }

      void someFunction() {
           img = (Image) inputStream.getObject();
      }
}

如果paintComponent()收到一个全新的img实例,那么Image也会自动调用吗?

此外,在此上下文中对paint()repaint()方法有用吗?

1 个答案:

答案 0 :(得分:2)

没有。特别是更改Component变量或调用someFunction()之类的方法不会隐式运行paintComponent(),除非该方法设计为这样做。例如,someFunction()方法可以在调用时重新绘制,如下所示:

void someFunction() {
   img = (Image) inputStream.getObject();
   repaint();
}

但是,无论您在哪里更改repaint(),您仍然需要致电img,如果您这样做的话会容易出错。一种更平滑的方法(允许你在外部传递图像,如果你可以这样做)是写一个建议重新绘制的setter。

public void setImage(Image img){
   this.img = img;
   repaint();
}

并使用此方法而不是直接更改变量。 e.g:

void someFunction() {
   setImage((Image) inputStream.getObject());
}

最后,repaint()最终可能会调用paint(),但您通常不会直接致电paint(),因为repaint()管理得更好。有关详细信息,请参阅paint vs repaintPainting in AWT and Swing