SwingのJToggleButton、JCheckBox、JRadioButton

2021-07-17

こんにちは。

以前の記事では、JButtonクラスを扱いました。SwingにはJButtonクラスの他もボタンを扱うクラスがあります。今回の記事では、以下の3つのクラスの基本的な使い方を紹介します。

  • JToggleButton
  • JCheckBox
  • JRadioButton

以下のプログラムを雛形として使います。

ソース
import javax.swing.JFrame;

public class Test extends JFrame {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(350, 250);

        init();

        setVisible(true);

    }

    private void init() {
        // 設置処理
    }

}

JToggleButton

JToggleButtonはJButtonと似ていますが、ボタンの押下で以下の2つの状態にすることができます。

  • 押下された状態
  • 押下されていない状態

JButtonの場合はマウスでボタンを押下すると押下状態になり、(マウスボタンを離すと)自動的に押下されてない状態になります。それに対して、JToggleButtonではON/OFFのスイッチのような使い方ができます。

JToggleButton#isSelectedメソッドでボタンが押下状態か取得することができます。以下のプログラムではJToggleButtonとJButtonをJFrameに追加しています。JButtonを押下するとコンソールにJToggleButtonの押下状態を出力します。

ソース
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JToggleButton;

public class Test2 extends JFrame {

    public static void main(String[] args) {
        new Test2();
    }

    public Test2() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(350, 250);

        init();

        setVisible(true);

    }

    private void init() {
        setLayout(new FlowLayout());

        JToggleButton toggleButton = new JToggleButton("Test ToggleButton");
        add(toggleButton);

        JButton button = new JButton("JButton");
        add(button);
        button.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                System.out.println(toggleButton.isSelected());
            }
        });
    }
}
isSelected()の結果がfalseの場合の画面
001_JToggleButtonFalse.png
isSelected()の結果がtrueの場合の画面
001_JToggleButtonTrue.png

isSelectedメソッドはボタンが押下されている場合、trueを返却します。ちなみに、このメソッドはAbstractButtonから継承されたメソッドです。

JCheckBox

JCheckBoxはJToggleButtonを継承したクラスです。レ点用の四角が表示されます。

以下が使用例です。JCheckBoxオブジェクトを2つ生成し、JFrameに追加しています。JButtonオブジェクトを追加し、ボタン押下時にコンソールにJCheckBoxそれぞれの押下状態を表示します。

ソース
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;

public class Test3 extends JFrame {

    public static void main(String[] args) {
        new Test3();
    }

    public Test3() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(350, 250);

        init();

        setVisible(true);

    }

    private void init() {
        setLayout(new FlowLayout());

        JCheckBox checkBox1 = new JCheckBox("JCheckBox1");
    	add(checkBox1);

    	JCheckBox checkBox2 = new JCheckBox("JCheckBox2");
    	add(checkBox2);

    	JButton button = new JButton("JButton");
    	add(button);
    	button.addMouseListener(new MouseAdapter() {
    	    public void mouseClicked(MouseEvent e) {
    	        System.out.println("checkBox1 is Selected: " + checkBox1.isSelected());
    	        System.out.println("checkBox2 is Selected: " + checkBox2.isSelected());
    	    }
    	});
    }

}

初期状態ではチェックはついていません。以下はcheckBox2にチェックをいれた場合でJButtonを押下したときの実行結果です。

002_JCheckBox.png
結果
checkBox1 is Selected: false
checkBox2 is Selected: true

チェックボックスの状態に対応して、isSelected()がtrue/falseを返却しています。

JRadioButton

JRadioButtonはJToggleButtonを継承しています。ボタン押下用の○が表示されます。複数のボタンを排他的なラジオボタンのグループとして扱うためにはButtonGroupクラスを使います。

選択されているボタンはButtonModel#getSelectionメソッドで取得できます。ただし、このメソッドの戻り値はButtonModelインターフェースです。ButtonModel#getActionCommandメソッドでボタンのアクション・コマンド文字列を取得することができます。

以下の例ではJRadioButtonオブジェクトを2つ生成し、アクションコマンドをそれぞれに設定しています。また、それぞれをひとつのグループに追加しています。JButtonオブジェクトを生成し、押下時に選択されているJRadioButtonのアクション・コマンドをコンソールに出力します。初期状態ではJRadioButtonは未選択なのでnullチェックをしています。

ソース
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JRadioButton;

public class Test4 extends JFrame {

    public static void main(String[] args) {
        new Test4();
    }

    public Test4() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(350, 250);

        init();

        setVisible(true);

    }

    private void init() {
        setLayout(new FlowLayout());

        JRadioButton radioButton1 = new JRadioButton("JRadioButton1");
        radioButton1.setActionCommand("R1");
        add(radioButton1);

        JRadioButton radioButton2 = new JRadioButton("JRadioButton1");
        radioButton2.setActionCommand("R2");
        add(radioButton2);

        ButtonGroup buttonGroup = new ButtonGroup();
        buttonGroup.add(radioButton1);
        buttonGroup.add(radioButton2);

        JButton button = new JButton("JButton");
        add(button);
        button.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                ButtonModel buttonModel = buttonGroup.getSelection();
                System.out.println(buttonModel == null ? "not selected" : buttonModel.getActionCommand());
            }
        });
    }
}
「not selected」が出力される場合の画面
003_JRadioButton_1.png
「R1」が出力される場合の画面
003_JRadioButton_2.png
「R2」が出力される場合の画面
003_JRadioButton_3.png

JRadioButtonをグループに追加すると排他的なボタンになることに注意しましょう。グループに属するボタンを一度を選択すると、そのグループに所属するすべてのボタンが未選択という状態に戻すことができません。なお、JRadioButtonをグループに追加しない状態で使うとチェックボックスと同じように使えます。ボタン押下で未選択状態にすることが可能です。

以上、参考になれば幸いです。

同じカテゴリーの前後の記事