Appletの描画処理

Appletクラスにグラフィックを描くタイミングを 操作するための仕組みを解説します。
アプレットに絵を描くための関数も名前が予約されていて、 それぞれ特別な働きがあります。 (ここで説明するのは Graphicsクラスに付属する個々の関数ではありません。 それらをまとめておくための関数です。)

このうち repaint() は、 皆さんのプログラムの側でいつ呼び出すかを決めなくてはいけません。 通常はマウスのボタンが押されるなどイベントが発生した時ですが、 それ以外の処理でも呼ばれる可能性はあります。
残りの2つの関数は、 repaint()によって間接的に呼び出されます。
また、paint()は、 アプレットが最初に画面に現れた時にも自動的に呼び出されます。

Appletクラスの設定では、repaint()update()を呼び出し、 update()は以下に示すように画面をクリアした後、 paint()を呼び出す仕組みになっています。


 public void update(Graphics g) {
      g.clearRect(0, 0, width, height);
      paint(g);
 }

updata()を特別に書き換えない場合は、 新しいアプレットはこの機能をそのまま Appletクラスから受け継ぐことになります。 たとえば、アプレットに描かれる図形が全く変化しないか、 あるいは決まった数通りのパターンしかないような場合なら、 このままで問題はありません。 paint()の内部の処理を適当に書いておけば十分対応できます。
しかし、アニメーションやマウスで絵を描けるようなアプレットを設計したい 場合は、このままではうまく処理できない場合があります。 絵の一部分だけを書き換えたいとか、以前の絵の上に次々と描き加える ような操作を実現するには、update()を目的に応じて 書き変えてください。 (その場合には、paint()はもはやrepaint()から は呼び出されず、最初に画面に現れる時に自動的に呼び出されるだけに なります。)

update()を書き変えて、ペイント・ツールの 機能を実現した例を見てみましょう。


 public void paint( Graphics g ) {

       g.setForeground( Color.white );
       g.paint3DRect( 0, 0, 600, 400, true, true );
 } 
 
 public void update( Graphics g ) {

       g.drawLine( x1, y1, x2, y2 );  // 線を描く
       x1 = x2;
       y1 = y2;
 } 
 
 public void mouseDrag( int x, int y ) {

       x2 = x;
       y2 = y;
       repaint();      // update() を呼び出す
 }