2013-12-02 4 views
0

помощь, мои вопросы:Обработка событий RadioButton после нажатия кнопки щелкнул

  1. почему не itemStateChanges срабатывает, я попытался поставить его во внутреннем классе ButtonHandler, а также в RadioButtonHandler Im возникают проблемы с ним, Каков правильный способ сделать это? Я хочу запускать и проверять отмеченные JRadioButtons после того, как пользователь нажмет кнопку «Проверить».

  2. Каков правильный способ проверить, какая кнопка была нажата, мне кажется, что сравнение строк - плохая практика программирования. Может быть, с помощью ID?

  3. Как я могу сделать кнопку «перезагрузки» (начало), я хочу снять все переключатели и снова запустить конструктор.

Благодарим за помощь!

import java.awt.*; 
import java.awt.event.*; 
import java.util.ArrayList; 

import javax.swing.*; 
    public class ExamFrame extends JFrame { 

     static ArrayList<Question> qArrList; 
     JRadioButton a1,a2,a3,a4; 
     public ExamFrame() { 
      super("Quiz"); 

      setLayout(new GridLayout(0, 1)); 
      GridBagConstraints gbc = new GridBagConstraints(); 

      Exam exam = new Exam(); 
      qArrList = exam.getExam(); 
      int count=0; 
      for(Question q : qArrList){ 
       count++; 
       JLabel questionLabel = new JLabel(count+". "+q.getQustion()); //swing constant ? 
       ArrayList<String> ansRand = q.getAllRandomAns(); 
       a1 = new JRadioButton(ansRand.get(0)); 
       a2 = new JRadioButton(ansRand.get(1)); 
       a3 = new JRadioButton(ansRand.get(2)); 
       a4 = new JRadioButton(ansRand.get(3)); 
       add(questionLabel); 
       add(a1);add(a2,gbc);add(a3);add(a4); 

       ButtonGroup radioGroup = new ButtonGroup(); //logical relationship 
       radioGroup.add(a1);radioGroup.add(a2);radioGroup.add(a3);radioGroup.add(a4); 
      } 
      //buttons: 
      JButton checkMe = new JButton("Check Exam"); 
      JButton refresh = new JButton("Start Over"); 
      ButtonHandler handler = new ButtonHandler(); 
      checkMe.addActionListener(handler); 
      refresh.addActionListener(handler); 
      add(checkMe); 
      add(refresh); 

     } 
      /** Listens to the radio buttons. */ 
      public class ButtonHandler implements ActionListener 
      { 
       public void actionPerformed (ActionEvent e) { 
        if(e.getActionCommand().equals("Start Over")){ //id? 
         //how to do this? 

        } 
        else{ 
         RadioButtonHandler handler = new RadioButtonHandler(); 
         a1.addItemListener(handler); 
         System.out.println("success?"); 
        } 
        JOptionPane.showMessageDialog(ExamFrame.this, String.format("You pressed: %s", e.getActionCommand())); 
       } 
       public void itemStateChanged(ItemEvent e) //can i add it here? 
       { 
        JOptionPane.showMessageDialog(ExamFrame.this, String.format("yes?")); 
        System.out.println("success!"); 
       } 

      } 
      public class RadioButtonHandler implements ItemListener 
      { 
       public void itemStateChanged(ItemEvent e) 
       { 
        JOptionPane.showMessageDialog(ExamFrame.this, String.format("radio state changed")); 

       } 

      } 
    } 
+0

Для кнопки обновления на примере, вы можете сделать 'если (e.getSource() = = refresh) ' –

ответ

3

почему «itemStateChanges» не срабатывает, я попытался поставить его во внутреннем класса «ButtonHandler», а также в «RadioButtonHandler» Im имея проблемы с ним, что это правильный путь сделай это? Я хочу вызвать и проверить отмеченные JRadioButtons после того, как пользователь нажмет кнопку «check» .

ButtonHandler осуществляется только с ActionListener:

public class ButtonHandler implements ActionListener{} 

itemStateChanged(ItemEvent) функция принадлежит ItemListener. Эта функция запускается, если изменяется состояние исходного компонента, к которому зарегистрирован этот прослушиватель. Так что реализуйте ItemListener. Однако, еще одно замечание, что JButton не отвечает на ItemListener, но JRadioButton будет. Поскольку эти события Item запускаются компонентами, реализующими интерфейс ItemSelectable. Некоторыми примерами таких компонентов являются: флажки, пункты меню, переключающие кнопки и комбинированные поля, включая кнопки радиосвязи, как указано выше.


Что такое правильный способ проверить, какая кнопка была нажата, я чувствую, как сравнения строк неправильно программирования. Может быть, с помощью ID

Ну используя функцию источника событий: e.getSource(), проверить, куда тип источника ваш ожидаемый тип и приведение его в соответствующий тип. И затем вы можете использовать функцию getName(String) и проверить имя, которое вы ожидали. Конечно, вы должны назначить имя, используя setName(String) после инициализации компонента. Или напрямую используйте ссылку на компонент, если она объявлена ​​в контексте класса, и у вас есть прямой доступ к компоненту.

 @Override 
     public void itemStateChanged(ItemEvent e) { 

      if(e.getSource() instanceof JCheckBox) 
      { 
       JCheckBox checkBox = (JCheckBox)e.getSource(); 
       if(checkBox.getName().equals("expectedName")) 
          ; // do my thing 
      } 
     } 

Как я должен сделать кнопку «сброс» (начать), я хочу, чтобы снять все радиокнопки и запустить конструктор еще раз.

Ну вы работаете с ButtonGroup. И ButtonGroup имеет приятную функцию: clearSelection(), чтобы помочь с чем угодно (Я не мог понять часть: запустите конструкторную часть), которую вы хотите.

Edit: Как вы хотели меня видеть ItemListener реализован класс, Да я могу видеть, что А:

  1. я не могу видеть, что вы на самом деле зарегистрирован экземпляр этого класса (a1.addItemListener(handler);) в любой компонент перед выполнением каких-либо действий на компонент, к которому ButtonHandler зарегистрирован: checkMe, refresh
  2. в дополнение к этому, в это действие выполняется функция, вы проверяете с командой действия, которые вы даже не установить с JButton.setActionCommand(String) функция. Вы не должны назначать слушателя (Item) в зависимости от события-события другого (Action) прослушивателя.

Учебник:

  1. How to Write an ItemListener
  2. How to Write an ActionListener
  3. How to Use the ButtonGroup Component
+0

Как я могу видеть, у меня есть класс, который реализует s ItemListener: Публичный класс RadioButtonHandler реализует ItemListener Так что ваш ответ на первый вопрос не помог мне – Yevgeni

+1

Проверьте, пожалуйста, редактирование. И постарайтесь сделать свой вопрос коротким в будущем. Мне потребовалось почти полчаса, чтобы написать этот пост. Возможно, вы захотите утверждать, что мне не хватает навыков, но, поскольку я не вижу другого ответа, решая вашу проблему, можно с уверенностью предположить, что каждый избегал вашего вопроса о его крупном размере – Sage