Отображение текста из выбранного JRadioButton в JTextArea

Я работаю над своим ДОМАШНИМ ЗАДАНИЕМ (пожалуйста, не делайте мою работу за меня). У меня уже выполнено 95%. У меня проблемы с этим последним битом, хотя. Мне нужно отобразить выбранный пол в JTextArea. Я должен использовать JRadioButton для выбора пола.

Я понимаю, что JRadioButtons работают по-разному. Я настроил прослушиватель действий и мнемонику. Я думаю, что я испортил здесь. Может показаться, что мне может понадобиться использовать всю группу для установки и списка действий.

Любая помощь приветствуется.

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

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


public class LuisRamosHW3 extends JFrame {

private JLabel WelcomeMessage;

private JRadioButton jrbMale = new JRadioButton("Male");

private JRadioButton jrbFemale = new JRadioButton("Female");

public LuisRamosHW3(){

setLayout(new FlowLayout(FlowLayout.LEFT, 20, 30));


JPanel jpRadioButtons = new JPanel();
jpRadioButtons.setLayout(new GridLayout(2,1));
jpRadioButtons.add(jrbMale);
jpRadioButtons.add(jrbFemale);
add(jpRadioButtons, BorderLayout.AFTER_LAST_LINE);


ButtonGroup gender = new ButtonGroup();
gender.add(jrbMale);
jrbMale.setMnemonic(KeyEvent.VK_B); 
jrbMale.setActionCommand("Male");
gender.add(jrbFemale);
jrbFemale.setMnemonic(KeyEvent.VK_B);
jrbFemale.setActionCommand("Female");

//Set defaulted selection to "male"
jrbMale.setSelected(true);

//Create Welcome button
JButton Welcome = new JButton("Submit");
add(Welcome);

Welcome.addActionListener(new SubmitListener());
WelcomeMessage = (new JLabel(" "));
add(WelcomeMessage);


}
class SubmitListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e){

String FirstName = jtfFirstName.getText();
String FamName = jtfLastName.getText();
Object StateBirth = jcbStates.getSelectedItem();
String Gender = gender.getActionCommand(); /*I have tried different 
variations the best I do is get one selection to print to the text area*/

WelcomeMessage.setText("Welcome, " + FirstName + " " + FamName + " a "
+ gender.getActionCommmand + " born in " + StateBirth);
}
}
} /*Same thing with the printing, I have tried different combinations and just can't seem to figure it out*/ 

person Luis Ramos    schedule 21.09.2014    source источник
comment
Не уверен, но я думаю, что должен быть метод класса JRadioButton, например getText() или что-то подобное. Возможно, вам придется использовать прослушиватель действий JRadioButton, например onSelectListener. И, наконец, установите JTextField с извлеченной строкой. По вашей просьбе я только рассказал вам, что и как делать, не совсем правильно (Вообще-то я тоже не знаю, что надо делать). Это должен быть правильный поток. Удачи   -  person Nabin    schedule 21.09.2014
comment
@Nabin: нет, не используйте ActionListener для JRadioButton, потому что время выбора имеет значение, когда была нажата кнопка отправки. В оригинальном плакате это правильно - используйте объект ButtonGroup, но сначала ему нужно сделать его видимым, чтобы дать ему область класса.   -  person Hovercraft Full Of Eels    schedule 21.09.2014


Ответы (2)


Предложения:

  • Сделайте свою переменную ButtonGroup, пол, поле (объявленное в классе) и не объявляйте его в конструкторе, который ограничит его область действия только конструктором. Он должен быть виден всему классу.
  • Убедитесь, что вы указали actionCommands вашего JRadioButton. JRadioButtons не похожи на JButtons тем, что если вы передаете String в их конструктор, это не устанавливает текст JRadioButton автоматически, поэтому вам придется сделать это самостоятельно в своем коде.
  • Сначала вы должны получить выбранную модель ButtonModel из объекта ButtonGroup через getSelection()
  • Затем убедитесь, что выбранная модель не является нулевой, прежде чем получить текст actionCommand.

