web-dev-qa-db-ja.com

Java Swingのラジオボタンの選択を解除する

JRadioButtonsのグループを表示する場合、最初はどれも選択されていません(プログラムで強制しない限り)。ユーザーがすでにボタンを選択した後でも、ボタンをその状態に戻せるようにしたいと思います。つまり、ボタンはどれも選択しないでください。

ただし、通常の容疑者を使用しても必要な効果は得られません。各ボタンで 'setSelected(false)'を呼び出しても機能しません。興味深いことに、doesボタンがButtonGroupに配置されていないときに機能します。残念ながら、JRadioButtonが相互に排他的であるためには後者が必要です。

また、setSelected(ButtonModel、boolean)-javax.swing.ButtonGroupのメソッドを使用しても、私が望むことはできません。

効果を示すために、2つのラジオボタンとJButtonという小さなプログラムを作成しました。 JButtonをクリックすると、ラジオボタンが選択解除され、ウィンドウが最初にポップアップしたときとまったく同じように表示されます。

import Java.awt.Container;
import Java.awt.GridLayout;
import Java.awt.event.*;
import javax.swing.*;

/**
 * This class creates two radio buttons and a JButton. Initially, none
 * of the radio buttons is selected. Clicking on the JButton should
 * always return the radio buttons into that initial state, i.e.,
 * should disable both radio buttons.
 */
public class RadioTest implements ActionListener {
    /* create two radio buttons and a group */
    private JRadioButton button1 = new JRadioButton("button1");
    private JRadioButton button2 = new JRadioButton("button2");
    private ButtonGroup group = new ButtonGroup();

    /* clicking this button should unselect both button1 and button2 */
    private JButton unselectRadio = new JButton("Unselect radio buttons.");

    /* In the constructor, set up the group and event listening */
    public RadioTest() {
        /* put the radio buttons in a group so they become mutually
         * exclusive -- without this, unselecting actually works! */
        group.add(button1);
        group.add(button2);

        /* listen to clicks on 'unselectRadio' button */
        unselectRadio.addActionListener(this);
    }

    /* called when 'unselectRadio' is clicked */
    public void actionPerformed(ActionEvent e) {
        /* variant1: disable both buttons directly.
         * ...doesn't work */
        button1.setSelected(false);
        button2.setSelected(false);

        /* variant2: disable the selection via the button group.
         * ...doesn't work either */
        group.setSelected(group.getSelection(), false);
    }

    /* Test: create a JFrame which displays the two radio buttons and
     * the unselect-button */
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        RadioTest test = new RadioTest();

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new GridLayout(3,1));
        contentPane.add(test.button1);
        contentPane.add(test.button2);
        contentPane.add(test.unselectRadio);

        frame.setSize(400, 400);
        frame.setVisible(true);
    }
}

アイデアはありますか?ありがとう!

32
Thomas

buttonGroup.clearSelection() を実行できます。

ただし、このメソッドはJava 6。

48

クラスButtonGroupのJavadoc自体が、これを実現する方法についてのヒントを提供します。

クラスButtonGroupのAPIドキュメントから:
最初は、グループ内のすべてのボタンは選択されていません。ボタンが選択されると、グループ内の1つのボタンが常に選択されます。ボタングループをクリアするために、プログラムでボタンを「オフ」にする方法はありません。 「選択なし」の外観を与えるには、非表示のラジオボタンをグループに追加し、プログラムでそのボタンを選択して、表示されているすべてのラジオボタンをオフにします。

5
sateesh

3番目の非表示ボタンをボタングループに追加してみてください。 「選択解除」する場合は、非表示のものを選択します。

3
Ash

または、ダリルの Select Button Group を使用できます。これにより、「非表示ボタン」を使用する必要がなくなります。

3
camickr

クリックカウンターを使用できます。

private ButtonGroup radioGroup = new javax.swing.ButtonGroup();
private JRadioButton jRadioBtn1 = new javax.swing.JRadioButton();
private int clickCount = 0;

