消さずに更新
update()のオーバーライド
アニメーションの基本的な仕組みもわかりました
これで、かなり高度なアプレットが作れるようになってきましたね
今までrepaint()メソッドでupdate()を呼び出すと、コンポーネントが全て背景色で消されてしまいました
もちろん、コンポーネントの全体的な更新が目的ならそれでもかまいません
しかし、コンポーネントに対してpaint()メソッドを呼び出して内容を追加したい場合はこれじゃ困ります
今回は、コンポーネントを塗りつぶすことなくpaint()メソッドを呼び出して上書きする方法を覚えましょう
コンポーネントの内容を背景色でクリアしているのは、update()メソッドの仕様です
ということは、このupdate()メソッドをオーバーライドして
コンポーネントを背景色で塗りつぶさないようにすれば良いのです
public void update( Graphics g )
gはGraphicsオブジェクトを受け取ります
オーバーライドしたupdate()メソッドで、paint()メソッドを呼び出せば良いですね
当然、背景色で塗りつぶすようなことはしません。ただ純粋にpaint()を呼び出します
paint()メソッドにはGrahicsオブジェクトを渡します
import java.applet.Applet;
import java.awt.*;
/*<applet code="App15.class" width="400" height="200"></applet>*/
public class App15 extends Applet implements Runnable {
public void init() {
setBackground(Color.white);
setForeground(Color.blue);
Thread th = new Thread(this);
th.start();
}
public void run() {
try {
while (true) {
repaint();
Thread.sleep(1000);
}
}
catch (Exception err) {
}
}
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
int x = (int)(Math.random() * 400) , y = (int)(Math.random() * 200);
g.drawLine(x , y , (int)(Math.random() * (400 - x)) , (int)(Math.random() * (200 - y)));
}
}
乱数の値で線を引きつづけます
新しい線をコンポーネントに描画するのに、以前の線を残したまま再描画します
ただし、別ウィンドウでコンポーネントを隠したりすると消えてしまいます
アプレットは一度隠されると、再び表示される時に再描画する仕様になっているからです