Previous | Next | Trail Map | Creating a User Interface | GUI の構成ブロックであるコンポーネントを使 用する


メニューの使用方法

次のアプレットで、使用頻度の高い多数のメニュー機能を紹介する。 このアプレットが起動するウィンドウには 5 つのメニューを含むメニューバーがあ る。 それぞれのメニューは 1 つかそれ以上の項目をもっている。 Menu 1 はティアオフメニューである。破線をクリックすると、Menu 1 と同じメニュ ー項目をもつ新しいウィンドウが作成される。 (現在のところ、ティアオフメニューは Solaris プラットフォームでのみ実装されて おり、Windows 95/NT や MacOS では実装されていない。) Menu 2 の項目は 1 つのチェックボックスだけである。 Menu 3 は 2 番目と 3 番目の項目の間に区切りがある。 Menu 4 はサブメニューをもつ。 Menu 5 はウィンドウのヘルプメニューであり、(プラットフォームによって異なるが ) 一般には右端に配置される。 ユーザがメニュー項目のどれかをクリックすると、どの項目がクリックされたか、ま たその項目がどのメニューにあったかを示す文字列がウィンドウに表示されるように なっている。


使用中のブラウザは <APPLET> タグを理解しない。 ボタンが起動するウィンドウのスナップショットを示す。

Menu 1 を押すと、ティアオフインジケータが現れる。

ティアオフされたメニューはこのようになる。

Menu 2 にはチェックボックスの項目がある。

Menu 3 には区切りがある。

Menu 4 にはサブメニューがある。


このアプレットがメニューを実演するのにウィンドウを起動するのは、AWT がメニュ ーを使用できる場所を制限しているからである。 メニューはメニューバーにしか存在できず、メニューバーはウィンドウ (具体的には Frame) にしか貼り付けられない。

メニューがプログラムにとって適切でなかったり、使用できない場合は、ユーザにオ プションを示す別の方法として、 チェックボックス選択肢リストを検討してみる。

AWT のメニュー機能はいくつかのクラスによって提供される。 これらのクラスは Component からは継承しない。これは、多くのプラットフ ォームがメニューの性能に厳密な制限を課しているからである。 その代わりに、メニュークラスは MenuComponent(in the API reference documentation) クラスから継承する。 AWT はメニューのサポートのために以下のような MenuComponent サブクラスを用意 している。

MenuItem(in the API reference documentation)
メニューの各項目が MenuItem オブジェクトによって表現される。
CheckboxMenuItem(in the API reference documentation)
チェックボック スをもつ各メニュー項目が CheckboxMenuItem オブジェクトによって表現される。 CheckboxMenuItem は MenuItem のサブクラスである。
Menu(in 
the API reference documentation)
各メニューが Menu オブジェクトに よって表現される。 あるメニューを別のメニューに追加して簡単にサブメニューを作成できるよう に、Menu は MenuItem のサブクラスとして実装されている。
MenuBar(in the API reference documentation)
メニューバーは MenuBar クラスによって実装される。 MenuBar はウィンドウに貼り付けられたメニューグループのプラットフォーム 独自の考え方を表すものである。 MenuBar は Panel とは結合されない

MenuComponent を含むことができるようにするには、オブジェクトが MenuContainer(in the API reference documentation) インタフェースに従っていなけ ればならない。 現在、MenuContainer を実装している AWT クラスは、Frame、Menu、および MenuBar クラスだけである。

上記のアプレットが起動するウィンドウの コード を示す。 このコードはスタンドアローンのアプリケーションとしても、または AppletButton クラスを利用してアプレット としても実行することができる。 ここで、メニューを扱うコード部分を示す。

public class MenuWindow extends Frame {
    . . .
    public MenuWindow() {
        MenuBar mb;
        Menu m1, m2, m3, m4, m4_1, m5;
        MenuItem mi1_1, mi1_2, mi3_1, mi3_2, mi3_3, mi3_4,
                 mi4_1_1, mi5_1, mi5_2;
        CheckboxMenuItem mi2_1;

        ...//出力表示子をこのウィンドウに追加する...

        //メニューバーを構築する。
        mb = new MenuBar();
        setMenuBar(mb);

        //メニューバーに最初のメニューを構築する。
        //2 番目の引数を true に指定すると
        //これがティアオフメニューになる。
        m1 = new Menu("Menu 1", true);
        mb.add(m1);
        mi1_1 = new MenuItem("Menu Item 1_1");
        m1.add(mi1_1);
        mi1_2 = new MenuItem("Menu Item 1_2");
        m1.add(mi1_2);

        //ヘルプメニューを構築する。
        m5 = new Menu("Menu 5");
        mb.add(m5); //機能しないヘルプメニューを設定するだけ。追加の必要があ  
る。
        mb.setHelpMenu(m5);
        mi5_1 = new MenuItem("Menu Item 5_1");
        m5.add(mi5_1);
        mi5_2 = new MenuItem("Menu Item 5_2");
        m5.add(mi5_2);

        //メニューバーに 2 番目のメニューを構築する。
        m2 = new Menu("Menu 2");
        mb.add(m2);
        mi2_1 = new CheckboxMenuItem("Menu Item 2_1");
        m2.add(mi2_1);

        //メニューバーに 3 番目のメニューを構築する。
        m3 = new Menu("Menu 3");
        mb.add(m3);
        mi3_1 = new MenuItem("Menu Item 3_1");
        m3.add(mi3_1);
        mi3_2 = new MenuItem("Menu Item 3_2");
        m3.add(mi3_2);
        m3.addSeparator();
        mi3_3 = new MenuItem("Menu Item 3_3");
        m3.add(mi3_3);
        mi3_4 = new MenuItem("Menu Item 3_4");
        mi3_4.disable();
        m3.add(mi3_4);

        //メニューバーに 4 番目のメニューを構築する。
        m4 = new Menu("Menu 4");
        mb.add(m4);
        m4_1 = new Menu("Submenu 4_1");
        m4.add(m4_1);
        mi4_1_1 = new MenuItem("Menu Item 4_1_1");
        m4_1.add(mi4_1_1);
    }
    . . .
    public boolean action(Event event, Object arg) {
        String str = "Action detected";

        if (event.target instanceof MenuItem) {
            MenuItem mi=(MenuItem)(event.target);
            str += " on " + arg;
            if (mi instanceof CheckboxMenuItem) {
                    str += " (state is "
                           + ((CheckboxMenuItem)mi).getState()
                           + ")";
            }
            MenuContainer parent = mi.getParent();
            if (parent instanceof Menu) {
                str += " in " + ((Menu)parent).getLabel();
            } else {
                str += " in a container that isn't a Menu";
            }
        }
        str += ".¥n";
        ...//出力エリアに文字列を表示する...
        return false;
    }


Previous | Next | Trail Map | Creating a User Interface | GUI の構成ブロックであるコンポーネントを使 用する