画像を切り替える

さて画像を貼り付けて、選択と同時に切り替えるようにします。これでOrder Pizzaらしくなります。ソースはOrderPizza04.javaで、画面は左です。

まず画像を貼り付けるために

try {
    pizza = Image.createImage("/images/SMALL.png");
} catch (java.io.IOException ex) {
    System.out.println("Cannot read /images/SMALL.png");
}

[注意]FCSではcreateImage(String name)IOExceptionを投げるようになりました。EA1からのユーザは注意しましょう。

で画像を読みこんで、

imageIndex = orderForm.append(pizza);

[注意]EA1のときはメソッド名がappendImageだったのがFCSではappendに変わってます。EA1からのユーザは注意しましょう。

で貼り付けます。戻り値をimageIndexに保存するのは画像を切り替えるときに用いたいからです。

画像切り替えのためにitemStateChanged()を大幅に変更します。

public void itemStateChanged(Item item) {
    if (item == size || item == topping) {
        int selectedSize = size.getSelectedIndex();

        boolean[] selectedTopping = new boolean[topping.size()];
        topping.getSelectedFlags(selectedTopping);

        String fileName = "/images/";
        if (selectedTopping[0]) fileName += "GREEN-";
        if (selectedTopping[1]) fileName += "PINE-";
        if (selectedTopping[2]) fileName += "PEP-";

        switch (selectedSize) {
        case 0:
            fileName += "SMALL.png";
            break;
        case 1:
            fileName += "MEDIUM.png";
            break;
        case 2:
            fileName += "LARGE.png";
            break;
        default:
            break;
        }

        orderForm.delete(imageIndex);

        System.out.println(fileName);
        try {
            pizza = Image.createImage(fileName);
        } catch (java.io.IOException ex) {
            System.out.println("Cannot read " + fileName);
        }
        imageIndex = orderForm.append(pizza);
    }
}

本質的な操作は

orderForm.delete(imageIndex);

pizza = Image.createImage(fileName);
imageIndex = orderForm.append(pizza);

の三行です。

[注意]EA1のときはメソッド名がdeleteItemだったのがFCSではdeleteに、同様にappendImageappendに変わってます。またcreateImageIOExceptionを投げるようになってます。EA1からのユーザは注意しましょう。

という動作です。選択によって貼り付ける画像を切り替えるので、残りの部分はそのための処理です。見ていきましょう。

topping.getSelectedFlags(selectedTopping);

String fileName = "/images/";
if (selectedTopping[0]) fileName += "GREEN-";
if (selectedTopping[1]) fileName += "PINE-";
if (selectedTopping[2]) fileName += "PEP-";

で、トッピングの処理をしてます。GreenPeppersが選択されているときはファイル名にGREEN-を含め、同様にPineapple、Pepperoniが選択されているときはファイル名にPINE-PEP-を加えます。

int selectedSize = size.getSelectedIndex();

switch (selectedSize) {
case 0:
    fileName += "SMALL.png";
    break;
case 1:
    fileName += "MEDIUM.png";
    break;
case 2:
    fileName += "LARGE.png";
    break;
default:
    break;
}

がサイズの処理で選択されたサイズをファイル名に加えます。

これで選択にしたがって適切なファイルを読みこめるようになりました。例えばサイズがLargeでトッピングとしてGreenPeppers、Pepperoniが選択されている場合は/images/GREEN-PEP-LARGE.GIFを読みこみます。

さて実行して見ましょう。

D:\midp-fcs\segi\pizza>javac -bootclasspath /midp-fcs/classes OrderPizza04.java
D:\midp-fcs\segi\pizza>preverify -classpath .;/midp-fcs/classes OrderPizza04
D:\midp-fcs\segi\pizza>cd output
D:\midp-fcs\segi\pizza\output>set SCREEN_DEPTH=8
D:\midp-fcs\segi\pizza\output>midp OrderPizza04

画像ファイルはhttp://developer.java.sun.com/developer/onlineTraining/GUI/Swing1/Magercises/M4/index.htmlから入手すると良いです。そのまま使うと大きすぎるので適当な大きさに縮小して、PNGフォーマットにして用います。

どうですか?選択と同時に画像が切り替わりますね。


前の項目へ次の項目へ
「MIDPで遊ぼう!」のページへ
せぎてつ伝言板
このページの感想をどうぞ!
お名前(匿名OK):

メールアドレス:
最終更新日 : 2000年10月7日(土)
tetsu@segi.org