グラフィックスを扱う |
フラッシングを排除するには、update() メソッドを上書きしなければ ならない。 この理由は、AWT が Component (Applet、Canvas、Frame など)にそれ自身をリペイントするよう要求する仕組みにある。
AWT は Component の update() メソッドを呼び出すことによってリペ イントを要求する。 update() のデフォルトの実装は、paint() を呼び出す 前に Component の背景をクリアする。 フラッシングの排除には不必要な描画をすべて除くことが必要なため、最初のステップは常に、update() を、必要なときしか背景全体をクリアしないよう update() が上書きすることである。paint() メソッド から update() に描画コードを移動する場合、描画コードが、クリアされる背景に依存しないよう変更する必要がある。
注: update() の実装が paint()を呼び出さない場合でも、 やはり paint() メソッドを実装しなければならない。 この理由は、Component の表示する領域が後ろに隠された (たとえば別のウィンドウの裏側などに) 後、突然、表面に出されるた場合、AWT は update() を呼び出さずに paint()を直接呼び出すからである。 paint() を実装する簡単な方法は、そこから update() を呼び出すようにすることである。
フラッシングを排除するための update() を実装した、前の例の改良版の コードも参照できる。 ここで、改良版のアプレットが動作する様子を示す。
使用中のブラウザは 1.0 Java アプレットを実行することができない。したがってここでは実行中のスナップショットを示す。
以下に、新たな update() メソッドと併せて、paint() メソッドの新バージョンを示す。 paint() メソッドで使われていた描画コードはすべて、今度は update() メソッドの中に移っている。 描画コードの重要な変更個所はボールド書体で示す。
public void paint(Graphics g) { update(g); } public void update(Graphics g) { Color bg = getBackground(); Color fg = getForeground(); ...//矩形を描画するまでは前の paint() メソッドと同じである: if (fillSquare) { g.fillRect(x, y, w, h); fillSquare = false; } else { g.setColor(bg); g.fillRect(x, y, w, h); g.setColor(fg); fillSquare = true; } ...//前の paint() メソッドと同じ }背景が自動的にはクリアされなくなったため、今回の描画コードでは黒でない矩形も 黒い矩形と同じように描画しなければならないことに注意する。
描画領域のクリッピング
読者の update() メソッドでも生かせる技法として、描画領域の クリッピング がある。このページのアプレット例では描画領域全体がフレーム ごとに変化するためクリッピングは使っていないが、ユーザがオブジェクトを背景の 中でドラッグするときなど、描画領域の小さい一部分だけが変化する場合ではクリッピングが役に立つ。
クリッピングを実行するときは clipRect() メソッドを使用する。 clipRect() を使用した例は、 イメージ動画の外観とパフォーマンスを向上させるに記載されている。
グラフィックスを扱う |