GUI の構成ブロックであるコンポーネントを使 用する |
次のアプレットで、使用頻度の高い多数のメニュー機能を紹介する。 このアプレットが起動するウィンドウには 5 つのメニューを含むメニューバーがあ る。 それぞれのメニューは 1 つかそれ以上の項目をもっている。 Menu 1 はティアオフメニューである。破線をクリックすると、Menu 1 と同じメニュ ー項目をもつ新しいウィンドウが作成される。 (現在のところ、ティアオフメニューは Solaris プラットフォームでのみ実装されて おり、Windows 95/NT や MacOS では実装されていない。) Menu 2 の項目は 1 つのチェックボックスだけである。 Menu 3 は 2 番目と 3 番目の項目の間に区切りがある。 Menu 4 はサブメニューをもつ。 Menu 5 はウィンドウのヘルプメニューであり、(プラットフォームによって異なるが ) 一般には右端に配置される。 ユーザがメニュー項目のどれかをクリックすると、どの項目がクリックされたか、ま たその項目がどのメニューにあったかを示す文字列がウィンドウに表示されるように なっている。
このアプレットがメニューを実演するのにウィンドウを起動するのは、AWT がメニュ ーを使用できる場所を制限しているからである。 メニューはメニューバーにしか存在できず、メニューバーはウィンドウ (具体的には Frame) にしか貼り付けられない。
メニューがプログラムにとって適切でなかったり、使用できない場合は、ユーザにオ プションを示す別の方法として、 チェックボックス、 選択肢、 リストを検討してみる。
AWT のメニュー機能はいくつかのクラスによって提供される。 これらのクラスは Component からは継承しない。これは、多くのプラットフ ォームがメニューの性能に厳密な制限を課しているからである。 その代わりに、メニュークラスは MenuComponent クラスから継承する。 AWT はメニューのサポートのために以下のような MenuComponent サブクラスを用意 している。
- MenuItem
- メニューの各項目が MenuItem オブジェクトによって表現される。
- CheckboxMenuItem
- チェックボック スをもつ各メニュー項目が CheckboxMenuItem オブジェクトによって表現される。 CheckboxMenuItem は MenuItem のサブクラスである。
- Menu
- 各メニューが Menu オブジェクトに よって表現される。 あるメニューを別のメニューに追加して簡単にサブメニューを作成できるよう に、Menu は MenuItem のサブクラスとして実装されている。
- MenuBar
- メニューバーは MenuBar クラスによって実装される。 MenuBar はウィンドウに貼り付けられたメニューグループのプラットフォーム 独自の考え方を表すものである。 MenuBar は Panel とは結合されない。
MenuComponent を含むことができるようにするには、オブジェクトが MenuContainer インタフェースに従っていなけ ればならない。 現在、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; }
GUI の構成ブロックであるコンポーネントを使 用する |