【问题标题】:How to repaint a component without affecting other components如何在不影响其他组件的情况下重绘一个组件
【发布时间】:2013-06-07 19:17:12
【问题描述】:

我将 JPanel 子类化以使用计时器显示动画图像。这是计时器的任务。

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

        repaint();
    }
}

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

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

起初,标签显示正常。但是背景图片改变后被背景覆盖了,这意味着调用了repaint方法。

我猜这个问题是由背景对象的重绘引起的。

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

【问题讨论】:

  • 如需尽快获得更好的帮助,请发布SSCCE。顺便说一句 - TimerTask 几乎可以肯定是 javax.swing.Timer

标签: java swing components


【解决方案1】:

老实说,我不确定这是正确还是错误的答案,所以我希望其他人能加入进来。但是有一个叫做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) 

使用这些方法来做你想做的事很简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    相关资源
    最近更新 更多