再描画する
画面を更新
これまでのアプレットは、一度画面を表示して終了でした
それ以降は内容が変化することはありませんでした
しかし、実際にはアニメーションしたり入出力を行ったり
何度も画面を更新する必要があります
ここでは、いよいよ画面を書きなおす作業をやってみましょう
アニメーションをするということは、コンポーネントを更新するということです
しかし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()メソッドが呼び出され、画面を更新します