需要帮助让JRadioButton将Value返回给JTextField

时间:2015-10-11 23:31:35

标签: java swing jradiobutton

我的节目正在模拟选举团的投票。每个州都有一定数量的选票。我无法获取每个州的按钮以将适当的投票数返回到总数,然后每次点击该方的按钮时将该总数打印到JTextField中的屏幕上。

我的问题是我应该使用ItemStateChanged还是ActionListener?经过一些网上研究,我目前正在使用一个ActionListener,但我似乎无法弄清楚最终的实现,或者这是否是完成我的程序的最佳方式。

ActionListener RadioButtonActionListener = new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e) 
            {
                if(e.getSource() instanceof JRadioButton)
                {
                    if(Democrat.isSelected() == true)
                    {
                        String Count = StateValue.getText();
                        int countInteger = Integer.parseInt(Count);
                        int demoCount = demoCount + countInteger;
                        demoTotal.setText(demoCount);
                    }
                    else if (Democrat.isSelected() == false)
                    {

                    }
                }
            }

        };

我的其余代码:

public class ElectoralCollegeGUI extends JFrame 
{
private static final long serialVersionUID = 1L;
private static int demoVoteCount = 0;
private static int repVoteCount = 0;
private static int undVoteCount = 0;
private JRadioButton Democrat,Republican,Undecided;
private static String whatState;

public ElectoralCollegeGUI()
{
    super("Cast Your Votes");
    //JPanel mainGridPanel = new JPanel();
    setLayout(new GridLayout(22,5));
    JLabel demoVoteLabel = new JLabel("Democrat Votes");
    JTextField demoTotal = new JTextField();
    JLabel repVoteLabel = new JLabel("Republican Votes");
    JTextField repTotal = new JTextField();     
    JLabel undVoteLabel = new JLabel("Undecided Votes");
    JTextField undTotal = new JTextField();




    demoTotal.setEditable(false);
    repTotal.setEditable(false);
    undTotal.setEditable(false);

    add(demoTotal, BorderLayout.SOUTH);
    add(repTotal, BorderLayout.SOUTH);
    add(undTotal,BorderLayout.SOUTH);
    add(demoVoteLabel);
    add(repVoteLabel);
    add(undVoteLabel);

    String[] state = {"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut","Delaware", 
              "Florida" , "Georgia" ,"Hawaii","Idaho", "Illinois", "Indiana","Iowa","Kansas","Kentucky","Louisiana","Maine 1st", 
              "Maine 2nd" ,"Maine Popular","Maryland", "Massachusetts","Michigan","Minnesota","Mississippi","Missouri", 
              "Montant",   "Nebraska 1st",   "Nebraska 2nd",   "Nebraska 3rd", "Nebraska Popular", "Nevada","New Hampshire",
              "New Jersey",   "New Mexico","New York",   "North Carolina", "North Dakota",   "Ohio",   "Oklahoma",
              "Oregon",   "Pennsylvania",   "Rhode Island",   "South Carolina",   "South Dakota",
              "Tennessee",   "Texas",  "Utah",  "Vermont",  "Virginia",  "Washington",
              "West Virginia",  "Wisconsin",  "Wyoming",  "Washington,D.C.",};  

    String[] voteValue = { "9","3","11","6","55","9","7","3","29","16","4","4","20","11","6",
                        "6","8","8","1","1","2","10","11","16","10","6","10","3","1","1","1",
                        "2","6","4","14","5","29","15","3","18","7","7","20","4","9","3","11",
                        "38","6","3","13","12","5","10","3","3"};



    for ( int i = 0; i < 56 ; i++)
    {
        add(new VoteChoice(state[i] , voteValue[i]));
    }

}
    private class VoteChoice extends JPanel
    {
        private static final long serialVersionUID = 1L;

        public VoteChoice(String state, String voteValue)
        {
            setLayout(new FlowLayout());

            JLabel StateName = new JLabel(state);
            JLabel StateValue = new JLabel(voteValue);

            ButtonGroup party;
            party = new ButtonGroup();

            Democrat = new JRadioButton("Democrat");
            Republican = new JRadioButton("Republican");
            Undecided = new JRadioButton("Undecided");

            //adds buttons to party button group
            party.add(Democrat);
            party.add(Republican);
            party.add(Undecided);



            add(StateName, BorderLayout.WEST);
            add(StateValue,BorderLayout.WEST);
            add(Democrat, BorderLayout.EAST);
            add(Republican, BorderLayout.EAST);
            add(Undecided, BorderLayout.EAST);

            RadioButtonActionListener actionListener = new RadioButtonActionListener();
            Democrat.addActionListener(actionListener);
            Republican.addActionListener(actionListener);
            Undecided.addActionListener(actionListener);

1 个答案:

答案 0 :(得分:0)

因此,根据我可以从您的代码段中确定,您想知道VoteChoice何时发生更改并更新ElectoralCollegeGUI中的字段。

现在您正在创建VoteChoice ...

的多个实例
for ( int i = 0; i < 56 ; i++)
{
    add(new VoteChoice(state[i] , voteValue[i]));
}

但是JRadioButtonElectoralCollegeGUI类的实例字段,这意味着这些字段只有VoteChoice的最后一个实例的上下文你创造了。

相反,单选按钮应该是VoteChoice类的实例字段,而VoteChoice应该监视其状态。

VoteChoice检测到更改时,它应该触发一个事件回到ElectoralCollegeGUI,描述已更改的内容。虽然您可以重用API中可用的众多侦听器类型之一,但您可以创建自己的侦听器类型,并且使用enum,您可以轻松确定已更改的内容...

public interface VoteChoiceListener {
    public enum Party {
        DEMOCRAT,
        REPUBLICAN,
        UNDECIDED;
    }

    public void voteCast(VoiceChoice choice, Party party);
}

然后,您将为VoteChoiceListener的每个实例注册VoteChoice的实例,以便在投票更改时触发事件

这基本上是观察者模式