色んな画像を使おう

せっかく作ったんだから色んな画像使ってみたいですな。こんな風に
現在の時刻は です。
現在の時刻は です。
現在の時刻は です。
現在の時刻は です。
ソースはDigitalClock03.javaです。

まえのソースで特定の画像に決め打ちしてた読み込みの部分
    for (int i = 0; i < 10; i++) {
        digits[i] = getImage(getDocumentBase(), "images/pdg/" + i + ".gif");
    }
    digits[10] = getImage(getDocumentBase(), "images/pdg/C.gif");
とやはり決め打ちしてたpaintメソッドの中の変数の値
    int imageWidth = 15;
の部分を書き換えてコンパイルし直せばどんな画像でも使えます。
でも使いたい画像を増やすたびにリコンパイルしてるのはなんなので、画像のディレクトリをパラメータで指定できるようにして、画像の幅はプログラム中で取得するようにしました。

画像のディレクトリをパラメータ化したので画像を読み込む部分は
    String imageDir = getParameter("imagedir");
    for (int i = 0; i < 10; i++) {
        digits[i] = getImage(getDocumentBase(), imageDir + i + ".gif");
    }
    digits[10] = getImage(getDocumentBase(), imageDir + "C.gif");
のようにしました。前のソースでは"images/pdg/"とハードコーディングしてた部分を変数imageDirに置き換えて、その変数はgetParameterで取得してます。
getParameterではアプレットを表示するページ中のAPPLETタグの中のPARAMタグの値を取得します。このアプレットを呼び出すときは
    <APPLET code="DigitalClock03.class" width="248" height="36">
      <PARAM name="imagedir" value="images/pdg/">
    </APPLET>
のようにPARAMタグでimagedirの値をアプレットに渡すようにします。

残るは画像の幅の取得はpaintメソッドの中の
    int imageWidth = digits[0].getWidth(this);
で行っています。
画像の幅はImageクラスに定義されたgetWidthメソッドで取得できます。ただし、画像はgetImageメソッドが呼ばれたときにすぐ読み込まれるわけではなく実際に描画されるときに読み込まれるので、このメソッドを使うには注意が必要です。画像が読み込まれる前にgetWidthを呼ぶと-1が返ってきます。
今回のようにpaintメソッドの中に書いてる場合は、まあ色々と大人の事情はあるんですが、結論としてはうまくいきます。

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

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

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