ラジオボタン型メニューアイテムの追加

広告

メニューアイテムの一つとしてラジオボタン型のメニューアイテムの使い方を確認していきます。ラジオボタン型メニューアイテムを作成するにはJRadioButtonMenuItemクラスを使用します。JRadioButtonMenuItemクラスは次のように定義されています。

public class JCheckBoxMenuItem
extends JMenuItem implements SwingConstants, Accessible
java.lang.Object
 L java.awt.Component
     L java.awt.Container
         L javax.swing.JComponent
             L javax.swing.AbstractButton
                 L javax.swing.JMenuItem
                     L javax.swing.JRadioButtonMenuItem

ラジオボタン型のメニューアイテムはJMenuItemクラスのサブクラスとなっています。

JRadioButtonMenuItemクラスを利用するにはコンストラクタを使ってJRadioButtonMenuItemクラスのオブジェクトを作成します。どのようなコンストラクタが用意されているか確認してみます。

コンストラクタの概要
JRadioButtonMenuItem()
テキストおよびアイコンを指定しないで JRadioButtonMenuItem を作成します。
JRadioButtonMenuItem(Action a)
指定された Action からプロパティーを取得するラジオボタンメニュー項目を作成します。
JRadioButtonMenuItem(Icon icon)
イコンを指定して JRadioButtonMenuItem を作成します。
JRadioButtonMenuItem(Icon icon, boolean selected)
ラジオボタンメニュー項目を、イメージおよび選択状態を指定し、テキストを指定しないで作成します。
JRadioButtonMenuItem(String text)
テキストを指定して JRadioButtonMenuItem を作成します。
JRadioButtonMenuItem(String text, boolean selected)
ラジオボタンメニュー項目を、選択状態とテキストを指定して作成します。
JRadioButtonMenuItem(String text, Icon icon)
ラジオボタンメニュー項目を、Icon とテキストを指定して作成します。
JRadioButtonMenuItem(String text, Icon icon, boolean selected)
ラジオボタンメニュー項目を、テキスト、イメージ、および選択状態を指定して作成します。

多くのコンストラクタが用意されていますが、基本的な考え方はJRadioButtonクラスと同じです。詳しくは「ラジオボタンの作成(JRadioButtonクラス)」を参照して下さい。

ここでは基本となる5番目のコンストラクタを確認してみます。

テキストを指定して JRadioButtonMenuItem を作成します。 

パラメータ:
  text - JRadioButtonMenuItem のテキスト

引数にはラジオボタン型のメニューアイテムに表示される文字列を設定します。

実際の使い方は次のようになります。

JMenu submenu = new JMenu("Encode");

JMenu menu = new JMenu("File");

JMenuItem menuitem1 = new JMenuItem("New");
JMenuItem menuitem2 = new JMenuItem("Open");

JRadioButtonMenuItem radiomenuitem1 = new JRadioButtonMenuItem("Auto Save");
JRadioButtonMenuItem radiomenuitem2 = new JRadioButtonMenuItem("Auto Check");

menu.add(menuitem1);
menu.add(menuitem2);
menu.add(radiomenuitem1);
menu.add(radiomenuitem2);

ラジオボタン型のメニューアイテムも通常のメニューアイテムと同じようにメニューに追加して利用します。

なおラジオボタンの場合と同じくラジオボタン型メニューアイテムも、ラジオボタンをグループにまとめ、複数のラジオボタンの中から一つだけが選択状態にするような使い方が一般的です。ラジオボタン型のメニューアイテムをグループにまとめる場合は次のように記述します。

JMenu submenu = new JMenu("Encode");

JMenu menu = new JMenu("File");

JMenuItem menuitem1 = new JMenuItem("New");
JMenuItem menuitem2 = new JMenuItem("Open");

JRadioButtonMenuItem radiomenuitem1 = new JRadioButtonMenuItem("PNG");
JRadioButtonMenuItem radiomenuitem2 = new JRadioButtonMenuItem("GIF");

ButtonGroup group = new ButtonGroup();
group.add(radiomenuitem1);
group.add(radiomenuitem2);

menu.add(menuitem1);
menu.add(menuitem2);
menu.add(radiomenuitem1);
menu.add(radiomenuitem2);

選択/非選択の設定

ラジオボタン型のメニューアイテムは、選択と非選択の2つの状態を持ちます。ユーザーがメニューアイテム上でクリックすることにより選択/非選択を切り替えることができますが、メソッドを使ってプログラムから状態を設定することができます。