private void jRadioBtn1Clicked(Java.awt.event.MouseEvent evt) {                                             
    // Remove selection on a second click
    if (jRadioBtn1.isSelected()) {

        if (++clickCount % 2 == 0) {

            radioGroup.clearSelection();
        }
    }
}   
1
justDev7a3

このヘルパークラスを使用します SelectButtonGroup.Java クラスへの直接リンク source

import Java.awt.*;
import Java.awt.event.ActionListener;
import javax.swing.*;

public class SelectUnselected extends JPanel {
    private static String birdString = "Bird";
    private static String catString = "Cat";
    private static Integer selectedIndex = -1;
    private static AbstractButton hiddenButton = new JRadioButton(catString);
    private final static AbstractButton birdButton = new JRadioButton(birdString);
    private final static AbstractButton catButton = new JRadioButton(catString);
    //Group the radio buttons.
    private SelectButtonGroup group = new SelectButtonGroup();

public SelectUnselected() {
    super(new BorderLayout());

    //Create the radio buttons.
    hiddenButton.setVisible(false);
    hiddenButton.setSelected(true);

    group.add(birdButton);
    group.add(catButton);
    group.add(hiddenButton);


    ActionListener sendListener = e -> {
        checkSelectedRadioButten();
    };
    birdButton.addActionListener(sendListener);
    catButton.addActionListener(sendListener);
    hiddenButton.addActionListener(sendListener);



    //Put the radio buttons in a column in a panel.
    JPanel radioPanel = new JPanel(new GridLayout(0, 1));
    radioPanel.add(birdButton);
    radioPanel.add(catButton);

    add(radioPanel, BorderLayout.LINE_START);
    setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
}

public void checkSelectedRadioButten(){

    System.out.println("selectedIndex = " + selectedIndex + "\ngroup.getSelectedButton() = " + group.getSelectedIndex());
    if(group.getSelectedIndex() == selectedIndex){
        hiddenButton.setSelected(true);
        selectedIndex = -1;
        System.out.println("getText = " + group.getSelectedButton().getText());
    }else{
        selectedIndex = group.getSelectedIndex();
        System.out.println("getText = " + group.getSelectedButton().getText());
    }
}

public static void main(String[] args) {
    JFrame frame = new JFrame("RadioButtonDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JComponent newContentPane = new SelectUnselected();
    frame.setContentPane(newContentPane);
    frame.pack();
    frame.setVisible(true);

    }
}
0
Ar maj

選択を解除する場合は、非表示を選択します。そのために、ボタングループに3番目の非表示ボタンを追加します。

0
user1815823

これが役立つかどうかはわかりませんが、doClick()メソッドを使用しようとしましたか?

_jRadioButtonYourObject.doClick();
_

入力-なし

Return- void

私は同様の問題を抱えていて、このスレッドのすべてを試してみました。そこで、JRadioButtonのすべてのメソッドを調べて、JRadioButtonの親クラスからそのメソッドを見つけました。

私のプログラムでは、互いに独立した2つのラジオボタンがあり、1つだけが選択されるようにプログラムされていました。

ユーザーがデータを入力してボタンを押すと、プログラムはすべてのテキストフィールドと領域をクリアし、ラジオボタンの選択を解除します。 doClick()は、ラジオボタンを選択解除する仕事をしました。メソッドは「クリック」を実行します。

私はあなたのものが異なることを知っています、そしておそらくあなたは選択されたすべてのラジオボタンのためにdoClick()メソッドをプログラムしなければならないでしょう。

http://docs.Oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html

doClick()を検索

0
user2572559

setselected(false)メソッドを使用して、前に選択したボタンの選択を解除できます。

0
user2205752

私の場合、Jgoodiesプロジェクトを使用してGUIコンポーネントをJavaモデルにバインドします。RadioButtonコンポーネントはフィールドにバインドされます

_class Model {
  private SomeJavaEnum field; // + getter, setter
}
_

そのような場合、_ButtonGroup.clearSelection_は機能しません。これは、古い値がまだモデルに保持されているためです。簡単な解決策は、単にsetField(null)でした。

0