Ответ 1
Вы можете сделать buttonGroup.clearSelection()
.
Но этот метод доступен только с Java 6.
При отображении группы 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);
}
}
Какие-нибудь идеи? Спасибо!
Вы можете сделать buttonGroup.clearSelection()
.
Но этот метод доступен только с Java 6.
Javadoc самого класса ButtonGroup
дает некоторый намек на то, как это можно достичь:
Из документа API класса ButtonGroup
:
Первоначально все кнопки в группе не выбраны. Когда выбрана какая-либо кнопка, в группе всегда выбирается одна кнопка. Невозможно повернуть кнопку программно на "выключено", чтобы очистить группу кнопок. Чтобы создать внешний вид "none selected", добавьте в группу невидимый переключатель, а затем программно выберите эту кнопку, чтобы отключить все отображаемые переключатели.
Попробуйте добавить третью невидимую кнопку в группу кнопок. Когда вы хотите "отменить выбор", выберите невидимый.
Или вы можете использовать Darryl Выбрать группу кнопок, которая не требует использования "невидимой кнопки".
Вы можете использовать счетчик кликов:
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();
}
}
}
Вы можете использовать метод setselected(false)
, чтобы отменить выбор предыдущей выбранной кнопки.
Я не знаю, поможет ли это, но вы пытаетесь использовать метод doClick()
?
jRadioButtonYourObject.doClick();
Вход - NONE
Возвращение
У меня была аналогичная проблема, и я пробовал все в этом потоке безрезультатно. Поэтому я просмотрел все методы JRadioButton и нашел этот метод из родительского класса JRadioButton.
В моей программе у меня было два переключателя независимо друг от друга, и он был запрограммирован так, чтобы был выбран только один.
После ввода пользователем данных и нажатия кнопки программа очищает все текстовые поля и области и отменяет выбор радиокнопки. doClick()
выполнил работу по отключению переключателя для меня; метод "выполняет "click"."
Я знаю, что ваши разные, и вам, вероятно, придется запрограммировать метод doClick() для каждого выбранного переключателя.
http://docs.oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html
найти doClick()
Если вы хотите отменить выбор, выберите невидимый. Для этого вы добавляете третью невидимую кнопку в группу кнопок.
В моем случае я использую проект Jgoodies для привязки компонентов GUI к Java-модели. Компонент RadioButton связан с полем
class Model {
private SomeJavaEnum field; // + getter, setter
}
В таком случае ButtonGroup.clearSelection
не работает, поскольку старое значение все еще сохраняется в модели. Прямым решением было просто setField(null)
.
Используйте этот вспомогательный класс 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);
}
}