将选定的JRadioButton中的文本显示为JTextArea

时间:2014-09-21 16:50:30

标签: java swing user-interface jtextarea jradiobutton

我正在做我的家庭作业(请不要为我做我的工作)。我已经完成了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*/ 

2 个答案:

答案 0 :(得分:3)

我在JTable上做了类似的问题,我们从广播组中获取选择,然后采取相应的行动。想分享解决方案。

在这里,我使用动作侦听器对单选按钮进行了分组,每个单选按钮都有一个与之关联的动作命令。当用户点击一个单选按钮时,随后将触发一个动作,然后我们取消选择其他单选按钮选择并使用新选择刷新文本区域。

enter image description here

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

}

答案 1 :(得分:2)

建议:

  • 创建ButtonGroup变量,gender,一个字段(在类中声明),并且不在构造函数中声明它,它只将其范围限制为构造函数。它必须在整个班级都可见。
  • 确保您提供JRadioButton的actionCommands。 JRadioButtons与JButtons不同,如果你将String传递给它们的构造函数,这不会自动设置JRadioButton的文本,所以你必须自己在代码中这样做。
  • 您必须先通过getSelection()
  • 从ButtonGroup对象中获取所选的ButtonModel
  • 然后在获取其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();
         }
      });
   }
}