メニューバー
メニューと項目
アプリケーションやアプレットのフレームウィンドウのような場合
欠かすことのできないコンポーネントがメニューバーです
ファイルの読み込みや保存、設定や編集といった機能をここに項目としてまとめることができ
通常のGUIアプリケーションならば必ずついている部品ですね
メニューの作成には、まずメニューバーを生成します
全てのメニューは、メニューバーの上に配置されます
メニューバーの生成にはjava.awt.MenuBarクラスを使用します
コンストラクタは次の単純型のみです
public MenuBar()
ここで生成したメニューバーにメニューを追加するには
同クラスのadd()メソッドで登録します
public synchronized Menu add( Menu m )
パラメータに指定するのはjava.awt.Menuクラスです
このクラスは、メニューバーに登録するメニューの情報をカプセル化しています
コンストラクタは次のとおりです
public Menu()
public Menu( String label )
public Menu( String label, boolean tearOff )
一番上の、パラメータに何も指定しなかった場合はラベルなしのメニューになります
labelにはメニューのラベルを文字列で指定します
tearOffは、ティアオフメニューとして生成するかどうかを指定します
ここでtrueを指定すると、ティアオフメニューになります
ティアオフメニューはメニュー項目を切り取って独立したウィンドウとして表示することができる
ただし、プラットフォームによってはサポートしていない(Windowsはサポートしません)
こうして生成したメニューバーですが、このままでは表示されません
これをフレームに張りつける必要があります
メニューバーをフレームに登録するには、FrameクラスのsetMenuBar()で設定します
public synchronized void setMenuBar( MenuBar mb )
mbには、生成したメニューバーを指定します
これで、フレームウィンドウにメニューバーが表示されます
import java.awt.*;
import java.awt.event.*;
class test extends WindowAdapter {
public static void main(String args[]) {
test win = new test();
win.start(new Frame("Kitty on your lap"));
}
private void start(Frame frm) {
frm.setSize(400 , 400);
frm.setVisible(true);
frm.addWindowListener(this);
MenuBar mb = new MenuBar();
mb.add(new Menu("Sakura"));
mb.add(new Menu("Tomoyo" , true));
frm.setMenuBar(mb);
}
public void windowClosing(WindowEvent e) {
System.exit(1);
}
}
これで、メニューバーにSakuraとTomoyoというメニューが表示されます
ですが、当然これだけでは何もできません
メニューにはメニュー項目が必要です
メニューに項目を追加するには、Menuクラスのadd()メソッドを使用します
public synchronized MenuItem add( MenuItem mi )
public void add( String label )
下の構文のlabelには、メニュー項目の文字列を表現を指定します
この場合は、指定された文字列でメニュー項目が追加されます
ただし、Menuクラスにアクションイベントはないので、イベント処理が(簡単には)できないことと
メニュー項目の情報をカプセル化していないことが条件となる
もう一方の構文の mi にはMenuItemクラスのオブジェクトを渡します
戻り値は、追加されたメニュー項目を返します
通常のメニュー項目としての役割をたすにはjava.awt.MenuItemクラスを使います
コンストラクタは次のものがあります
public MenuItem()
public MenuItem( String label )
public MenuItem( String label, MenuShortcut s )
labelには、メニュー項目となるラベルを指定します
パラメータに何も指定しなかった場合は、ラベルのない項目が生成されます
sには、MenuShortcutクラスのオブジェクトを渡します
これはショートカットキーを定義するものですが、この場では取り扱いません
import java.awt.*;
import java.awt.event.*;
class test extends WindowAdapter {
public static void main(String args[]) {
test win = new test();
win.start(new Frame("Kitty on your lap"));
}
private void start(Frame frm) {
frm.setSize(400 , 400);
frm.setVisible(true);
frm.addWindowListener(this);
MenuBar mb = new MenuBar();
Menu sakura = mb.add(new Menu("Sakura"));
Menu tomoyo = mb.add(new Menu("Tomoyo" , true));
sakura.add("絶対大丈夫だよ");
sakura.add("ほえぇ〜〜");
tomoyo.add(new MenuItem("さくらちゃんならきっと出来ますわ"));
tomoyo.add(new MenuItem("大きな肉まん…"));
frm.setMenuBar(mb);
}
public void windowClosing(WindowEvent e) {
System.exit(1);
}
}
Menu.sakuraオブジェクトには、文字列(Stringオブジェクト)の項目を渡しています
Menu.tomoyoのほうは、MenuItemクラスのオブジェクトを渡しています
メニューを選択してクリックすると、項目が出現します
これで、見た目の実装は本物っぽくなりましたね
メニューのイベントといえば、通常はアクションイベントです
アクションリスナの登録はMenuItemクラスのaddActionListener()から行います
このイベントに関してはもはや説明不要でしょう
import java.awt.*;
import java.awt.event.*;
class test extends WindowAdapter implements ActionListener {
Frame frm;
public static void main(String args[]) {
test win = new test();
win.start();
}
private void start() {
frm = new Frame("Kitty on your lap");
frm.setSize(400 , 400);
frm.setVisible(true);
frm.addWindowListener(this);
MenuBar mb = new MenuBar();
Menu kitty = mb.add(new Menu("Kitty"));
MenuItem rena = kitty.add(new MenuItem("RENA"));
MenuItem yuki = kitty.add(new MenuItem("YUKI"));
MenuItem mimi = kitty.add(new MenuItem("MIMI"));
rena.addActionListener(this);
yuki.addActionListener(this);
mimi.addActionListener(this);
frm.setMenuBar(mb);
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == "RENA") frm.setBackground(Color.red);
if (e.getActionCommand() == "YUKI") frm.setBackground(Color.blue);
if (e.getActionCommand() == "MIMI") frm.setBackground(Color.orange);
}
public void windowClosing(WindowEvent e) {
System.exit(1);
}
}
メニュー項目をクリックすると、背景色が変更するアプリケーションです
実用的アプリケーションには欠かすことのできない機能の一つですね
その他のメニューバーの機能
このほかにも、メニューバーには高度な機能が存在します
ここでは、実用に耐えうるメニューバーの作成に欠かせない機能を紹介します
メニュー項目には通常、項目の論理的(直感的)な項目別に区切りを入れます
これをセパレータと言いますが、Javaはこれをサポートしています
セパレータはブラウザのメニュー項目を表示させればわかると思います(見た目はプラットフォームで異なりますが)
メニューにセパレータを追加するにはMenuクラスのaddSeparator()メソッドを使用します
public void addSeparator()
このメソッドは、現在のメニューにセパレータを項目として追加します
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class test extends Frame {
public static void main(String args[]) {
test win = new test();
win.appRun();
}
public void appRun() {
Frame frm = new Frame("Kitty on your lap");
frm.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
MenuBar mb = new MenuBar();
Menu m = mb.add(new Menu("LOVE"));
m.add(new MenuItem("Kitty on your lap"));
m.addSeparator();
m.add(new MenuItem("CardCaptorSakura"));
frm.setMenuBar(mb);
frm.setSize(400 ,300);
frm.setVisible(true);
}
}
このアプリケーションを実行すると、メニュー項目の間に線が引かれています
セパレータを指定位置に追加するには、同クラスのメソッドでinsertSeparator()があります
public void insertSeparator( int index )
indexには、メニュー項目の一番上を0とした
セパレータの挿入位置を指定します
またMenuBarクラスは、ヘルプメニューの実装をサポートしています
ヘルプメニューの外装はプラットフォームによって異なり
Windowsプラットフォームでは、メニューのもっとも右側にヘルプが追加されますが
Motifでは、メニューの数に関係なくバーの右側に配置されます
ヘルプメニューの追加には、MenuBarクラスのsetHelpMenu()を使用します
public synchronized void setHelpMenu( Menu m )
指定されたメニュー m をヘルプメニューとして追加します
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class test extends Frame {
public static void main(String args[]) {
test win = new test();
win.appRun();
}
public void appRun() {
Frame frm = new Frame("Kitty on your lap");
frm.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
MenuBar mb = new MenuBar();
mb.add(new Menu("Kitty"));
mb.setHelpMenu(new Menu("help"));
frm.setMenuBar(mb);
frm.setSize(400 ,300);
frm.setVisible(true);
}
}