6

スクロール ペイン内に非常に大きなグラフを描画するルーチンがあります。スクロールペインに追加する前にペイントするには大きすぎます。メノリー要件は数ギグです。

グラフのサイズのため、スクロールペインの子の paint メソッド内でグラフをレンダリングしています。これはうまくいきますが、スクロールバーが移動するたびにペイントルーチンが 2 回呼び出されることに気付きました. .

たとえば、ビューポートが 245x195 で、下に 3 ピクセルスクロールすると、ペイント ルーチンがg.getClipBounds()次のように設定されて呼び出されます。

java.awt.Rectangle[x=0,y=195,width=245,height=3]
java.awt.Rectangle[x=0,y=3,width=245,height=195]

...ペイントルーチン内でレンダリングするため、ちらつきが発生します(計算はできるだけ速く行いますが、少し遅れると思います)。質問:

  1. 2回目のペイントコールを防ぐ方法を知っている人はいますか? これは、私がここで行っている単純な JScrollPane のものです。コンポーネントがあり、それをスクロールペインに追加し、スクロールペインを親コンポーネントに追加します。この動作は、swing チュートリアルの最初の画像スクロール デモでも確認できます。

  2. #1への答えが「いいえ」の場合:これに対処する良い方法を考えられる人はいますか?ある種の画像バッファにペイントし、最近のペイント呼び出しを追跡し、可能であれば画像をコピーする必要がありますか? これが再レンダリングよりもはるかに速いとは想像できませんが、洞察をいただければ幸いです:-)

4

1 に答える 1

4

.NETの世界でこの問題に遭遇しました。ダブルバッファリングで問題が解決するはずです。

画面に表示されているサーフェスに直接レンダリングしている場合、「表示」が実際にいつ行われるかを制御することはできません。通常は、レンダリングを開始し、まだ完成していない画像が画面に表示され、レンダリングが終了すると、最終的に画面に表示されます。

背景色をクリアしてレンダリングロジックを開始すると、これはフラッシュのように表示されます。ダブルバッファリングは、完成したレンダリングから常に表示されるため、これを防ぎます。発生する可能性のある最悪の事態はわずかな「引き裂き」ですが、それはアニメーションが急速に変化する場合にのみ顕著になります。

巨大な画像の一部だけをレンダリングしたい場合でも、この手法を使用できます。必要なものを画面外の表面(必要な表示部分のサイズ)にレンダリングするだけです。そして、完了したら、画像全体を一挙に表示面に描画します。

于 2009-02-19T19:46:41.597 に答える