Im going to create multiple choice question application using java swing.I have created swing class with list of radio buttons inside separate jPanels.I need to find the selected radio button and make highlighted on correct answer when submit the button. but I cant get the selected radio button list in swing. can anyone suggest me a good solution ?
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();
}
}
Create a QuestionAnswerPane
which is capable of taking a reference to a Question
model
This panel will be responsible for generating the view represented by the Question
model and storing the user's response in it.
The QuestionAnswerPane
should know what JRadioButton
belongs to which answer
. When the user selects one of the radio buttons, it will update the Question
model with the answer that the user has selected.
When the user clicks Submit
, you would simply look up each Question
and retrieve the answer the user selected.
It also decouples the model from the UI making it easier to deal with. With this idea, you could actually check if all the questions have being answered for example. This could also be accomplished by adding something like a ChangeListener
to the model
Updated with BASIC example
This is only an example designed to demonstrate the concept of the Question
being the centralised controller/model
Which, based on the screen shot above, outputs...
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();
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With