2013-09-06 27 views
5

Zamierzam utworzyć aplikację pytań wielokrotnego wyboru z użyciem java swing. Stworzyłem klasę swingów z listą przycisków radiowych w osobnych jPanelach. Muszę znaleźć wybrany przycisk radiowy i zaznaczyć pod prawidłową odpowiedzią po przesłaniu przycisku. ale nie mogę uzyskać zaznaczonej listy wybranych przycisków radiowych. czy ktoś może zaproponować mi dobre rozwiązanie?otrzymujesz listę wybranych przycisków z listy rozwijanej

private void myInitComponents() { 

    jLabel = new javax.swing.JLabel(); 
    setLayout(new BorderLayout()); 
    jButton1 = new javax.swing.JButton(); 

    QuestionDaoIF questionDao = new QuestionDao(); 

    List<Question> listOfQuestion = questionDao.getQuestion(); 
    jPanel2 = new javax.swing.JPanel(); 
    jPanel2.setLayout(new BoxLayout(jPanel2, BoxLayout.Y_AXIS)); 
    JScrollBar vbar = new JScrollBar(JScrollBar.VERTICAL, 30, 100, 0, 300); 
    vbar.addAdjustmentListener(new MyAdjustmentListener()); 


    add(jLabel, BorderLayout.CENTER); 
    jPanel2.setAutoscrolls(true); 
    List<String> answerList = new ArrayList<>(); 
    List<Question> questionList = listOfQuestion ; 
    Collections.shuffle(questionList); 

    int i = 1; 
    for (Question question : questionList) { 

     QuestionPane pane = new QuestionPane(); 
     pane.getjTextPane1().setText("("+i+") "+question.getQuestion()); 
     //genarate random answers 
     genarateRandomAnswer(question, answerList, pane); 

     jPanel2.add(pane); 
     i++; 
    } 
    jButton1.setText("Submit"); 
    jButton1.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jButton1ActionPerformed(evt); 
     } 
    }); 

    jPanel2.add(jButton1); 
    //jPanel2.setBounds(100, 100, 800, 700); 
    this.add(getJMainScrollPane()); 
    this.setTitle("Quizz"); 
    this.setSize(1000, 700); 
    //pack(); 

} 

    private JScrollPane getJMainScrollPane() { 
    JScrollPane jMainScrollPane = new JScrollPane(jPanel2); 
    jMainScrollPane.setViewportBorder(BorderFactory 
      .createLineBorder(Color.GREEN)); 
    jMainScrollPane 
      .applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); 
    return jMainScrollPane; 
} 

private void genarateRandomAnswer(Question question, List<String> answerList, QuestionPane pane) { 
    String answer1 = question.getCorrectAnswer(); 
    String answer2 = question.getWrongAnswer1(); 
    String answer3 = question.getWrongAnswer2(); 
    String answer4 = question.getWrongAnswer3(); 

    List<Answer> answrList = new ArrayList<>(); 

    Answer ans1 = new Answer(); 
    ans1.setAnswer(answer1); 
    ans1.setCorrectAnswer(true); 

    Answer ans2 = new Answer(); 
    ans2.setAnswer(answer2); 
    ans2.setCorrectAnswer(false); 

    Answer ans3 = new Answer(); 
    ans3.setAnswer(answer3); 
    ans3.setCorrectAnswer(false); 

    Answer ans4 = new Answer(); 
    ans4.setAnswer(answer4); 
    ans4.setCorrectAnswer(false); 

    answrList.add(ans1); 
    answrList.add(ans2); 
    answrList.add(ans3); 
    answrList.add(ans4); 

    Collections.shuffle(answrList); 
    buttonGroup1 = new javax.swing.ButtonGroup(); 
    buttonGroup1.add(pane.getjRadioButton1()); 
    buttonGroup1.add(pane.getjRadioButton2()); 
    buttonGroup1.add(pane.getjRadioButton3()); 
    buttonGroup1.add(pane.getjRadioButton4()); 

    pane.getjRadioButton1().setText("(a) "+answrList.get(0).getAnswer()); 
    pane.getjRadioButton1().setHideActionText(answrList.get(0).isCorrectAnswer()); 
    pane.getjRadioButton2().setText("(b) "+answrList.get(1).getAnswer()); 
    pane.getjRadioButton2().setHideActionText(answrList.get(1).isCorrectAnswer()); 
    pane.getjRadioButton3().setText("(c) "+answrList.get(2).getAnswer()); 
    pane.getjRadioButton3().setHideActionText(answrList.get(2).isCorrectAnswer()); 
    pane.getjRadioButton4().setText("(d) "+answrList.get(3).getAnswer()); 
    pane.getjRadioButton4().setHideActionText(answrList.get(3).isCorrectAnswer()); 
} 

