0

何千もの計算を必要とする JPanel で画像を描画しようとしています。描画の進行をアニメーション化したいと考えています。つまり、描画の 100K 回の繰り返しをすべて一度に実行してから JPanel を再描画する代わりに、各繰り返しの後に再描画し、数分の 1 秒間一時停止して、ユーザーが画像が徐々に表示されるのを見るようにします。ただし、JPanel を更新するたびに以前の描画が消去されるため、私の方法は機能しません。N回目の反復ですべての(1..N-1)計算を複製せずにこれを行うにはどうすればよいですか?

この例を考えてみましょう: 「雪」が徐々に画面に表示されるようにします。ただし、repaint() が呼び出されるたびに以前のものはすべて消去されるため、このコードは 100,000 番目の「スノーフレーク」のみを表示します。

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();
    }
}
4

4 に答える 4

1

N回目の反復ですべての(1..N-1)計算を複製せずにこれを行うにはどうすればよいですか?

この例BufferedImageに示すように、それらを に追加します。

于 2013-04-13T01:11:15.070 に答える
1

カスタム ペインティング アプローチでは、BufferedImage に描画する方法を示します。フォーラムには他にもたくさんの例があります。

また、アニメーションを行うときは、Swing Timer を使用してアニメーションをスケジュールする必要があります。

于 2013-04-13T00:20:00.923 に答える
0

おそらく、バッファでペイントを行ってから、paintComponent(); でバッファの現在の状態を描画する必要があります。

への呼び出しをスキップすることもできますがsuper.paintComponent(g);、その場合、他の要素がパネルに視覚的に「スタック」することを心配する必要があります。

于 2013-04-12T23:03:50.870 に答える