Как получить текстовое значение JRadioButton

Я создаю проект в java. Моя программа имеет 80 JRadioButtons.... Мне нужно получить их текстовое значение.. Теперь эти радиокнопки добавлены в ButtonGroup (каждая имеет 4 радиокнопки)...

Я знаю, как получить текстовое значение из переключателя с помощью следующего кода

radiobutton1.addActionListener(new ActionListener() {

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

Теперь есть ли простой способ сделать это? потому что мне придется сделать этот код выше 80 раз (для восьмидесяти радиокнопок, если я использую вышеуказанный метод, используйте вышеуказанный метод

Дополнительная информация. У меня всего 20 групп кнопок, каждая с 4 переключателями. Итак (80 радиокнопок).


person Tuhin Bhatt    schedule 22.11.2011    source источник
comment
Мне было бы интересно посмотреть, что вы проверяете с помощью этого огромного количества JRadioButtons. Можете ли вы рассказать нам больше о том, что делает эта часть кода?   -  person Hovercraft Full Of Eels    schedule 22.11.2011
comment
@Hovercraft Full Of Eels, что мой ..., я думаю, что JSlider должен быть больше, чем альтернатива,   -  person mKorbel    schedule 23.11.2011
comment
@Hovercraft Full Of Eels Я создаю систему обратной связи преподавателей ... Они специально сказали нам использовать RadioButtons ... Для каждого вопроса есть четыре варианта ... Всего 20 вопросов.   -  person Tuhin Bhatt    schedule 23.11.2011
comment
так и не понял зачем нужен actionCommand (тем более не в actionListener) - или вы хотите сказать юзеру круто- правильный выбор! против упс... попробуй другой! момент, когда они выбирают один из вариантов?   -  person kleopatra    schedule 23.11.2011


Ответы (5)


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.
}
person mKorbel    schedule 22.11.2011
comment
Это может работать хорошо, поэтому 1+, но вы должны убедиться, что ButtonModel, возвращаемый getSelection(), не является нулевым, прежде чем вызывать для него getActionCommand(). Если вы не возражаете, я хотел бы отредактировать ваш пост, чтобы отразить это. Кроме того, нет необходимости вызывать toString() для значения, возвращаемого getActionCommand(), поскольку оно возвращает строку. - person Hovercraft Full Of Eels; 22.11.2011
comment
@Hovercraft Full of Eels Строка actionCommand не печатает текст JRadiobutton, но печатает null.. она переходит в условие (if buttonModel!=null)... затем печатает null... Мой код выглядит следующим образом, если (buttonModel!=null){actionCommand=buttonModel.getActionCommand(); System.out.println(actionCommand);} - person Tuhin Bhatt; 23.11.2011
comment
@mKorbel У меня проблема с приведенным выше предложением от Hovercraft Full of Eels, вы можете мне помочь .. - person Tuhin Bhatt; 23.11.2011
comment
@Tuhin Bhatt трудно помочь вам, не видя, что вы пытаетесь, обновите свой вопрос соответствующим кодом, тогда любой сможет вам помочь - person mKorbel; 23.11.2011

Причина, по которой вы столкнулись с этой проблемой, заключается в том, что вы создали каждый JRadioButton вручную, я думаю (вместо цикла).

Если вы действительно не можете сделать это иначе, вы можете использовать какой-нибудь интеллектуальный код:

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(...);
    }
}
person Martijn Courteaux    schedule 22.11.2011

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

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

Затем вы можете использовать его следующим образом:

ActionListener radioAL = new RadioActionListener();

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

Кроме того, ActionEvent#getActionCommand()< /a> возвращает командную строку, связанную с действием, а не extacly текст командного компонента.

person Bhesh Gurung    schedule 22.11.2011
comment
Нет необходимости создавать 80 RadioActionListeners. Создайте один и поделитесь им со всеми переключателями. Вот почему вы пишете общий код для получения источника события из ActionEvent. - person camickr; 23.11.2011

Ключом к реализации дизайна, который вы хотите (я думаю), является использование массивов в полной мере. Например, у вас может быть двумерный массив String, который содержит тексты JRadioButton, и одномерный массив ButtonGroups, а затем вы сможете легко настроить свой графический интерфейс и запросить его с помощью циклов for и вложенных циклов for (и используя отличное предложение 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();
         }
      });
   }

}
person Hovercraft Full Of Eels    schedule 22.11.2011
comment
технически правильно, но... эй, мы в OO-land. Массив массивов для моделирования набора вопросов с вариантами ответов — это… доисторический ‹g› - person kleopatra; 23.11.2011
comment
@kleopatra: Согласен. Это просто SSCCE для проверки концепции. В реальной жизни вопросы были бы частью не кода, а данных. - person Hovercraft Full Of Eels; 23.11.2011

Это работает для меня

   {
   ...
   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;
  }
person alehn96    schedule 31.03.2021