2015-10-11 1 views
1

Моя программа моделирует голосование в Избирательном колледже. Каждое государство имеет определенное количество голосов. У меня возникли проблемы с получением моих кнопок для каждого состояния, чтобы вернуть достаточное количество голосов на общую сумму, а затем распечатать эту сумму на экране в JTextField при каждом нажатии кнопки для этой стороны.Нужна помощь, чтобы получить 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); 
+0

Я понимаю, что вы хотите, чтобы найти решение проблемы, но это не очень уместно удалить и перескажите свой вопрос, особенно в течение 12-часового периода, их много людей которые все еще будут регистрироваться в течение следующих 24 часов, которые могут помочь, поэтому вам может понадобиться быть маленьким пациентом. – MadProgrammer

+0

Если все, что вы хотите знать, - это когда кнопка запускается (или выбрана в вашем случае), ActionListener вероятно, ваш лучший выбор – MadProgrammer

+0

Вы можете получить более качественные ответы, если вы предоставите компилябельный и исполняемый пример, который демонстрирует вашу проблему. – MadProgrammer

ответ

0

Таким образом, от того, что я могу определить, от вас фрагмент кода, вы хотите знать, когда изменения происходят на VoteChoice и обновить поле в ElectoralCollegeGUI.

Теперь вы создаете несколько экземпляров VoteChoice ...

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

Но JRadioButton «s являются экземпляр Полем ElectoralCollegeGUI класса, это будет означать, что поля будут иметь только контекст последние экземпляр 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 таким образом это может вызвать событие, когда изменяется голосование

Это в основном шаблон наблюдатель

+0

Хорошо, что помогает, но я думаю, что мой вопрос сейчас, со слушателем. Как я могу определить, какие кнопки кнопок выбираются/отменены? Является ли законным передавать в моем массиве для государств и их значения голоса в Слушателя? – user3712626

+0

Реально, все, что вы (кажется) хотите знать, это тот, который выбран на самом деле (может быть, я ошибаюсь), к которому вы бы просто использовали метод voteCast. Вы можете определить, какая кнопка была выбрана с помощью метода actionListener и метода getSource ActionEvent.Я бы также использовал ButtonGroup для управления кнопками, это гарантирует, что только одна кнопка может быть выбрана за раз автоматически. Хорошо, вы также можете использовать значение VoiceChoice, чтобы определить, в каком состоянии было подано голосование, возможно, либо используйте карту в родительском классе, либо передайте состояние в VoteChoice и предоставив метод getState. – MadProgrammer

+0

Я бы не передал массив в VoteChoice, но вместо этого передал фактическое состояние, которое он представляет – MadProgrammer