import java.awt.*;
public class Applet4 extends java.applet.Applet implements Runnable {
                       // implements Runnable とは,スレッドを含むという意味。
    MediaTracker mt;   // メディアトラッカーを入れるための変数 mt を作る。
                       // 変数名は mt でなくても何でもよい。
    Image image;       // 画像を入れるための変数 image を作る。
                       // 変数名は image でなくても何でもよい。
       // 以下の変数名についても同じ。
    Thread th;         // スレッドを入れるための変数を作る。
    int x = 100, y = 50, dx = 10, dy = 10;

    public void init() {  // 最初に1度だけ実行される
        mt = new MediaTracker(this);
                  // メディアトラッカーを作って変数 mt に登録する
        image = getImage(getDocumentBase(), "e.gif");
                  // 画像ファイルを変数 image に登録する
        mt.addImage(image, 0);
                  // メディアトラッカーに画像 image を加える
  // 画像番号を 0 とする
    }

    public void start() { // init() の後で実行される
        if (th == null) { // スレッド th が空っぽ(null)なら
            th = new Thread(this);    // スレッドを作って th に登録
            th.start();   // th をスタートさせる
        }
    }

    public void stop() {  // 表示が不要になったときに実行される
        if (th != null) { // スレッド th が空っぽでないなら
            th.stop();    // th を止める
            th = null;    // th の登録内容を空っぽ(null)にする
        }
    }

    public void paint(Graphics g) {   // 描画が必要になった際に実行される
        if (mt.isErrorID(0)) {        // 読み込みエラーなら
            g.drawString("Error", 20, 60);    // Error と表示
        } else if (mt.checkID(0)) {   // 読み込み完了なら
            g.drawImage(image, x, y, this);   // 実際に描画
        } else {                      // 読み込み中なら
            g.drawString("Loading", 100, 60); // Loading と表示
        }
    }

    public void run() {               // スレッドの実体
        try {
            mt.waitForID(0);          // 読み込まれるまで待つ
        } catch (InterruptedException e) {  // 割り込みの処理
            return;
        }
        while (true) {                // 無限ループ
            try {                     // 次のことをやってみる
                Thread.sleep(100);    // 100ミリ秒待つ
            } catch (InterruptedException e) {  // 割り込みの処理
                return;               // 実行を終了して戻る
            }
            repaint();                // 再描画
            // 描く位置の x, y 座標を変える
            if (x <= 0 || x >= 228) dx = -dx;
            if (y <= 0 || y >= 140) dy = -dy;
            x += dx;  y += dy;
        }
    }
}


考察


実行の流れは,まず最初に並べた変数を作り, 次に init() を実行し, 次に start() を実行し, 次のページに移動するなどで表示が不要になったら stop() を実行します。 メディアトラッカーとは,画像をバックグラウンドで読み込むためのしくみです。 メディアトラッカーを使うには, まずメディアトラッカーを登録しておくための変数を作ります。 変数名は何でもかまいませんが,ここでは mt としています。 mt = new MediaTracker(this); で,新しいメディアトラッカーを 作り,変数 mt に登録します。かっこ内の this は, このアプレットに付随するメディアトラッカーというほどの意味です。 次の Image image; とは, 画像を登録するための変数 image という変数を作るということです。 最初の大文字で始まる Image は,画像を登録するための変数という 意味で,これは決まり文句ですが,次の image は単なる変数名です ので,どんな名前にしてもかまいません。 image = getImage(getDocumentBase(), "e.gif"); で, "e.gif" というGIFファイルを変数 image に 登録します。getDocumentBase() とは, 画像ファイルがHTMLファイルと同じディレクトリにあることを指示するものです。 この時点では,まだ画像ファイルは読み込まれません。 mt.addImage(image, 0); は, こうして変数 image に登録した画像 image を, メディアトラッカー mt に登録します。 この時点で読み込みが始まります。かっこ内の 0 は画像番号です。 start() ではスレッドを作って実行を開始しています。 スレッドの実体は run() です。 ここで0.1秒(100ミリ秒)ごとに絵の x, y 座標を変えています。