我子类JPanel使用计时器显示动画图像。这是计时器的任务。
private class AnimationTimerTask extends TimerTask {
@Override
public void run() {
// Change the current image
repaint();
}
}
此外,我重写了paintComponent方法来绘制当前图像。
我使用这个类创建一个对象作为背景,并有一个标签。我使用"setComponentZOrder"方法来确保标签在背景上。
一开始,标签显示正常。但是在背景图像改变后,它被背景覆盖了,这意味着调用了repaint方法。
我猜这个问题是由背景对象的重绘引起的。
我将repaint()替换为getParent.repaint(),问题就解决了。但我不认为这是正确的方式。
老实说,我不确定这是正确的还是错误的答案,所以我希望其他人可以插话。但是有一个叫做RepaintManager的东西。那篇文章说:
对于大多数程序,RepaintManager可以被看作是Swing内部系统的一部分,实际上可以忽略。然而,它的API为程序提供了对绘画的某些方面进行更精细控制的选项。
它有这样的方法:
public static RepaintManager currentManager(JComponent c)
public synchronized void addDirtyRegion(JComponent c, int x, int y, int w, int h)
public Rectangle getDirtyRegion(JComponent aComponent)
public void markCompletelyDirty(JComponent aComponent)
使用这些方法做你想做的事情很简单。