以下是代码示例:
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()
方法有用吗?
答案 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 repaint和Painting in AWT and Swing。