2011-07-15 15 views
1

JPanelをクライアントのモニタの最大リフレッシュレートでアニメーション化するにはどうすればよいですか?Swingのスムーズアニメーション

paintComponentは、最後の更新後にのみ呼び出されます。私はを使ってrepaint()毎に(1000/60)msをスケジュールすることでこれを行うことができましたが、私はちょうどリフレッシュレートを推測しています。

効果的に私はrepaintを継続的に呼びたいと思います。しかし、repaintを200回/秒、EDTがビジーでない場合は、paintComponent秒に200回実行します。これはプロセッサ時間の使用効率が悪く、残りのアプリケーションのパフォーマンスに悪影響を及ぼす可能性があります。

+0

を見ますコンポーネントツリーのメンバーに対する単一の再描画。 – mre

+0

本当にたくさんの時間を再塗りたいのですか? JPanel内のオブジェクトに大きな変化がありますか?それとも、ゲームのようにその中にイメージを動かすようにアニメーション化することを考えていますか? – woliveirajr

+0

実際に再塗りをする必要があるときにはわかりませんか? – Perception

答えて

2

私は、モニターのリフレッシュレートで再ペイントすることをお勧めします。しかし、あなたがリフレッシュレートが何であるかを調べるために探しているなら、あなたはこのコードを使用することができます(恥ずかしがりにはウェブからコピーされます)。

GraphicsEnvironment ge = GraphicsEnvironment 
     .getLocalGraphicsEnvironment(); 
GraphicsDevice[] gs = ge.getScreenDevices(); 

for (int i = 0; i < gs.length; i++) { 
    DisplayMode dm = gs[i].getDisplayMode(); 

    // Get refresh rate in Hz 
    int refreshRate = dm.getRefreshRate(); 
    if (refreshRate == DisplayMode.REFRESH_RATE_UNKNOWN) { 
     // Unknown rate 
    } else { 
     System.out.println(refreshRate); 
    } 
} 
+0

実際にやりたいことは、再描画自体ではなく、リフレッシュレートでのアニメーションの位置を再計算し、必要であればそれからの再描画。 –

+0

うまくいくと思います。スプライトの数が非常に複雑な場合は、最も適切なfpsでリフレッシュできます。できるだけアニメーションをスムーズにするためにダブルバッファリングをお勧めします。 – Perception

+0

私はスウィングがデフォルトでダブルバッファリングされていることを確かめています。 –

1

私は@little bunny foo fooと合意したことだし、あなたもOSレイテンシを計算する必要があり、この値はHW & SWの依存、そして私のWinXPのは63ms前後の値を持って、この周波数をオーバーロックすることにより、あなたはRepaintManagerのからのエラーを取得し、ため例JTableは非常に敏感ですJComponents、スウィングpaintImmediately()の塗装についてもっとお読みくださいdefaintでEDTを作成します

EDIT:repaint();これは、オフトピックかもしれませんが、[ `RepaintManager`](http://download.oracle.com/javase/6/docs/api/javax/swing/RepaintManager.htmlが)の中に複数の要求を崩壊ここpainting and javax.swing.Timer