3

私は Java で簡単なライフ ゲーム プログラムを書いていますが、アニメーション化するのに少し苦労しています。次のペイント メソッドを使用して、ピクセルのグリッドを表示するLifeDrawというJComponentクラスがあります。

protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    for (int y = 0; y < lGrid.getHeight(); y++) {
        for (int x = 0; x < lGrid.getWidth(); x++) {
            if (lGrid.getCell(x,y) == 1) {
                g.setColor(Color.red);
                g.fillRect(x * lGrid.getSqSize(), y * lGrid.getSqSize(), lGrid.getSqSize(), lGrid.getSqSize());
            } else {
                g.setColor(Color.white);
                g.fillRect(x * lGrid.getSqSize(), y * lGrid.getSqSize(), lGrid.getSqSize(), lGrid.getSqSize());
            }
        }
    }
}

次に、メソッドを持つ別のクラスLifeGridrun()が呼び出されたときに、1 世代のピクセルのグリッドを更新してから を呼び出しますLifeDraw.repaint()run()ただし、ループで呼び出そうとすると、ループが終了するまでJComponentは再描画されないため、表示されるのは最初の世代と最後の世代だけです。おそらく更新が速すぎて再描画できないと考えたのでThread.sleep()、繰り返しの間に使用してみましたが、それでも同じ問題がありました. 理論的には (または、少なくとも私はそうなることを望んでいました)、反復ごとにコンポーネントを再描画し、ピクセルの変化のアニメーションを表示する必要があります。

私はJava GUIに精通していないので、助けていただければ幸いです。うまくいけば、私はそれを十分に明確に説明しました。そうでなければ教えてください!

4

3 に答える 3

1

の JavaDocs からrepaint():

コンポーネントが表示されている場合、指定されたリージョンをダーティ リージョン リストに追加します。コンポーネントは、現在保留中のすべてのイベントがディスパッチされた後に再描画されます。

再描画が行うのは、その領域を再描画する必要があることを知らせることだけです。またはを
試してください。paintImmediatelyupdate

于 2010-01-06T20:12:44.937 に答える
1

問題が解決するかどうかはわかりませんが、単純な for または while ループの代わりにタイマーから run() を呼び出してみてください。

于 2010-01-06T20:04:26.937 に答える
1

再描画は、別のスレッドではなく、イベント ループで実行する必要があります。への呼び出しを次のコード
に置き換えてみてください。repaint()

SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        repaint();
    }
}); 
于 2010-01-06T20:06:43.520 に答える