java - 用 Java 动画绘制连续复杂的图像

标签 java swing drawing jpanel java-2d

我正在尝试在需要数千次计算的 JPanel 上绘制图像,并且我想要为绘图的进度设置动画。也就是说,我不想一次性完成所有 100K 次绘图迭代,然后重新绘制 JPanel,而是想在每次迭代后重新绘制,然后暂停一小会儿,以便用户看到图像逐渐出现。但是,每次刷新 JPanel 都会删除以前的绘图,因此我的方法不起作用。如何在第 N 次迭代中不复制所有 (1..N-1) 计算的情况下执行此操作?

考虑这个例子:我希望“雪”逐渐出现在屏幕上。但是,此代码只会显示第 100,000 个“雪花”,因为每次调用 repaint() 时,所有先前的“雪花”都会被删除。

import javax.swing.*;
import java.awt.*;
import java.util.Random;

class spanel extends JPanel{    
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawLine(snow.x, snow.y, snow.x, snow.y);
    }
}

class snow extends Thread {

    static int x,y;
    Random r = new Random();

    public void run(){

        JFrame sboard = new JFrame();
        sboard.setSize(600,600);
        sboard.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        spanel mypanel = new spanel();
        sboard.add(mypanel);
        sboard.setVisible(true);

        for (int i=0;i<100000;i++){
            x=r.nextInt(600);
            y=r.nextInt(600);

            sboard.repaint();    
            try {
                snow.sleep((long)10);
            } catch (InterruptedException e) {}; 
        } 
    }
}

public class SnowAnim {    
    public static void main(String[] args) {
        (new snow()).start();
    }
}

最佳答案

Custom Painting Approaches展示如何在 BufferedImage 上绘图。论坛中还有很多其他示例。

此外,在制作动画时,您应该使用 Swing Timer 来安排动画。

关于java - 用 Java 动画绘制连续复杂的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15982135/

相关文章:

java - 在缓冲图像上绘制油漆?

cocoa - 无论属性如何,如何使 NSAttributedString 居中?

javascript - 如何将自由绘制的线条作为线条列表获取,其中每条线条都是坐标列表?

c# - 在没有 SolidColorBrush 的情况下从 Color 获取 Brush

java - 带有 Netbeans 的 BackgroundPanel.java

java - 为什么我们需要 Java 8 中的消费者和供应商函数?

java - 如何避免容易陷入僵局?

java - 仅将 Maven 依赖项声明为测试运行时

java - 在 JInternalFrame 中捕获最大化/恢复事件

java - <h :commandButton> doesn't start the action - NO IDEA?