【发布时间】:2015-10-29 16:46:18
【问题描述】:
这是一个代码示例:
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();
}
}
如果img 收到一个全新的Image 实例,paintComponent() 是否也会被自动调用?
另外,paint()和repaint()方法在这种情况下有什么用处吗?
【问题讨论】:
-
不,如果您为变量分配新值,Swing 将不会重新绘制。我建议查看custom painting in swing。在
someFunction你应该打电话给repaint -
请记住,被覆盖的paintComponent方法中的第一行代码必须为
super.paintComponent(g)。否则,你会得到不可预知的绘画文物。 -
谢谢。我推断
repaint()在内部调用paintComponent(),对吗? @VGR:您介意解释一下为什么会这样吗?比如,超类'paintComponent()具体做什么?这些工件从何而来? -
是的,
repaint()会经过重新绘制组件的步骤,最终会到达paintComponent()并绘制图像,请确保每次更新后面的数据时调用repaint()渲染,所以渲染匹配数据 -
Oracle 的 Painting in AWT and Swing 和 Java 教程的 A Closer Look at the Paint Mechanism 比我能解释得更好。至少,需要确保正确绘制背景。我相信它也执行了一些绘画优化,至少在某些平台上是这样。