我的程序是在选举学院模拟投票。每个州都有一定数量的选票。我在获取每个状态的按钮以将正确的投票数返回给总计时遇到麻烦,然后每次单击该方的按钮时将该总计打印到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);

最佳答案

因此,根据我可以从您的代码片段中确定的信息,您想知道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实例,以便当投票改变时它可以触发事件。

这基本上是观察者模式

07-28 14:20