ちょっと改良(MediaTracker)

はてさて大体完成しました。ちょっと改良しときたいとこがあるのでやっときます。まずはこうしました。
現在の時刻は です。
現在の時刻は です。
ソースはDigitalClock07.javaです。何したか解りました?

やったことは次の二つです。
さて、java.awt.MediaTrackerクラスを利用すると上の二つを実現することができます。ソースをどういじったのか見てきましょう。

取り敢えずはMediaTracker型のインスタンス変数を宣言します。
    private MediaTracker tracker;
initメソッドの中でこれを
    tracker = new MediaTracker(this);
のように初期化し、読み込んだ画像をaddImageメソッドを使ってMediaTrackerに登録していきます。
    for (int i = 0; i < 10; i++) {
        digits[i] = getImage(getDocumentBase(), imageDir + i + ".gif");
        tracker.addImage(digits[i], 0);
    }
    digits[10] = getImage(getDocumentBase(), imageDir + "C.gif");
    tracker.addImage(digits[10], 0);

    isAMPM = (getParameter("am_pm") != null) ? true : false;
    if (isAMPM) {
        digits[11] = getImage(getDocumentBase(), imageDir + "A.gif");
        digits[12] = getImage(getDocumentBase(), imageDir + "P.gif");
        tracker.addImage(digits[11], 1);
        tracker.addImage(digits[12], 1);
    }
addImageメソッドの二番目の引数はIDです。これは利用者が適当に決めれば良くて、ID毎に処理を分けることができます。
ここでは数字と“:”の画像のIDは0、AM・PMを表す画像のIDは1にしてます。あとで見るように数字の画像がない場合はエラーにし、AM・PMの画像がない場合は処理を続行させるようにするためです。

次にrunメソッドを変更して
    try {
        tracker.waitForAll();
    } catch (InterruptedException e) {
        return;
    }
という記述を加えます。この中の
    tracker.waitForAll();
が「全ての画像をロードするまで待て」という命令です。
でも実際は単純に待ってるわけじゃないとか色々あるんですがキチンと説明できません。MediaTracker使う場合はrunメソッドにこんな感じの記述するのがお約束だぐらいに思っといてください。

あとはpaintメソッドに手を加えます。
    if (tracker.isErrorID(0)) {
        g.setColor(Color.white);
        g.fillRect(0, 0, getSize().width, getSize().height);

        String timeString = currentTime.get(Calendar.HOUR) + " : " +
                            currentTime.get(Calendar.MINUTE) + " : " +
                            currentTime.get(Calendar.SECOND);
        g.setColor(Color.black);
        g.drawString(timeString, 0, 15);

        showStatus("Applet DigitaClock can't find image files.");
        return;
    }
まずはこの記述を追加しました。最初の
    if (tracker.isErrorID(0)) {
で、MediaTrackerにID=0で登録した画像の読み込みにエラーがないか調べてます。ここでは数字の画像と“:”の画像の読み込みにエラーがないかを調べてることになります。
もしエラーがあったら背景を白で塗りつぶして、現在時刻を文字列で表示させてます。さらに、
    showStatus("Applet DigitaClock can't find image files.");
でブラウザやアプレットビューアのステータス・ウィンドウに画像ファイルが見つからない旨 表示させています。

続いて
    if (tracker.checkAll()) {
で全ての画像が読み込まれたかどうか調べてます。読み込まれた場合はいままでと同様に画像を表示します。ただちょっと違うのは
    if (isAMPM && !tracker.isErrorID(1)) {
        g.drawImage(digits[(currentTime.get(Calendar.AM_PM) == 0) ? 11 : 12], imageWidth, 0, this);
        imageWidth += digits[(currentTime.get(Calendar.AM_PM) == 0) ? 11 : 12].getWidth(this);
    }
とAM・PMの画像を表示する部分でID=1の画像の読み込みにエラーがないかを条件に加えています。エラーがない場合はAM・PMの画像を表示し、エラーがあった場合は何もしません。

全ての画像が読み込まれていないうちは
    } else {
        g.setColor(Color.white);
        g.fillRect(0, 0, getSize().width, getSize().height);

        g.setColor(Color.black);
        g.drawString("Loading...", 0, 15);

        return;
    }
と背景を白で塗りつぶして“Loading...”というメッセージを表示させています。

前の項目へ次の項目へ
「メイキング・オブ・DigitalClock」へ

最終更新日 : 1999年3月14日(日)

カメ飼ってます Valid HTML 4.0! Made with CSS midosabu@postpet.so-net.ne.jp