設定するにはJRadioButtonMenuItemクラスの親クラスであるAbstractButtonクラスで用意されているsetSelectedメソッドを使います。

ボタンの状態を設定します。このメソッドは actionEvent をトリガーしない点に注意してください。
プログラム上で動作を変更するには、doClick を呼び出します。

パラメータ:
  b - ボタンが選択されている場合は true、そうでない場合は false

引数にラジオボタンを選択した状態にするか非選択の状態にするかを表すboolean型の値を指定します。trueを指定すれば選択状態となりfalseを指定すれば非選択の状態となります。

また現在の状態を取得するにはJRadioButtonMenuItemクラスの親クラスであるAbstractButtonクラスで用意されているisSelectedメソッドを使います。

ボタンの状態を返します。トグルボタンが選択されている場合は true、そうでない場合は false を
返します。

戻り値:
  トグルボタンが選択されている場合は true、そうでない場合は false

メソッドを実行すると、現在選択されている場合はtrue、選択されていない場合はfalseを返します。

実際の使い方は次のようになります。

JMenu submenu = new JMenu("Encode");

JMenu menu = new JMenu("File");

JMenuItem menuitem1 = new JMenuItem("New");
JMenuItem menuitem2 = new JMenuItem("Open");

JRadioButtonMenuItem radiomenuitem1 = new JRadioButtonMenuItem("PNG");
JRadioButtonMenuItem radiomenuitem2 = new JRadioButtonMenuItem("GIF");

ButtonGroup group = new ButtonGroup();
group.add(radiomenuitem1);
group.add(radiomenuitem2);

menu.add(menuitem1);
menu.add(menuitem2);
menu.add(radiomenuitem1);
menu.add(radiomenuitem2);

radiomenuitem1.setSelected(true);

サンプルプログラム

では実際に試してみます。

SSample21_1.java

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.ButtonGroup;
import java.awt.Container;
import java.awt.BorderLayout;

class SSample21_1 extends JFrame{
  JLabel label;

  public static void main(String args[]){
    SSample21_1 frame = new SSample21_1("タイトル");
    frame.setVisible(true);
  }

  SSample21_1(String title){
    setTitle(title);
    setBounds(100, 100, 300, 250);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JMenuBar menubar = new JMenuBar();
    JMenu menu1 = new JMenu("File");
    JMenu menu2 = new JMenu("Edit");
    JMenu menu3 = new JMenu("Tool");
    JMenu menu4 = new JMenu("Help");

    menubar.add(menu1);
    menubar.add(menu2);
    menubar.add(menu3);
    menubar.add(menu4);

    JMenuItem menuitem1_1 = new JMenuItem("New");
    JMenuItem menuitem1_2 = new JMenuItem("Open");
    JMenuItem menuitem1_3 = new JMenuItem("Save");
    JMenuItem menuitem1_4 = new JMenuItem("Close");

    JRadioButtonMenuItem radiomenuitem1 = new JRadioButtonMenuItem("PNG");
    JRadioButtonMenuItem radiomenuitem2 = new JRadioButtonMenuItem("GIF");
    JRadioButtonMenuItem radiomenuitem3 = new JRadioButtonMenuItem("JPEG");
    radiomenuitem1.setSelected(true);

    ButtonGroup group = new ButtonGroup();
    group.add(radiomenuitem1);
    group.add(radiomenuitem2);
    group.add(radiomenuitem3);

    menu1.add(menuitem1_1);
    menu1.add(menuitem1_2);

    menu1.addSeparator();

    menu1.add(radiomenuitem1);
    menu1.add(radiomenuitem2);
    menu1.add(radiomenuitem3);

    menu1.addSeparator();

    menu1.add(menuitem1_3);
    menu1.add(menuitem1_4);

    setJMenuBar(menubar);

    JPanel p = new JPanel();

    label = new JLabel();
    p.add(label);

    Container contentPane = getContentPane();
    contentPane.add(p, BorderLayout.CENTER);
  }
}

ではコンパイルを行った上で実行してみます。

ラジオボタン型メニューアイテムの追加

では「File」メニューをクリックして下さい。

ラジオボタン型メニューアイテムの追加

メニューの中にラジオボタン型のメニューアイテムが表示されています。今回は分かりやすいようにラジオボタン型メニューアイテムの前後にセパレータを表示してあります。

ラジオボタン型のメニューアイテムは通常のラジオボタンと同じようにクリックすることで選択/非選択を切り替えることができます。グループにまとめているため、複数のラジオボタンの中の1つしか選択状態にできません。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)