How to get the text value of JRadioButton

2020-03-31 02:12发布

问题:

I am creating a project in java. My Program has 80 JRadioButtons .... I need the get the text value of them.. Now these radiobuttons are added to ButtonGroup(each has 4 radio buttons)...

I know how to get the text value from the radio button by this following code

radiobutton1.addActionListener(new ActionListener() {

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

Now is there any easy way to do this? because i will have to do this above code for 80 times(for eighty radiobuttons if i use the above use the above method

Additional Info- I have Total 20 ButtonGroups each with 4 radio buttons. So(80 radio buttons).

回答1:

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

then easiest way is

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.
}


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


回答3:

May be instead of defining action-listener for each radio-button individually, you should define a common action-listener for all the radio-buttons.

e.g.

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

Then, you can use it as follows:

ActionListener radioAL = new RadioActionListener();

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

Also, the ActionEvent#getActionCommand() returns the command string associated with the action not extacly the text of command-component.



回答4:

The key to implementing a design like you desire (I think) is to use arrays to their fullest power. For instance, you could have a 2-Dimensional array of String that holds the JRadioButton texts, and a 1-Dimensional array of ButtonGroups and then be able to easily set up your GUI and query your GUI with for loops and nested for loops (and using the excellent suggestion of mKorbel).

For example:

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

}