Получить выбранный список переключателей в разгаре
Я собираюсь создать приложение с несколькими вариантами ответов, используя Java 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();
}
}
1 ответ
Создать QuestionAnswerPane
который способен принять ссылку на Question
модель
Эта панель будет отвечать за создание представления, представленного Question
моделировать и хранить в нем ответ пользователя.
QuestionAnswerPane
должен знать что JRadioButton
принадлежит к которому answer
, Когда пользователь выбирает одну из переключателей, он обновит Question
модель с ответом, который выбрал пользователь.
Когда пользователь нажимает Submit
, вы бы просто посмотрели каждый Question
и получить ответ, выбранный пользователем.
Он также отделяет модель от пользовательского интерфейса, облегчая работу с ним. С этой идеей, вы могли бы на самом деле проверить, если все вопросы, например, ответили. Это также может быть достигнуто путем добавления чего-то вроде ChangeListener
к модели
Обновлен на базовом примере
Это всего лишь пример, предназначенный для демонстрации концепции Question
будучи централизованным контроллером / моделью
Который, основываясь на снимке экрана выше, выводит...
Цвет банана? Ваш ответ был: желтый Правильный ответ: желтый Вы правы Главный вопрос жизни вселенной и всего? Ваш ответ был: Choclate Правильный ответ: 42 Ты неправ Кто твой папочка? Ваш ответ был: R2D2 Правильный ответ: Дарт Вадар Ты неправ
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();
}
}
}