确定选择JRadioButton的最佳方法是什么?

时间:2011-05-22 15:10:13

标签: java swing selection jradiobutton

目前我正以这种方式获得所选按钮,但如果这是正确/最佳方法,我不会这样做。可能还有比这更简单或面向对象的东西。

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 个答案:

答案 0 :(得分:4)

我喜欢使用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();
         }
      });
   }
}

答案 1 :(得分:2)

您可以使用ButtonGroup(doc here)添加所有JRadioButton。该小组将负责管理按钮的互斥,并为您提供getSelection()  返回按下的单选按钮的基础模型的方法。然后,您可以找到一种区分各种模型的简单方法(也许您可以检索模型的父级或使用setActionCommandgetActionCommand,如:

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

然后你可以很容易地理解它是哪一个......

答案 2 :(得分:2)

您可以使用扩展ButtonGroup的Darryl Select Button Group来轻松访问单选按钮。

答案 3 :(得分:1)

如果您必须知道按下了哪个按钮,我会说最好给它一个个人听众。不用担心。

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);

    }
}

答案 4 :(得分:1)

使用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();

您还可以为每个按钮添加侦听器,如this example

所示

答案 5 :(得分:0)

我不知道是否有办法摆脱for循环。 但至少你可以使用ButtonGroup转储var-args。 查看示例here