Как узнать, какой JRadioButton выбран из ButtonGroup
У меня есть приложение Swing, которое включает в себя радио кнопки на форме. у меня есть ButtonGroup
Однако, глядя на доступные методы, я не могу получить название выбранного JRadioButton
, Вот что я могу сказать до сих пор:
Из ButtonGroup я могу выполнить
getSelection()
вернутьButtonModel
, Оттуда я могу выполнитьgetActionCommand
, но это не всегда работает. Я пробовал разные тесты и получил непредсказуемые результаты.Также из
ButtonGroup
Я могу получить Перечень отgetElements()
, Тем не менее, тогда я должен был бы пройтись по каждой кнопке, чтобы проверить, не выбрана ли она.
Есть ли более простой способ узнать, какая кнопка была выбрана? Я программирую это в Java 1.3.1 и Swing.
14 ответов
Я бы просто перебрал ваш JRadioButtons
и позвонить isSelected()
, Если вы действительно хотите перейти от ButtonGroup
Вы можете добраться только до моделей. Вы можете сопоставить модели с кнопками, но если у вас есть доступ к кнопкам, почему бы не использовать их напрямую?
Я получил похожую проблему и решил с этим:
import java.util.Enumeration;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
public class GroupButtonUtils {
public String getSelectedButtonText(ButtonGroup buttonGroup) {
for (Enumeration<AbstractButton> buttons = buttonGroup.getElements(); buttons.hasMoreElements();) {
AbstractButton button = buttons.nextElement();
if (button.isSelected()) {
return button.getText();
}
}
return null;
}
}
Возвращает текст выбранной кнопки.
Вы должны добавить setActionCommand
к JRadioButton
тогда просто сделайте:
String entree = entreeGroup.getSelection().getActionCommand();
Пример:
java = new JRadioButton("Java");
java.setActionCommand("Java");
c = new JRadioButton("C/C++");
c.setActionCommand("c");
System.out.println("Selected Radio Button: " +
buttonGroup.getSelection().getActionCommand());
Вы можете поставить и actionCommand для каждой радиокнопки (строки).
this.jButton1.setActionCommand("dog");
this.jButton2.setActionCommand("cat");
this.jButton3.setActionCommand("bird");
Предполагая, что они уже находятся в ButtonGroup (в данном случае state_group), вы можете получить выбранный переключатель следующим образом:
String selection = this.state_group.getSelection().getActionCommand();
Надеюсь это поможет
Я предлагаю перейти прямо к модельному подходу в Swing. После того, как вы поместили компонент в диспетчер панелей и макетов, даже не беспокойтесь о сохранении конкретной ссылки на него.
Если вы действительно хотите, чтобы виджет, то вы можете проверить каждый с isSelected
или поддерживать Map<ButtonModel,JRadioButton>
,
Следующий код показывает, какая JRadiobutton выбрана из Buttongroup одним нажатием кнопки.
Это делается путем циклического перебора всех JRadioButton в определенной группе кнопок.
JRadioButton firstRadioButton=new JRadioButton("Female",true);
JRadioButton secondRadioButton=new JRadioButton("Male");
//Create a radio button group using ButtonGroup
ButtonGroup btngroup=new ButtonGroup();
btngroup.add(firstRadioButton);
btngroup.add(secondRadioButton);
//Create a button with text ( What i select )
JButton button=new JButton("What i select");
//Add action listener to created button
button.addActionListener(this);
//Get selected JRadioButton from ButtonGroup
public void actionPerformed(ActionEvent event)
{
if(event.getSource()==button)
{
Enumeration<AbstractButton> allRadioButton=btngroup.getElements();
while(allRadioButton.hasMoreElements())
{
JRadioButton temp=(JRadioButton)allRadioButton.nextElement();
if(temp.isSelected())
{
JOptionPane.showMessageDialog(null,"You select : "+temp.getText());
}
}
}
}
import javax.swing.Action;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JRadioButton;
import javax.swing.JToggleButton;
public class RadioButton extends JRadioButton {
public class RadioButtonModel extends JToggleButton.ToggleButtonModel {
public Object[] getSelectedObjects() {
if ( isSelected() ) {
return new Object[] { RadioButton.this };
} else {
return new Object[0];
}
}
public RadioButton getButton() { return RadioButton.this; }
}
public RadioButton() { super(); setModel(new RadioButtonModel()); }
public RadioButton(Action action) { super(action); setModel(new RadioButtonModel()); }
public RadioButton(Icon icon) { super(icon); setModel(new RadioButtonModel()); }
public RadioButton(String text) { super(text); setModel(new RadioButtonModel()); }
public RadioButton(Icon icon, boolean selected) { super(icon, selected); setModel(new RadioButtonModel()); }
public RadioButton(String text, boolean selected) { super(text, selected); setModel(new RadioButtonModel()); }
public RadioButton(String text, Icon icon) { super(text, icon); setModel(new RadioButtonModel()); }
public RadioButton(String text, Icon icon, boolean selected) { super(text, icon, selected); setModel(new RadioButtonModel()); }
public static void main(String[] args) {
RadioButton b1 = new RadioButton("A");
RadioButton b2 = new RadioButton("B");
ButtonGroup group = new ButtonGroup();
group.add(b1);
group.add(b2);
b2.setSelected(true);
RadioButtonModel model = (RadioButtonModel)group.getSelection();
System.out.println(model.getButton().getText());
}
}
Обычно требуется какой-то объект, связанный с выбранной радиокнопкой. Это не обязательноString
представляющий метку кнопки. Это могло бытьInteger
содержащий индекс кнопки или объект более сложного типа T
. Вы можете заполнить и использоватьMap<ButtonModel, T>
как предложил Том Хотин, но я предлагаю расширить модель и разместить там объекты. Вот улучшенныйButtonGroup
который использует этот подход.
import javax.swing.*;
@SuppressWarnings("serial")
public class SmartButtonGroup<T> extends ButtonGroup {
@Override
public void add(AbstractButton b) {
throw new UnsupportedOperationException("No object supplied");
}
public void add(JRadioButton button, T attachedObject) {
ExtendedModel<T> model = new ExtendedModel<>(attachedObject);
model.setSelected(button.isSelected());
button.setModel(model);
super.add(button);
}
@SuppressWarnings("unchecked")
public T getSelectedObject() {
ButtonModel selModel = getSelection();
return selModel != null ? ((ExtendedModel<T>)selModel).obj : null;
}
public static class ExtendedModel<T> extends javax.swing.JToggleButton.ToggleButtonModel {
public T obj;
private ExtendedModel(T object) {
obj = object;
}
}
}
Вы можете использовать этот служебный класс вместо ButtonGroup
. Создайте объект этого класса и добавьте к нему кнопки вместе со связанными объектами. Например,
SmartButtonGroup<Integer> group = new SmartButtonGroup<>();
JPanel panel = new JPanel();
for (int i = 1; i <= 5; i++) {
JRadioButton button = new JRadioButton("Button #" + i, i == 3); // select the 3rd button
group.add(button, i);
panel.add(button);
}
После этого вы можете в любое время получить объект, связанный с текущей выбранной кнопкой, просто вызвав getSelectedObject()
, нравится:
int selectedButtonIndex = group.getSelectedObject();
Если вам нужны только сами кнопки, вы можете вместо этого использовать следующий неуниверсальный класс.
import javax.swing.JRadioButton;
@SuppressWarnings("serial")
public class RadioButtonGroup extends SmartButtonGroup<JRadioButton> {
public void add(JRadioButton button) {
super.add(button, button);
}
@Override
public void add(JRadioButton button, JRadioButton attachedObject) {
throw new UnsupportedOperationException("Use the short form of addition instead");
}
public JRadioButton getSelectedButton() {
return getSelectedObject();
}
}
Ответ Але Рохаса отлично работает:
В качестве альтернативы вы также можете использовать
public void actionPerformed(ActionEvent arg0) {
if(arg0.getSource() == My_JRadiobutton11){
//my selection
selection = "Become a dolphin";
}else if(arg0.getSource() == My_JRadiobutton12){
//my selection
selection = "Become a Unicorn";
} ..etc
}
Добавьте радиокнопки в группу кнопок, затем:
buttonGroup.getSelection (). getActionCommand
Вы можете использовать getSelectedObjects() для ItemSelectable (суперинтерфейс ButtonModel), который возвращает список выбранных элементов. В случае группы переключателей это может быть только один или ни одного вообще.
Использовать isSelected()
метод. Он скажет вам состояние вашего радио кнопки. Используя его в сочетании с циклом (скажем, для цикла), вы можете найти, какой из них был выбран.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MyJRadioButton extends JFrame implements ActionListener
{
JRadioButton rb1,rb2; //components
ButtonGroup bg;
MyJRadioButton()
{
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
rb1=new JRadioButton("male");
rb2=new JRadioButton("female");
//add radio button to button group
bg=new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
//add radio buttons to frame,not button group
add(rb1);
add(rb2);
//add action listener to JRadioButton, not ButtonGroup
rb1.addActionListener(this);
rb2.addActionListener(this);
pack();
setVisible(true);
}
public static void main(String[] args)
{
new MyJRadioButton(); //calling constructor
}
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println(((JRadioButton) e.getSource()).getActionCommand());
}
}
jRadioOne = new javax.swing.JRadioButton();
jRadioTwo = new javax.swing.JRadioButton();
jRadioThree = new javax.swing.JRadioButton();
... тогда для каждой кнопки:
buttonGroup1.add(jRadioOne);
jRadioOne.setText("One");
jRadioOne.setActionCommand(ONE);
jRadioOne.addActionListener(radioButtonActionListener);
... слушатель
ActionListener radioButtonActionListener = new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
radioButtonActionPerformed(evt);
}
};
... делать все что нужно в ответ на событие
protected void radioButtonActionPerformed(ActionEvent evt) {
System.out.println(evt.getActionCommand());
}