Appletクラスのグラフィック関連のメソッド

Appletクラスに用意されたグラフィック処理のメソッドについて
以下のメソッドはグラフィックの処理を行う特定の役割が決められている メソッドです。これらのメソッドは、Appletのスーパークラスである Componentクラスから継承されたものです。
グラフィックの内容が時間によって変化しない場合は、 描画の処理は paint() メソッドだけで十分です。 しかし、いつもそうとは限りません。 目的によっては絵の一部だけを変更したり、 少しずつ絵を描き加えたりする必要も出てくるでしょう。 これが、paint() と update() の2種類のメソッドが用意されている理由です。
アプレットの内部でどんな順序で処理が進むのかを、 もう少し具体的に説明しましょう。 アプレットが最初に画面に現れる時には、再描画が必要と判断されて paint() が 自動的に呼び出されます。 これ以外にも前のページに戻ったり、スクローリングして画面に復活した時も 同様です。 repaint() が 明示的に呼び出された時の処理は Appletクラスでは次のように 定義されています。 (正確には、 この定義はスーパー・クラスの Componentクラスのレベルで行われています。 Appletクラスはそれをそのまま継承しています。)

  1. repaint() 呼び出される。
  2. repaint() の要求が受け付けられると update() が呼び出される。
  3. update() は、アプレットの画像をいったんクリアした後、 paint() を呼び出す。
  4. paint() の処理が実行される。

つまりデフォルトの設定では、 repaint() を呼び出すとアプレット内の画像はいったんクリアされ、 ついで paint() に定義された描画処理が実行されるわけです。 ただし、update() の内容はアプレットのクラスで再定義することができます。 後の章で紹介するように、絵を次々描き加えたり表示の効率化を図るような場合は、 update() の内容を変更する必要が出てきます。


アプレットの描画メソッドが呼び出されるメカニズム

グラフィックの表示に関連するメソッドのまとめ

描画処理の内容を定義するメソッドが paint() と update() です。 paint()は Componentのオブジェクトの再描画が必要になった時 (最初に画面に現れる時も含む)に自動的に呼び出されます。 これに対して、update()は repaint()メソッドによって間接的に呼び出されます。
paint(), update()のメソッドは 明示的に呼び出すことはできません。 引数の Graphicsクラスのオブジェクトは、 これらのメソッドが自動的に呼び出される時に外部から与えられるデータです。 結果として描画に必要な処理は、 paint()およびupdate()メソッドとその内部から間接的に呼び出される メソッドによって、すべての処理が行われることになります。 ウィンドウ上のアプリケーションでは、 描画処理の実行のタイミングをあらかじめ予測することができません。 そのため、上のようなスタイルにすべきなのです。

repaint()は描画処理が必要であることをプログラム中で明示的に 要求するためのメソッドです。 repaint()は update()を呼び出すように要求を出します。 repaint() が要求を行っても即座に update()が呼び出されるとは限らない 点に注意してください。引数に「タイム・アウト」の時間を指定することも 可能です。(単位はミリ秒) また、再描画の処理の対象となる範囲を4つの int型のデータの組で 指定することができます。4つのデータの意味は順に、 描画領域の X座標、Y座標、横のサイズ、縦のサイズです。

repaint()メソッドが直接呼び出すのは update()メソッドですが、 Appletクラスの(正確には Componentクラスの)定義では、update()は いったん表示をクリアして、paint()メソッドを呼び出すという内容になっていまいす。 したがって update()の内容を再定義しない限りは、 repaint()によって paint()が呼び出されるように見えます。 アプレットに次々描画を追加してくような場合には、update()メソッドの再定義が 必要となります。