Hello! I want to make a test with questions and pictures to them.

How to insert different pictures for each item in the array, so that each window with a question opens its own picture?

Please be more detailed. I do not quite understand.

Quiz file

import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.CardLayout; import java.util.Random; import javax.swing.JOptionPane; public class Quiz extends JFrame{ JPanel p=new JPanel(); CardLayout cards=new CardLayout(); int numQs; int wrongs=0; int total=0; String[][] answers={ {"Enschede","Amsterdam","Den Haag","Berlin"}, {"Slang for Hankechief","Dutch for Keyboard","A Male Sheep","Width of a Cut"}, {"Euler","Erasmus","Fibonnaci","Archemides"}, {"Shadow of the Collosus","Lighthouse of Alexandria","Colliseum","Parthanon"}, {"Cars","Nothing","Planes","Plastic Materials"}, {"True","False"}, {"True","False"}, {"4","5","6","7"}, {"The Lion King","Hamlet","Death of The Salesmen","Phantom of the Opera"}, }; RadioQuestion questions[]={ new RadioQuestion( "What is the capital of the Netherlands?", answers[0], 1,this ), new RadioQuestion( "What is a kerf?", answers[1], 3,this ), new RadioQuestion( "Who discovered the number e?", answers[2], 0,this ), new RadioQuestion( "Which of the following is one of the 7 wonders of the ancient world?", answers[3], 1,this ), new RadioQuestion( "Which of the following is not made in China?", answers[4], 1,this ), new RadioQuestion( "True or False, Driving drunk is more dangerous than driving tired", answers[5], 1,this ), new RadioQuestion( "True or False, The Platypus is a mammal", answers[6], 0,this ), new RadioQuestion( "How many strings are there on a standard guitar?", answers[7], 2,this ), new RadioQuestion( "Which of these plays is made by shakespeare?", answers[8], 1,this ) }; public static void main(String args[]){ new Quiz(); } public Quiz(){ super("Quiz Game"); setResizable(true); setSize(500,400); setDefaultCloseOperation(EXIT_ON_CLOSE); p.setLayout(cards); numQs=questions.length; for(int i=0;i<numQs;i++){ p.add(questions[i],"q"+i); } Random r=new Random(); int i=r.nextInt(numQs); cards.show(p,"q"+i); add(p); setVisible(true); } public void next(){ if((total-wrongs)==numQs){ showSummary(); }else{ Random r=new Random(); boolean found=false; int i=0; while(!found){ i=r.nextInt(numQs); if(!questions[i].used){ found=true; } } cards.show(p,"q"+i); } } public void showSummary(){ JOptionPane.showMessageDialog(null,"All Done :), here are your results"+ "\nNumber of incorrect Answers: \t"+wrongs+ "\nNumber of Correct Answers: \t"+(total-wrongs)+ "\nAverage Incorrect Answers per Quesiotn: \t"+((float)wrongs/numQs)+ "\nPercent Correct: \t\t"+(int)(((float)(total-wrongs)/total)*100)+"%" ); System.exit(0); } } 

RadioQuestion file

 import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.ButtonGroup; import javax.swing.JLabel; import javax.swing.JButton; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JOptionPane; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class RadioQuestion extends JPanel implements ActionListener{ int correctAns; Quiz quiz; int selected; boolean used; //questions JPanel qPanel=new JPanel(); //answers JPanel aPanel=new JPanel(); JRadioButton[] responses; ButtonGroup group=new ButtonGroup(); //bottom JPanel botPanel=new JPanel(); JButton next=new JButton("Next"); JButton finish=new JButton("Finish"); /*public static void main(String args[]){ JFrame frame=new JFrame("RadioButton Test"); frame.setSize(400,300); frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); frame.setResizable(true); String[] answers={"wrong1","right","wrong2"}; frame.add(new RadioQuestion("what's right?",answers,1)); frame.setVisible(true); }*/ public RadioQuestion(String q, String[] options, int ans, Quiz quiz){ this.quiz=quiz; setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); correctAns=ans; //question qPanel.add(new JLabel(q)); add(qPanel); //answer responses=new JRadioButton[options.length]; for(int i=0;i<options.length;i++){ responses[i]=new JRadioButton(options[i]); responses[i].addActionListener(this); group.add(responses[i]); aPanel.add(responses[i]); } add(aPanel); //bottom next.addActionListener(this); finish.addActionListener(this); botPanel.add(next); botPanel.add(finish); add(botPanel); } public void actionPerformed(ActionEvent e){ Object src=e.getSource(); //next button if(src.equals(next)){ showResult(); if(selected==correctAns){ used=true; quiz.next(); } } //finish button if(src.equals(finish)){ quiz.showSummary(); } //radio buttons for(int i=0;i<responses.length;i++){ if(src==responses[i]){ selected=i; } } } public void showResult(){ String text=responses[selected].getText(); quiz.total++; if(selected==correctAns){ JOptionPane.showMessageDialog(null,text+" is correct\nWell Done :)"); }else{ quiz.wrongs++; JOptionPane.showMessageDialog(null,text+" is wrong\nSorry :("); } } } 
  • For this you need to explore the collection. - Roman C

1 answer 1

You do everything the same way you did before. Create an array of paths to the image and then transfer it to RadioQuestion and draw it.

Quiz.java

 String images[] = { "1.jpg", "2.jpg", "3.jpg", ... }; RadioQuestion questions[]={ new RadioQuestion( "What is the capital of the Netherlands?", answers[0], 1,this, images[0] ), new RadioQuestion( "What is a kerf?", answers[1], 3,this, images[1] ), ... } 

RadioQuestion.java

 public RadioQuestion(String q, String[] options, int ans, Quiz quiz, String path){ ... responses=new JRadioButton[options.length]; try{ JPanel img = new JPanel(); BufferedImage myPicture = ImageIO.read(new File(path)); JLabel picLabel = new JLabel(new ImageIcon(myPicture)); img.add(picLabel); add(img); } catch (Exception e) {} ... } 

Now your main problem is that you smear the data on the program and do not store them in one place with an easy access. Try using OOP and rewrite your program with classes that store data together. Life will become much easier:

 public class Question { public String Question; public String[] Answers; public int Answer; public String ImagePath; public Question(String question, ArrayList<String> answers, int answer, String imagePath){ this.Question = question; this.Answer = answer; this.Answers = answers; this.ImagePath = imagePath; } } 

Of course, it is also desirable to separate the graphical interface and data, but for this you will have to rewrite most of the program. Another good example would be to write a program so that questions are stored in an external file and you do not have to recompile it every time you want to make changes to the questions (add, delete, correct a typo, etc.).