Например

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class RadioButtonEg extends JPanel {
   public static final String[] RADIO_TEXTS = {"Mon", "Tues", "Wed", "Thurs", "Fri"};

   // *** again declare this in the class.
   private ButtonGroup buttonGroup = new ButtonGroup();
   private JTextField textfield = new JTextField(20);

   public RadioButtonEg() {
      textfield.setFocusable(false);
      JPanel radioButtonPanel = new JPanel(new GridLayout(0, 1));
      for (String radioText : RADIO_TEXTS) {
         JRadioButton radioButton = new JRadioButton(radioText);
         radioButton.setActionCommand(radioText); // **** don't forget this
         buttonGroup.add(radioButton);
         radioButtonPanel.add(radioButton);
      }

      JPanel bottomPanel = new JPanel();
      bottomPanel.add(new JButton(new ButtonAction("Press Me", KeyEvent.VK_P)));

      setLayout(new BorderLayout());
      add(radioButtonPanel, BorderLayout.CENTER);
      add(bottomPanel, BorderLayout.PAGE_END);
      add(textfield, BorderLayout.PAGE_START);
   }

   private class ButtonAction extends AbstractAction {
      public ButtonAction(String name, int mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         ButtonModel model = buttonGroup.getSelection();
         if (model == null) {
            textfield.setText("No radio button has been selected");
         } else {
            textfield.setText("Selection: " + model.getActionCommand());
         }

      }
   }

   private static void createAndShowGui() {
      RadioButtonEg mainPanel = new RadioButtonEg();

      JFrame frame = new JFrame("RadioButtonEg");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
person Hovercraft Full Of Eels    schedule 21.09.2014
comment
Спасибо большое. Это должно заставить меня двигаться в правильном направлении. - person Luis Ramos; 21.09.2014

Я сделал аналогичную задачу на JTable, где мы получаем выбор из группы радио, а затем действуем соответственно. Решил поделиться решением.

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

введите здесь описание изображения

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;

public class RadioBtnToTextArea {
    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                new RadioBtnToTextArea().createUI();
            }
        };

        EventQueue.invokeLater(r);
    }

    private void createUI() {
        JFrame frame = new JFrame();

        JPanel panel = new JPanel(new BorderLayout());
        JPanel radioPnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel textPnl = new JPanel();


        JRadioButton radioMale = new JRadioButton();
        JRadioButton radioFemale = new JRadioButton();

        JTextArea textArea = new JTextArea(10, 30);

        ActionListener listener = new RadioBtnAction(radioMale, radioFemale, textArea);

        radioPnl.add(new JLabel("Male"));
        radioPnl.add(radioMale);
        radioMale.addActionListener(listener);
        radioMale.setActionCommand("1");

        radioPnl.add(new JLabel("Female"));
        radioPnl.add(radioFemale);
        radioFemale.addActionListener(listener);
        radioFemale.setActionCommand("2");

        textPnl.add(textArea);

        panel.add(radioPnl, BorderLayout.NORTH);
        panel.add(textPnl, BorderLayout.CENTER);


        frame.add(panel);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}


class RadioBtnAction implements ActionListener {

    JRadioButton maleBtn;
    JRadioButton femaleBtn;
    JTextArea textArea;

    public RadioBtnAction(JRadioButton maleBtn, 
                                JRadioButton femaleBtn, 
                                    JTextArea textArea) {
        this.maleBtn = maleBtn;
        this.femaleBtn = femaleBtn;
        this.textArea = textArea;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        int actionCode = Integer.parseInt(e.getActionCommand());

        switch (actionCode) {
        case 1:
            maleBtn.setSelected(true);
            femaleBtn.setSelected(false);
            textArea.setText("Male");
            break;
        case 2: 
            maleBtn.setSelected(false);
            femaleBtn.setSelected(true);
            textArea.setText("Female");

            break;
        default:
            break;
        }   
    }

}
person Amarnath    schedule 21.09.2014
comment
Спасибо. В итоге я сделал очень похожую работу. В итоге получилось больше, чем я думал, что нужно. В итоге получилось. - person Luis Ramos; 22.09.2014