2013-09-06 36 views
5

Im sẽ tạo ứng dụng câu hỏi trắc nghiệm bằng cách sử dụng java swing.I đã tạo lớp xoay với danh sách nút radio bên trong jPanels.I riêng biệt cần tìm nút radio đã chọn và làm nổi bật trên câu trả lời chính xác khi gửi nút. nhưng tôi không thể có được danh sách nút radio được chọn trong xoay. bất cứ ai có thể đề nghị cho tôi một giải pháp tốt?lấy danh sách nút radio đã chọn trong xoay

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

Tạo mô hình câu hỏi mà giao diện người dùng có thể tạo chế độ xem. Cho phép chế độ xem đặt lại câu trả lời đã chọn cho mô hình ... – MadProgrammer

+0

xin vui lòng whats logic ??? quesions được hiển thị ngẫu nhiên, bạn đã lưu trữ các lựa chọn trước đó ở đâu ??? chỉ trong JLabel, getCorrectAnswer được mã hóa cứng ??? – mKorbel

+0

Tôi đã tạo QuestionUI trong lớp QuestionPane và tôi sử dụng đối tượng của nó ở đây –

Trả lời

7

Tạo một QuestionAnswerPane có khả năng tham gia một tham chiếu đến một mô hình Question

bảng điều khiển này sẽ chịu trách nhiệm tạo ra các quan điểm thể hiện bằng mô hình Question và lưu trữ phản ứng của người dùng trong đó.

QuestionAnswerPane cần biết nội dung JRadioButton thuộc về answer. Khi người dùng chọn một trong các nút radio, nó sẽ cập nhật mô hình Question với câu trả lời mà người dùng đã chọn.

Khi người dùng nhấp vào Submit, bạn chỉ cần tìm kiếm từng số Question và truy xuất câu trả lời mà người dùng đã chọn.

Nó cũng tách riêng mô hình khỏi giao diện người dùng giúp dễ xử lý hơn. Với ý tưởng này, bạn thực sự có thể kiểm tra xem tất cả các câu hỏi đã được trả lời chẳng hạn. Điều này cũng có thể được thực hiện bằng cách thêm một cái gì đó giống như một ChangeListener với mô hình

cập nhật với ví dụ BASIC

Đây chỉ là một ví dụ thiết kế để chứng minh các khái niệm về các Question là bộ điều khiển trung/mô hình

enter image description here

nào, dựa trên ảnh chụp màn hình ở trên, kết quả đầu ra ...

 
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

bạn có nghĩa là sử dụng mô hình' Question' đặt thuộc tính all thành 'QuestionAnswerPane', sau khi lặp lại' QuestionAnswerPane 'và hiển thị câu hỏi? Tôi có vấn đề với getSelectedValue khi tôi nhấp vào nút gửi –

+0

Không. Ý tôi là, hãy cho phép 'QuestionAnswerPane' đặt" câu trả lời chọn từ người dùng "TRỞ LẠI mô hình' Câu hỏi', sau đó bạn không quan tâm đến trạng thái nào giao diện người dùng đang ở trong ... – MadProgrammer

+0

Tôi đã thêm khái niệm khái niệm về những gì tôi đang nói đến. Bạn sẽ có thể thấy rằng 'Câu hỏi' là chìa khóa, nó chứa tất cả thông tin cần thiết để xác định câu hỏi đang hỏi và những gì người dùng đã chọn, tất cả mà không dựa vào giao diện người dùng theo bất kỳ cách nào ... Tôi không quan tâm đến câu trả lời đến từ đâu hoặc cách chúng được định dạng ... – MadProgrammer

Các vấn đề liên quan