Отмена выбора RadioButtons в Java Swing - PullRequest
32 голосов
/ 09 марта 2010

При отображении группы JRadioButtons изначально ни один из них не выбран (если только вы программно не применяете это). Я хотел бы иметь возможность вернуть кнопки в это состояние даже после того, как пользователь уже выбрал одну, т.е. ни одна из кнопок не должна быть выбрана.

Однако использование обычных подозреваемых не дает требуемого эффекта: вызов setSelected (false) для каждой кнопки не работает. Интересно, что работает , когда кнопки не помещены в ButtonGroup - к сожалению, последнее требуется для того, чтобы JRadioButtons были взаимоисключающими.

Также, используя setSelected (ButtonModel, boolean) - метод javax.swing.ButtonGroup не делает то, что я хочу.

Я собрал небольшую программу для демонстрации эффекта: две радиокнопки и 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);
    }
}

Есть идеи у кого-нибудь? Спасибо!

Ответы [ 10 ]

48 голосов
/ 12 марта 2010

Вы можете сделать buttonGroup.clearSelection().

Но этот метод доступен только с Java 6.

5 голосов
/ 09 марта 2010

Javadoc класса ButtonGroup сам дает некоторую подсказку о том, как этого можно достичь:

Из документа API класса ButtonGroup:
Изначально все кнопки в группе не выбраны. Как только любая кнопка выбрана, в группе всегда выбирается одна кнопка. Невозможно программно повернуть кнопку в «выкл.», Чтобы очистить группу кнопок. Чтобы создать видимость «ничего не выбрано», добавьте невидимую радиокнопку в группу и затем программно выберите эту кнопку, чтобы отключить все отображаемые радиокнопки.

3 голосов
/ 09 марта 2010

Или вы можете использовать группу кнопок Darryl , которая не требует использования "невидимой кнопки".

3 голосов
/ 09 марта 2010

Попробуйте добавить третью невидимую кнопку в группу кнопок.Если вы хотите отменить выделение, выберите невидимое.

1 голос
/ 15 октября 2016

Вы можете использовать счетчик кликов:

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();
        }
    }
}   
0 голосов
/ 03 октября 2016

Используйте этот вспомогательный класс 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 голосов
/ 22 сентября 2014

В моем случае я использую проект Jgoodies для привязки компонентов графического интерфейса к модели Java. Компонент RadioButton связан с полем

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

В этом случае ButtonGroup.clearSelection не работает, так как старое значение все еще сохраняется в модели. Простым решением было просто setField(null).

0 голосов
/ 21 августа 2013

Если вы хотите отменить выбор, выберите невидимый. Для этого вы добавляете третью невидимую кнопку в группу кнопок.

0 голосов
/ 11 июля 2013

Не знаю, поможет ли это, но вы пытались использовать метод doClick()?

jRadioButtonYourObject.doClick();

Ввод - НЕТ

Возврат-пустота

У меня была похожая проблема, и я попробовал все в этой теме, но безрезультатно. Поэтому я взглянул на все методы JRadioButton и нашел этот метод в родительском классе JRadioButton.

В моей программе у меня было два переключателя, независимых друг от друга, и они были запрограммированы так, что была выбрана только одна.

После того, как пользователь вводит данные и нажимает кнопку, программа очищает все текстовые поля и области и отменяет выбор переключателя. doClick() отменил выбор радиокнопки для меня; метод "выполняет" щелчок "."

Я знаю, что у вас все по-другому, и вам, вероятно, придется программировать метод doClick () для каждой выбранной радиокнопки.

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

поиск doClick()

0 голосов
/ 25 марта 2013

Вы можете использовать метод setselected(false), чтобы отменить выбор предыдущей выбранной кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...