получить выбранный список переключателей в качели

Я собираюсь создать приложение для вопросов с несколькими вариантами ответов, используя Java Swing. Я создал класс Swing со списком переключателей внутри отдельных jPanels. Мне нужно найти выбранный переключатель и выделить правильный ответ при отправке кнопки. но я не могу получить список выбранных переключателей. может ли кто-нибудь предложить мне хорошее решение?

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();
    }
}

person Madura Harshana    schedule 06.09.2013    source источник
comment
Создайте модель вопроса, представление которой может создать пользовательский интерфейс. Разрешить представлению установить выбранный ответ обратно в модель...   -  person MadProgrammer    schedule 06.09.2013
comment
пожалуйста какая логика??? вопросы отображаются случайным образом, где вы хранили предыдущие выборы??? только в JLabel getCorrectAnswer жестко запрограммирован???   -  person mKorbel    schedule 06.09.2013
comment
Я уже создал QuestionUI в классе QuestionPane и использую здесь его объект   -  person Madura Harshana    schedule 06.09.2013
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 06.09.2013
comment
да, вопросы и ответы отображаются случайным образом, нет, getCorrectAnswer() является геттером в вопросе pojo и сохраняет правильный ответ. Я использовал отдельный ответ dto, чтобы установить true правильный ответ и сохранить его как setHideActionText()   -  person Madura Harshana    schedule 06.09.2013


Ответы (1)


Создайте QuestionAnswerPane, способный ссылаться на модель Question.

Эта панель будет отвечать за создание представления, представленного моделью Question, и сохранение в нем ответа пользователя.

QuestionAnswerPane должен знать, какой JRadioButton принадлежит какому answer. Когда пользователь выбирает один из переключателей, он обновляет модель Question ответом, который выбрал пользователь.

Когда пользователь нажимает Submit, вы просто просматриваете каждый Question и получаете ответ, выбранный пользователем.

Это также отделяет модель от пользовательского интерфейса, что упрощает работу с ней. С этой идеей вы могли бы проверить, например, на все ли вопросы были даны ответы. Этого также можно добиться, добавив в модель что-то вроде ChangeListener.

Обновлено с помощью примера BASIC

Это всего лишь пример, предназначенный для демонстрации концепции Question как централизованного контроллера/модели.

введите здесь описание изображения

Что, судя по снимку экрана выше, выводит...

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();
        }

    }

}
person MadProgrammer    schedule 06.09.2013
comment
Вы имели в виду, что с помощью модели Question установите для атрибута all значение QuestionAnswerPane после итерации QuestionAnswerPane и показа вопросов? У меня проблема с получениемSelectedValue, когда я нажимаю кнопку отправки - person Madura Harshana; 06.09.2013
comment
Нет. Я имею в виду, разрешите QuestionAnswerPane установить выбор ответа от пользователя НАЗАД на модель Question, тогда вам все равно, в каком состоянии находится пользовательский интерфейс... - person MadProgrammer; 06.09.2013
comment
Я добавил концептуальную концепцию того, о чем я говорю. Вы должны увидеть, что Question является ключом, он содержит всю информацию, необходимую для определения того, что задает вопрос и что выбрал пользователь, и все это без какой-либо зависимости от пользовательского интерфейса... Мне все равно, где откуда приходят ответы или как они отформатированы... - person MadProgrammer; 06.09.2013
comment
Спасибо за ваше руководство. - person Madura Harshana; 06.09.2013
comment
Мне нужно отобразить правильный ответ вместе с вопросом, поэтому не могли бы вы дать мне небольшую идею, чтобы отметить правильный ответ (выделение текста переключателя) в QuestionPane. Основная проблема в том, что я не могу специально выбрать вопрос извлечения в пользовательском интерфейсе. - person Madura Harshana; 07.09.2013
comment
Есть несколько способов сделать это, в QuestionAnswerPane вам нужно будет указать метод, который можно использовать для выделения ответа (например, highlightCorrectNaswer). Вам нужно будет сохранить ссылку на JRadioButton, который представляет правильный ответ, вы можете сделать это в цикле, который создает кнопки. В основном пользовательском интерфейсе вам нужно будет вести список панелей и связанных с ними вопросов, это можно сделать с помощью карты. - person MadProgrammer; 08.09.2013