プログラミング応用b 第13回 『GUIその2 (AWT/Swingによるイベント処理)』 |
【メニューバーとプルダウンメニュー】
代表的なコンポーネントは,すでに前回で紹介しましたが,ここではメニューバーと,
メニューバーから“引き出される”プルダウンメニューを紹介しておきましょう。
●メニューシステムの構造
まず,メニューバーを持つメニューの構造を説明しておきましょう。Fig.1をみて下さい。
これは,一般的なメニューの構造を表しています。まず,メニューバーという,複数のメ
ニューを登録しておく場所があります(Fig.1-(1))。Fig.1の例では,「ファイル」と「編集」
というタイトルのメニュー2個が登録されています。
メニューバーに登録されているメニュータイトルをクリックすると,メニューの全体が
現れます。Fig.1の例では,「ファイル」メニューの全体が表示されています(Fig.1-(b))。
メニューの中には,選択肢がいくつかならんでいます。この選択肢を,メニュー項目と
呼びます。Fig.1-(1)の「ファイル」メニューでは,「開く」,「最近開いた書類を開く」,
「閉じる」,セパレータ(区切り線,Fig.1-(e)),「印刷」の5項目が登録されています。
セパレータは,性質の異なるメニュー項目をグループに分けて見やすくするのに便利です。
Fig.1の例では,書類の開く・閉じると,印刷をセパレータを使って区分けしています。
また,メニュー項目自体がメニューになっているという場合もあります。Fig.1の「ファ
イル」の例では,「最近開いた書類を開く」項目が,メニューになっており,そのメニュー
には「recent1」,「recent2」という2項目が登録されています("recent"という単語は,
"最近の"という意味)。このように,メニュー項目がメニューになっているメニューを,
サブメニューといいます(Fig.1-(d))。
●メニューを表すクラス
Javaでは,メニューも簡単に使用することができます。AWT版では,メニューバーは,
MenuBar,メニューはMenu,メニュー項目はMenuItemというクラスで表現されています。
また,たいていのコンポーネントと同様に,SwingではAWT版のクラス名に頭文字として
Jをつけた名称のクラスが使われます。つまり,メニューバーは,JMenuBar,メニューは
JMenu,メニュー項目はJMenuItemというクラスで表されています。
●AWT版メニューを使う
では,実際のプログラムに沿って,メニューの基本的な使い方を紹介しましょう。List 1
は,AWTでFig.1と同様のメニューを配置・表示するものです。まず,List 1-①でjava.awt
パッケージをインポートし,②でウィンドウを生成しています。
List 1 AWTMenu.java
つぎに,「ファイル」メニューを作成しましょう。メニューを作成するには,Menu型オ
ブジェクトを
new Menu( "メニュータイトル" )
と生成します。List 1-③では,"ファイル"というタイトルを持つメニューfileMenuを作成
しています。
次に,メニュー項目を追加します。メニュー項目は,
new MenuItem( "項目名" )
というようにしてMenuItem型オブジェクトとして生成することができます。List 1-④では,
"開く"という項目名のメニュー項目miOpenを生成しています。
生成したメニュー項目は,メニューに登録することになります。Menuのメソッドadd( )を
使って,メニューにメニュー項目を登録できます。List 1-⑤では,
fileMenu.add( miOpen );
として,ファイルメニューfileMenuにメニュー項目miOpenを追加しています。
次にサブメニューを作成します。サブメニューは,本日的に普通のメニューとかわりません。
つまり,サブメニューもMenu型オブジェクトなのです。メニューにメニュー項目として他の
メニューを追加することで,サブメニューになるのです。
List 1-⑥〜⑩は,サブメニュー「最近開いた書類を開く」を作成して「ファイル」
メニューにサブメニューとして登録しているところです。List 1-⑥では,「最近開いた書類
を開く」メニューrecentMenuを作成し,List 1-⑦〜⑨でメニュー項目「recent1」と
「recent2」を作成して,「最近開いた書類を開く」メニューに登録しています。
作成した「最近開いた書類を開く」メニューをサブメニューとして「ファイル」メニューに
登録しているのがList 1-⑩の
fileMenu.add( recentMenu );
という部分です。
List 1-⑪では,「閉じる」メニューを作成し,「ファイル」メニューに追加しています。
List 1-⑫は,MenuクラスのメソッドaddSeparator( )を使って,「ファイル」メニュー
にセパレータを追加しています。List 1-⑬では,「印刷」メニューを作成して,「ファイル」
メニューに追加しています。Fig.1のメニューの例では,「ファイル」メニューの他に「編集」
メニューもあります。List 1-⑭では,その「編集」メニューを作成しています。
メニューの仕上げに,メニューバーを作成し,作成した「ファイル」メニューと「編集」
メニューをメニューバーに追加しましょう。メニューバーの作成はList 1-⑮の
MenuBar mbar = new MenuBar( );
というように,単にMenuBar型オブジェクトを生成すればOKです。メニューバーにメニューを
追加するには,MenuBarクラスのadd( )メソッドを使います。List 1-⑯の
mbar.add( fileMenu );
mbar.add( editMenu );
で,メニューバーにまず「ファイル」メニューを追加し,次に「編集」メニューを追加しています。
さて,ウィンドウにメニューバーを追加するには,FrameクラスのsetMenuBar( )メソッドを使
います。
List 1-⑰では
f.setMenuBar( mbar );
として,ウィンドウfにメニューバーmbarを追加しています。
最後に,ウィンドウを可視化しているところがList 1-⑱です。List 1を実行すると,Fig.2の
ように,メニューが使用できるようになります。実際に動かして試してみてください。
メニューバーに登録されるメニューは,左から右へ登録されていくことが分かります。この例では,
「ファイル」メニュー,「編集」メニューの順にメニューバーに追加したので(List 1-⑯),
メニューバーの左から右に「ファイル」メニュー,「編集」メニューが登録されています。
また,メニュー項目は,上から下へ登録されていきます。この例では,「開く」,「最近開いた書類を開く」,
セパレータ,「印刷」メニューの順に「ファイル」メニューに追加したので,「ファイル」メニュー
にはこの順で上から下にメニュー項目が登録されているわけです。なおMenuには,好きな位置に
メニュー項目を挿入するinsert( )メソッドや,メニュー項目を削除するremove( )メソッドなども用意
されています。
ところでAWT版メニューでは,Fig.2-(1)とFig.2-(2)を比べるとわかるように,MacOS Xの場合,
メニューバーはウィンドウの外にあるのに対し,Windowsではウィンドウの中にメニューが配置されます。
●Swing版メニューを使う
次に,Swing版のメニューを使用してみましょう。List 1をSwing版に書き換えたのが,
List 2です。List 2-①〜⑱は,それぞれList 1-①〜⑱に対応していますので,
比較してみてください。
List 2 SwingMenu.java
Swing版は,基本敵にAWT版と変わりません。Menu,MenuItem,MenuBarのかわり
にそれぞれJMenu,JMenuItem,JMenuBarを使用することが大きな違いです。また注意
すべきこととして,メニューバーをウィンドウに追加するには,JFrameクラスのsetJMenuBar( )
を使わなければならない点があります。List 2-⑰では,
f.setJMenuBar( mbar );
として,JFrame型ウィンドウにJMenuBar型メニューバーmbarを追加しています。
List 2を実行すると,Fig.3のように表示されます。MacOS Xでは,ウィンドウの中に
メニューバーが配置されるのがAWT版との大きな違いです。また,メニューをよく観察す
ると,AWT版のメニューとSwing版メニューでは,外観が少し異なります。Fig.2-(2)と
Fig.3-(2)を比較すると,AWT版がWindows OSが提供する通常のメニューの外観を持って
いるのに対し,Swing版はWindows OSの通常のメニューとは異なる外観を持っています。