メニュー項目


メニューボタンの作成

メニュー項目は javax.swing.JMenuItem クラスで表されます
JMenu は、JMenuItem のインスタンスを内部で管理しているのです
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.AbstractButton
                          |
                          +--javax.swing.JMenuItem

public class JMenuItem extends AbstractButton
		implements Accessible, MenuElement
メニュー項目が AbstractButton を継承していることに注目してください
Swing の統一された設計思想がこの場でもうかがえます
このクラスのコンストラクタは次のようなものがあります

public JMenuItem()
public JMenuItem(Icon icon)
public JMenuItem(String text)
public JMenuItem(Action a)
public JMenuItem(String text , Icon icon)
public JMenuItem(String text , int mnemonic)

icon には表示するアイコンを、text にはラベルとなるテキストを
a には必要なプロパティを保有したアクションを指定します
mnemonic にはキーボードニーモニックを指定します
キーボードニーモニックには、KeyEvent クラスのキーコードを入力します

JMenuItem を使えば、より細かいメニュー項目を作ることができます
Swing におけるメニュー項目はボタンの一種なので、アイコンなどを指定することができます
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	public void init() {
		JMenuBar menuBar = new JMenuBar();
		JMenu menu = new JMenu("Forget me Not");
		Icon saya = new ImageIcon("saya.jpg");
		Icon koyori = new ImageIcon("koyori.jpg");
		menu.add(new JMenuItem("沙耶" , saya));
		menu.add(new JMenuItem("こより" , koyori));

		menuBar.add(menu);
		setJMenuBar(menuBar);
	}
}
このプログラムは、メニュー項目にアイコンを設定しています
基本機能は AbstractButton なので、原理はボタンとほとんど同じです


チェックメニュー

メニュー項目の性質がボタンと同じであるということは
メニュー項目としてチェックボックスやラジオボタンが存在するべきです

予想通り、Swing はチェック機能のあるメニュー項目を提供しています
チェックメニューは javax.swing.JCheckBoxMenuItem クラスで表されます
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.AbstractButton
                          |
                          +--javax.swing.JMenuItem
                                |
                                +--javax.swing.JCheckBoxMenuItem

public class JCheckBoxMenuItem extends JMenuItem
		implements SwingConstants, Accessible
このクラスのコンストラクタは次のようなものがあります

public JCheckBoxMenuItem()
public JCheckBoxMenuItem(Icon icon)
public JCheckBoxMenuItem(String text)
public JCheckBoxMenuItem(Action a)
public JCheckBoxMenuItem(String text , Icon icon)
public JCheckBoxMenuItem(String text , boolean b)
public JCheckBoxMenuItem(String text , Icon icon , boolean b)

icon には表示するアイコンを、text にはラベルテキストを指定します
a はプロパティを格納したアクションを b は選択状態を表す論理値を指定します
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	public void init() {
		JMenuBar menuBar = new JMenuBar();
		JMenu menu = new JMenu("Forget me Not");
		menu.add(new JCheckBoxMenuItem("エアリオ"));
		menu.add(new JCheckBoxMenuItem("香澄"));

		menuBar.add(menu);
		setJMenuBar(menuBar);
	}
}


このプログラムは、二つのチェックボックスメニューを作成しています
上の図のうち、「エアリオ」メニューがチェックされた状態の項目です

同様にラジオボタンメニューも作成することができます
これは javax.swing.JRadioButtonMenuItem クラスを使います
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.AbstractButton
                          |
                          +--javax.swing.JMenuItem
                                |
                                +--javax.swing.JRadioButtonMenuItem

public class JRadioButtonMenuItem
	extends JMenuItem implements Accessible
このクラスは、次のようなコンストラクタを公開しています

public JRadioButtonMenuItem()
public JRadioButtonMenuItem(Icon icon)
public JRadioButtonMenuItem(String text)
public JRadioButtonMenuItem(Action a)
public JRadioButtonMenuItem(String text , Icon icon)
public JRadioButtonMenuItem(String text , boolean selected)
public JRadioButtonMenuItem(Icon icon , boolean selected)
public JRadioButtonMenuItem(String text , Icon icon , boolean selected)

icon にはアイコンを、text には表示されるテキストを
a にはアクション、selected は選択状態を表す論理値を指定します
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	public void init() {
		JMenuBar menuBar = new JMenuBar();
		JMenu menu = new JMenu("Forget me Not");		
		JMenuItem item1 = new JRadioButtonMenuItem("エアリオ" , true);
		JMenuItem item2 = new JRadioButtonMenuItem("香澄");

		ButtonGroup group = new ButtonGroup();
		group.add(item1);
		group.add(item2);

		menu.add(item1);
		menu.add(item2);

		menuBar.add(menu);
		setJMenuBar(menuBar);
	}
}


このプログラムは、二つのラジオボタンメニュー項目を作成します
ラジオボタンは、「エアリオ」メニュー項目がデフォルトとして選択されています
これら二つの項目は、同一のボタングループに登録しています


コンポーネントメニュー

Swing のメニューには JMenuItem 以外に、コンポーネントを追加することができます
これは add() メソッドに Component のインスタンスを渡すことで実現できます

この機能によって、メニューに他の Swing コンポーネントを追加することができるうえ
理論的に AWT の重量コンポーネントを追加することも可能です
もちろん Swing ベースのアプリケーションにおいてL&Fがピアに依存する
AWT の重量コンポーネントを使うのは避けるべきだということは言うまでもありません
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	public void init() {
		JMenuBar menuBar = new JMenuBar();
		JMenu menu = new JMenu("Forget me Not");
		menu.add(new JButton("エアリオ"));
		menu.add(new Button("香澄"));

		Choice choice = new Choice();
		choice.add("沙耶");
		choice.add("真綾");
		menu.add(choice);

		menuBar.add(menu);
		setJMenuBar(menuBar);
	}
}


このプログラムでは Swing の JButton のほかに
AWT の Button と Choice コンポーネントをメニューに追加しています


プルライトメニュー

JMenu クラスは JMenuItem クラスを継承しています
そして、add() メソッドで JMenuItem を受け入れることができるため
これは、同時に JMenu のインスタンスを項目として追加できることを意味しています

JMenu に JMenu を項目として追加できるという事実は
用意にメニュー項目の入れ子構造プルライトメニューが実現できるということです
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	public void init() {
		JMenuBar menuBar = new JMenuBar();
		JMenu menu = new JMenu("Pure Girls");
		JMenu sub1 = new JMenu("Nekomimi");
		JMenu sub2 = new JMenu("Kitty on your lap");

		sub2.add(new JMenuItem("Rena"));
		sub2.add(new JMenuItem("Yuki"));
		sub2.add(new JMenuItem("Mimi"));

		sub1.add(new JMenuItem("Tokyo mew mew"));
		sub1.add(new JMenuItem("Magical nyan nyan TARUTO"));
		sub1.add(sub2);

		menu.add(sub1);
		menuBar.add(menu);
		setJMenuBar(menuBar);
	}
}


これは、JMenu に対して JMenu を追加しているプログラムの例です
JMenu のオブジェクト menu に add() メソッドから sub1 を追加しています
さらに JMenu のオブジェクト sub1 に、JMenu の sub2 を追加しています

add() メソッドは JMenuItem を受け付けるため
JMenuItem のサブクラスである JMenu も項目として追加できるのです



前のページへ戻る次のページへ