class MyAdjustmentListener implements AdjustmentListener { 

    @Override 
    public void adjustmentValueChanged(AdjustmentEvent e) { 
     jLabel.setText(" New Value is " + e.getValue() + "  "); 
     repaint(); 
    } 
} 
+0

Utwórz model pytania, z którego interfejs użytkownika może utworzyć widok. Pozwól widokowi ustawić wybraną odpowiedź z powrotem na model ... – MadProgrammer

+0

proszę, co jest logiką ??? Zapytania są losowo wyświetlane, gdzie zapisałeś wcześniejsze wybory? tylko w JLabel, getCorrectAnswer jest na sztywno? – mKorbel

+0

Mam już utworzone QuestionUI w klasie QuestionPane i używam jego obiektu tutaj –

Odpowiedz

7

Tworzenie QuestionAnswerPane która jest zdolna do podejmowania odniesienie do Question modelu

Panel ten będzie odpowiedzialny za generowanie pogląd reprezentowany przez model Question i przechowywanie odpowiedź użytkownika w nim.

Należy wiedzieć, co JRadioButton należy do którego. Gdy użytkownik wybierze jeden z przycisków radiowych, zaktualizuje model Question z odpowiedzią wybraną przez użytkownika.

Gdy użytkownik kliknie Submit, wystarczy przejrzeć wszystkie Question i pobrać odpowiedź wybraną przez użytkownika.

Oddziela także model od interfejsu użytkownika, co ułatwia obsługę. Dzięki temu pomysłowi możesz sprawdzić, czy na przykład wszystkie pytania zostały udzielone. To może być również realizowane poprzez dodanie coś jak ChangeListener do modelu

aktualizowana o przykład BASIC

Jest to tylko przykład zaprojektowane w celu wykazania koncepcję Question będąc sterownika centralnego/model

enter image description here

który bazując na zrzucie ekranu powyżej, wyjść ...

 
The color of a banana? 
      Your answer was : Yellow 
    The correct answer is : Yellow 
        You are : Right 
The utimate question of life the universe and every thing? 
      Your answer was : Choclate 
    The correct answer is : 42 
        You are : Wrong 
Who's your daddy? 
      Your answer was : R2D2 
    The correct answer is : Darth Vadar 
        You are : Wrong 
import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 
import javax.swing.AbstractAction; 
import javax.swing.ButtonGroup; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.TitledBorder; 

public class QuestionAnswer { 

    public static void main(String[] args) { 
     new QuestionAnswer(); 
    } 

