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

Java 确定所选JRadioButton的最佳方法是什么?,java,swing,selection,jradiobutton,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; } } re

目前,我正以这种方式获取所选按钮,但我不知道这是否是正确/最佳的方法。也许还有比这更简单或面向对象的东西

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;
}
private int getFilterType(JRadioButton…按钮){
对于(int i=0,n=buttons.length;i
我喜欢使用按钮组本身。i、 e

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

如果你必须知道按下了哪个按钮,我会说最好给它一个单独的听众。那就不用担心了

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

    }
}

您可以使用一个
按钮组
(doc),在其中添加所有
JRadioButton
。该组将负责管理按钮的互斥,并为您提供
getSelection()
方法,该方法返回所按下单选按钮的基础模型。然后,您可以找到一种简单的方法来区分不同的模型(可能您可以检索模型的父级,或者使用
setActionCommand
getActionCommand
,如:

JRadioButton button1 = new JRadioButton(..);
button1.getModel().setActionCommand("MY_ACTION");
使用按钮组的好处在于,它可以为您在单选按钮之间切换,这样您就不必担心了

将按钮添加到组中,如下所示:

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

您还可以向每个按钮添加侦听器,如中所示。

我不知道是否有办法摆脱for循环。 但至少您可以使用
按钮组
转储var args。
请看一个例子。

您可以使用Darryl的扩展按钮组来方便您访问单选按钮。

如果您真的在数组中获得了这样的按钮,那么这是找到所选按钮的最佳方法。是的,我的想法完全正确!1+1+用于摆脱for循环。但我还没有找到一种方法来恢复JRadioButton本身我们可以通过ButtonGroup元素枚举循环,也可以求助于一些简单的工作,比如保持ActionCommand->JRadioButton映射。有没有关于如何以更简洁的方式实现这一点的想法?为什么需要按钮实例本身?通过标识符知道它是哪一个对于您的目的来说是不够的?似乎您需要知道我应用了一种过滤器,所以我不明白你为什么需要特定的对象实例,你能澄清一下吗?我不是OP lol,我认为这对于他的目的来说已经足够了。Camickr也解决了我的问题。只是一个简短的提示:返回一个。要确定选择了哪个JRadioButton,你需要将其操作命令设置为正手或循环通过我的答案中指出的
ButtonGroup
elements枚举。@Anthony谢谢你指出这一点。我编辑了我的答案来解决这个问题。这正是我所寻找的。
getSelectedIndex
getSelectedButton
起到了作用。现在我只需要用一些泛型支持来改进它们因此,我不需要投下
抽象按钮,它是完美的。+1来自我-camickr在所有Java和Swing方面都是真正的权威,在Sun Java论坛和这里都是如此。@duffymo,谢谢,但我不能把这归功于Darryl的建议和代码。至于作为一个权威,我不确定。我对此感到惊讶所有论坛成员的知识。我试图从他们的答案中学习。