2013-06-11 103 views
0

我使用计时器子类JPanel来显示动画图像。这是定时器的任务。如何在不影响其他组件的情况下重新绘制组件

private class AnimationTimerTask extends TimerTask { 
    @Override 
    public void run() { 
     // Change the current image 

     repaint(); 
    } 
} 

此外,我重写paintComponent方法来绘制当前图像。

我使用这个类来创建一个对象作为背景,并且上面有一个标签。我使用“setComponentZOrder”方法来确保标签在背景上。

首先,标签显示正常。但是它在背景图像改变后覆盖了背景,这意味着调用重绘方法。

我猜这个问题是由重绘后台对象造成的。

我将repaint()替换为getParent.repaint(),并解决了问题。但我认为这不是正确的方法。

+3

为了尽快提供更好的帮助,请发布[SSCCE](http://sscce.org/)。顺便说一句 - 那'TimerTask'几乎可以肯定是'javax.swing.Timer'。 –

+0

[为什么不使用重绘](http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#repaint%28long,%20int,%20int,%20int,%20int %29) – mKorbel

回答

0

我老实说不知道这是对还是错的答案,所以我希望别人能对此作出解释。但有一种叫做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) 

这是直截了当地使用这些方法做你想做的。

相关问题