    public QuestionAnswer() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new QuestionsPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class QuestionsPane extends JPanel { 

     public QuestionsPane() { 

      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      gbc.anchor = GridBagConstraints.WEST; 
      gbc.weightx = 1; 
      gbc.fill = GridBagConstraints.HORIZONTAL; 

      final List<Question> questions = new ArrayList<>(3); 
      questions.add(new Question("The color of a banana?", 
          new Answer("Yellow"), 
          new Answer("Pink"), 
          new Answer("Blue"), 
          new Answer("Orange") 
        )); 
      questions.add(new Question("The utimate question of life the universe and every thing?", 
          new Answer("42"), 
          new Answer("Sleep"), 
          new Answer("Choclate"), 
          new Answer("1024"), 
          new Answer("Microsoft"), 
          new Answer("Apple") 
        )); 
      questions.add(new Question("Who's your daddy?", 
          new Answer("Darth Vadar"), 
          new Answer("Anikin Skywalker"), 
          new Answer("Yoda"), 
          new Answer("Mace Windo"), 
          new Answer("Chewbacca"), 
          new Answer("R2D2") 
        )); 

      for (Question q : questions) { 

       add(new QuestionAnswerPane(q), gbc); 

      } 

      gbc.weighty = 1; 
      add(new JPanel(), gbc); 
      gbc.weighty = 0; 
      gbc.fill = GridBagConstraints.NONE; 
      gbc.anchor = GridBagConstraints.CENTER; 

      JButton submit = new JButton("Submit"); 
      submit.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        for (Question q : questions) { 
         System.out.println(q.getText()); 
         System.out.println("\t  Your answer was : " + q.getSelectedAnswer()); 
         System.out.println("\tThe correct answer is : " + q.getCorrectAnswer()); 
         System.out.println("\t    You are : " + (q.isCorrectAnswer() ? "Right" : "Wrong")); 
        } 
       } 
      }); 

      add(submit, gbc); 

     } 

    } 

    public class QuestionAnswerPane extends JPanel { 

     public QuestionAnswerPane(Question question) { 

      List<Answer> answers = new ArrayList<>(question.getWrongAnswers()); 
      answers.add(question.getCorrectAnswer()); 

      Collections.shuffle(answers); 

      setBorder(new TitledBorder(question.getText())); 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      gbc.anchor = GridBagConstraints.WEST; 
      gbc.weightx = 1; 
      gbc.fill = GridBagConstraints.HORIZONTAL; 

      ButtonGroup bg = new ButtonGroup(); 
      for (Answer answer : answers) { 

       JRadioButton rb = new JRadioButton(new AnswerAction(question, answer)); 
       bg.add(rb); 
       add(rb, gbc); 

      } 
      gbc.weighty = 1; 
      add(new JPanel(), gbc); 

     } 

    } 

    public class AnswerAction extends AbstractAction { 

     private final Question question; 
     private final Answer answer; 

     public AnswerAction(Question question, Answer answer) { 
      this.question = question; 
      this.answer = answer; 
      putValue(NAME, answer.getText()); 
     } 

     public Answer getAnswer() { 
      return answer; 
     } 

     public Question getQuestion() { 
      return question; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      getQuestion().setSelectedAnswer(answer); 
     } 

    } 

    public class Question { 

     private Answer correctAnswer; 
     private List<Answer> wrongAnswers; 
     private Answer selectedAnswer; 

     private String text; 

     public Question(String text, Answer correct, Answer... wrong) { 
      wrongAnswers = new ArrayList<>(Arrays.asList(wrong)); 
      correctAnswer = correct; 
      this.text = text; 
     } 

     public String getText() { 
      return text; 
     } 

     public Answer getCorrectAnswer() { 
      return correctAnswer; 
     } 

     public List<Answer> getWrongAnswers() { 
      return Collections.unmodifiableList(wrongAnswers); 
     } 

     public Answer getSelectedAnswer() { 
      return selectedAnswer; 
     } 

     public void setSelectedAnswer(Answer selectedAnswer) { 
      this.selectedAnswer = selectedAnswer; 
     } 

     public boolean isCorrectAnswer() { 
      Answer answer = getSelectedAnswer(); 
      Answer correct = getCorrectAnswer(); 
      return correct.equals(answer); 
     } 

     @Override 
     public String toString() { 
      return getText(); 
     } 

    } 

    public class Answer { 

     private String text; 

     public Answer(String text) { 
      this.text = text; 
     } 

     public String getText() { 
      return text; 
     } 

     @Override 
     public String toString() { 
      return getText(); 
     } 

    } 

} 
+0

miałeś zamiar użyć 'Question' model ustawić atrybut all na' QuestionAnswerPane', po iteracji 'QuestionAnswerPane' i pokazywać pytania? Mam problem, aby uzyskać wybraną wartość, gdy kliknę przycisk przesyłania –

+0

Nie. Mam na myśli, pozwolić 'QuestionAnswerPane' ustawić" wybierz odpowiedź od użytkownika "WRÓĆ na model' Pytanie', wtedy nie dbasz o to, jaki stan interfejs użytkownika jest ... – MadProgrammer

+0

Dodałem koncepcję koncepcyjną tego, o czym mówię. Powinieneś być w stanie zobaczyć, że 'Pytanie' jest kluczem, zawiera wszystkie informacje wymagane do ustalenia, jakie pytanie jest zadawane i co wybrał użytkownik, wszystko bez polegania na interfejsie w żaden sposób ... Nie chcę dbaj o to, skąd pochodzą odpowiedzi i jak są sformatowane ... – MadProgrammer