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 座標を変えています。