Каков наилучший способ определить, какой JRadioButton выбран? - PullRequest
2 голосов
/ 22 мая 2011

В настоящее время я получаю выбранную кнопку таким образом, но не знаю, правильный ли это метод. Может быть что-то более простое или объектно-ориентированное, чем это.

private int getFilterType(JRadioButton... buttons) {
    for (int i = 0, n = buttons.length; i < n; i++) {
        if (buttons[i].isSelected()) {
            return i + 1;
        }
    }
    return buttons.length + 1;
}

Ответы [ 6 ]

4 голосов
/ 22 мая 2011

Мне нравится использовать саму ButtonGroup для этого. то есть.,

import java.awt.GridLayout;
import java.awt.event.ActionEvent;

import javax.swing.*;

public class ButtonModelEg {
   public static final String[] BUTTON_TEXTS = {"Fe", "Fi", "Fo", "Fum"};

   private static void createAndShowUI() {
      final ButtonGroup btnGroup = new ButtonGroup();

      JPanel panel = new JPanel(new GridLayout(0, 1));
      for (String btnText : BUTTON_TEXTS) {
         JRadioButton radioBtn = new JRadioButton(btnText);
         radioBtn.setActionCommand(btnText);
         btnGroup.add(radioBtn);
         panel.add(radioBtn);
      }

      final JTextField selectionField = new JTextField();

      JButton button = new JButton(new AbstractAction("Get Choice"){
         public void actionPerformed(ActionEvent arg0) {
            // get the button model selected from the button group
            ButtonModel selectedModel = btnGroup.getSelection();
            if (selectedModel != null) {
               // and dislay it
               selectionField.setText(selectedModel.getActionCommand());
            }
         }
      });

      panel.add(button);
      panel.add(selectionField);

      JFrame frame = new JFrame("ButtonModelEg");
      frame.getContentPane().add(panel);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}
2 голосов
/ 22 мая 2011

Вы можете использовать Darryl's Select Button Group , которая расширяет ButtonGroup, чтобы дать вам легкий доступ к переключателю.

2 голосов
/ 22 мая 2011

Что вы можете сделать, это использовать ButtonGroup (doc здесь ), к которому вы добавляете все JRadioButton.Группа позаботится о взаимном исключении кнопки, а также о методе getSelection(), который возвращает базовую модель нажатой кнопки-переключателя.Затем вы можете найти простой способ различения различных моделей (может быть, вы можете получить родительский элемент модели или использовать setActionCommand и getActionCommand, как в:

JRadioButton button1 = new JRadioButton(..);
button1.getModel().setActionCommand("MY_ACTION");

, и тогда вы можете легкопонять, какой это ..

1 голос
/ 22 мая 2011

Использовать ButtonGroup .Преимуществом использования группы кнопок является то, что она заботится о таких вещах, как переключение между переключателями, чтобы вам не приходилось беспокоиться об этом.

Вы добавляете свои кнопки в группу следующим образом:

JRadioButton carrots = new JRadioButton("Carrots");
carrots.setActionCommand("carrots");

JRadioButton peas = new JRadioButton("Peas");
peas.setActionCommand("peas");

ButtonGroup group = new ButtonGroup();
group.add(carrots);
group.add(peas);

, и когда вам нужно получить выбранную кнопку, вы просто используете

group.getSelection();

Вы также можетедобавьте слушателей к каждой кнопке, как показано в этом примере .

1 голос
/ 22 мая 2011

Если вам нужно знать, какая кнопка была нажата, я бы сказал, что лучше всего назначить ее отдельному слушателю. Тогда не беспокойтесь.

public class ListenerDemo
{
    private JButton button1;
    private JButton button2;

    public ListenerDemo(ActionListener listener1, ActionListener listener2)
    {
        this.button1 = new JButton("Button 1 Label");
        this.button.addActionListener(listener1);
        this.button2 = new JButton("Button 2 Label");
        this.button.addActionListener(listener2);

    }
}
0 голосов
/ 22 мая 2011

Я не знаю, есть ли способ избавиться от цикла for. Но, по крайней мере, вы можете использовать ButtonGroup для выгрузки var-args. Смотрите пример здесь .

...