Java 中的 repaint() 方法在翻译后不会重新绘制我的 Rectangle

Posted

技术标签:

【中文标题】Java 中的 repaint() 方法在翻译后不会重新绘制我的 Rectangle【英文标题】:repaint() method in Java will not repaint my Rectangle after translation 【发布时间】:2012-03-28 13:08:08 【问题描述】:

我正在制作一个游戏,我必须在 n × n 网格上移动小方块,并且它们必须平滑过渡。这是我所做的交换方法,它应该能够在屏幕上绘制我的过渡,但由于某种原因它没有这样做。我在一个简单的项目中尝试了一个更简单的代码版本来来回移动 Square,它就像一个魅力,所以我真的不确定为什么这不是重新绘制。这只是我的代码的一部分,所以如果对我的代码有任何疑问,请提出来。

提前致谢。 (:

public void swap( int y,  int x ) 
    long time = System.currentTimeMillis();
    int counter = 0;
    swapNum = tiles[y][x];
    rect = (Rectangle) rectangles[y][x].clone();

    while(counter < rect.height) 
        if(System.currentTimeMillis() - time > 5) 
        rect.translate(this.y-y, this.x-x);
        time = System.currentTimeMillis();
        counter++;
        repaint();

        

    
    swapNum = 0;
    rect = new Rectangle();


    int temporary = tiles[this.y][this.x];
    tiles[this.y][this.x] = tiles[y][x];
    tiles[y][x] = temporary;
    this.x = x;
    this.y = y; 


【问题讨论】:

【参考方案1】:

如果此代码块在用于绘制到屏幕的 Event/Dispatch 线程上运行,那么这将阻止屏幕更新。

与其在一个循环中制作整个动画,不如考虑设计一种更新方法来制作动画,每 15-30 毫秒调用一次,并相应地更新矩形的位置。更好的平滑图形是绘制到图像缓冲区,然后让实际的绘制方法将该缓冲区绘制到屏幕(双缓冲)。

Java3D 内置了动画,因此值得一看。

【讨论】:

以上是关于Java 中的 repaint() 方法在翻译后不会重新绘制我的 Rectangle的主要内容,如果未能解决你的问题,请参考以下文章

Java JPanel中,repaint(),paint(),方法的区别?

Java - 方法 repaint() 不调用 paintComponent() 方法

Java AWT - repaint()方法线程调度

如何在游戏循环中使用 repaint() 方法

Java中的重绘()

Java JPanel repaint() 问题?