1

我正在用java创建一个项目。我的程序有 80 个 JRadioButtons .... 我需要获取它们的文本值.. 现在这些单选按钮被添加到 ButtonGroup(每个都有 4 个单选按钮)...

我知道如何通过以下代码从单选按钮获取文本值

radiobutton1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String q1=e.getActionCommand();
                JOptionPane.showMessageDialog(null, q1);
            }
        });

现在有什么简单的方法可以做到这一点吗?因为我将不得不在上面的代码中执行 80 次(如果我使用上述代码,则为 80 个单选按钮使用上述方法

附加信息-我总共有 20 个按钮组,每个按钮组有 4 个单选按钮。所以(80 个单选按钮)。

4

5 回答 5

3
I have Total 20 ButtonGroups each with 4 radio buttons. So(80 radio buttons).

那么最简单的方法是

String actionCommand = "";
ButtonModel buttonModel = myButtonGroup.getSelection();
if (buttonModel != null) {
   actionCommand = buttonModel.getActionCommand();
} else {
   // buttonModel is null.
   // this occurs if none of the radio buttons 
   // watched by the ButtonGroup have been selected.
}
于 2011-11-22T18:35:26.507 回答
2

The reason you are facing this problem is because you created every JRadioButton manually, I guess (instead of a loop).

If you really can't do it otherwise, you can use some intelligent code:

Container c = ...; // The component containing the radiobuttons
Component[] comps = c.getComponents();
for (int i = 0; i < c.getComponentCount(); ++i)
{
    Component comp = comps[i];
    if (comp instanceof JRadioButton)
    {
         JRadioButton radiobutton = (JRadioButton) comp;
         // add the listener
         radio.addActionListener(...);
    }
}
于 2011-11-22T18:23:05.693 回答
2

可能不是为每个单选按钮单独定义动作侦听器,您应该为所有单选按钮定义一个通用动作侦听器。

例如

public class RadioActionListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        //String q1=e.getActionCommand();

        //Use the ActionEvent#getSource() method which gives you the reference to the
        //radio-button that caused the event
        JRadioButton theJRB = (JRadioButton) e.getSource();
        JOptionPane.showMessageDialog(null, theJRB.getText());
    }
}

然后,您可以按如下方式使用它:

ActionListener radioAL = new RadioActionListener();

radiobutton1.addActionListener(radioAL);
radiobutton2.addActionListener(radioAL);

此外,ActionEvent#getActionCommand()返回与操作相关的命令字符串,而不是命令组件的文本。

于 2011-11-22T18:21:36.273 回答
1

实现您想要的设计(我认为)的关键是充分利用阵列。例如,您可以拥有一个包含 JRadioButton 文本的二维字符串数组和一个 ButtonGroups 的一维数组,然后能够轻松设置您的 GUI 并使用 for 循环和嵌套 for 循环查询您的 GUI(以及使用 mKorbel 的出色建议)。

例如:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Foo002 extends JPanel {
   public static final String[][] RADIO_TEXTS = {
      {"A1","A2","A3","A4"}, {"B1","B2","B3","B4"}, 
      {"C1","C2","C3","C4"}, {"D1","D2","D3","D4"}, 
      {"E1","E2","E3","E4"}, {"F1","F2","F3","F4"}, 
      {"G1","G2","G3","G4"}, {"H1","H2","H3","H4"}, 
      {"I1","I2","I3","I4"}, {"J1","J2","J3","J4"}, 
      {"K1","K2","K3","K4"}, {"L1","L2","L3","L4"}, 
      {"M1","M2","M3","M4"}, {"N1","N2","N3","N4"}, 
      {"O1","O2","O3","O4"}, {"P1","P2","P3","P4"}, 
      {"Q1","Q2","Q3","Q4"}, {"R1","R2","R3","R4"}, 
      {"S1","S2","S3","S4"}, {"T1","T2","T3","T4"}
      };

   private ButtonGroup[] btnGroups = new ButtonGroup[RADIO_TEXTS.length];

   public Foo002() {
      JPanel radioPanel = new JPanel(new GridLayout(0, 2));
      for (int i = 0; i < RADIO_TEXTS.length; i++) {
         JPanel panel = new JPanel(new GridLayout(1, 0));
         btnGroups[i] = new ButtonGroup();
         for (int j = 0; j < RADIO_TEXTS[i].length; j++) {
            String text = RADIO_TEXTS[i][j];
            JRadioButton rBtn = new JRadioButton(text);
            rBtn.setActionCommand(text);
            btnGroups[i].add(rBtn);
            panel.add(rBtn);
         }
         panel.setBorder(BorderFactory.createLineBorder(Color.black));
         radioPanel.add(panel);
      }

      JButton getRadioChoicesBtn = new JButton(new AbstractAction("Get Radio Choices") {
         public void actionPerformed(ActionEvent arg0) {
            for (ButtonGroup btnGroup : btnGroups) {
               ButtonModel btnModel = btnGroup.getSelection();
               if (btnModel != null) {
                  System.out.println("Selected Button: " + btnModel.getActionCommand());
               }
            }
         }
      });
      JPanel btnPanel = new JPanel();
      btnPanel.add(getRadioChoicesBtn);

      setLayout(new BorderLayout());
      add(radioPanel, BorderLayout.CENTER);
      add(btnPanel, BorderLayout.SOUTH);
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("RadioPanels");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new Foo002());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }

}
于 2011-11-22T22:12:00.730 回答
0

这对我有用

   {
   ...
   String nomSelected = getSelectedButtonText(jbgVariables);
   ...
   }

   String getSelectedButtonText(ButtonGroup buttonGroup) {
       Enumeration<AbstractButton> enu = buttonGroup.getElements();
       while (enu.hasMoreElements()) {
          AbstractButton button = enu.nextElement();
          if(button.isSelected())
              return button.getText();
    
    }

    return null;
  }
于 2021-03-31T13:01:09.197 回答