再描画する


画面を更新

これまでのアプレットは、一度画面を表示して終了でした
それ以降は内容が変化することはありませんでした

しかし、実際にはアニメーションしたり入出力を行ったり
何度も画面を更新する必要があります
ここでは、いよいよ画面を書きなおす作業をやってみましょう

アニメーションをするということは、コンポーネントを更新するということです
しかしpaint()メソッドを呼び出すことはできません
これは、アプレットが複雑なスレッド環境下の元でスケジュール管理されているからです

そこで、画面の更新にはComponentクラスのrepaint()メソッドを呼び出します
AppletクラスはComponentクラスを継承していましたね
repaint()メソッドは同クラスのupdate()メソッドを適切なタイミングで呼び出します

update()メソッドは、コンポーネントを背景色で塗りつぶしてpaint()メソッドを呼び出します
つまり、コンポーネントを更新するのです

public void repaint()
public void repaint( long tm )
public void repaint( int x, int y, int width, int height )
public void repaint( long tm, int x, int y, int width, int height )

引数になにも指定しなかった場合、早急にコンポーネントのupdate()を呼び出します
tmは、更新までの再長時間を指定します
tmが指定されている場合は、tmミリ秒以内にupdate()を呼び出します
x , y , width , height はdrawRectと同じ方法で長方形を指定します
この場合は、指定された長方形の領域だけを再描画します

上から3番目のrepaint()は、指定された長方形をすぐに再描画し
4番目のrepaint()は、tmミリ秒以内に長方形を再描画します

main()メソッドがないということから、GUI開発経験のない人は
どこでrepaint()メソッドを呼び出していいか戸惑うかもしれません
経験者なら、すでに理解しているでしょう
GUIプログラムの場合、メソッドを呼び出すのはイベントが発生したときです
いわゆるイベント駆動型(イベントドブリン)プログラムなのです

私たちが、今すぐに扱えるイベントといえばinit()やstart()などです
アプレットの起動や停止をイベントとして、アプレットのウィンドウを書き換えましょう
import java.applet.Applet;
import java.awt.*;

/*<applet code="test.class" width="400" height="200"></applet>*/

public class test extends Applet {
        int count = 0;

        public void stop() {
                count++;
                repaint();
        }

        public void paint(Graphics g) {
                String str = "" + count;
                setBackground(Color.white);
                g.setFont(new Font("serif" , Font.BOLD , 40));
                FontMetrics fo = g.getFontMetrics();

                g.drawString(str , 200 - fo.stringWidth(str) / 2 , 100);
        }
}
このプログラムはアプレットビューワで実行してください
アプレットビューワーを最小化すると、stop()メソッドが呼び出されます
そのときrepaint()メソッドが呼び出され、画面を更新します



前のページへ戻る次のページへ