Multiple Choice Test

Scratchy

Mitglied
Hallo,

ich soll für den Biologieunterricht ein Quiz erstellen.
Mit Java kam ich bisher gut zurecht...
Das Layout klappt soweit und das Action event funktioniert auch...

Doch wenn nun die zweite Frage gestellt wird, ist der ActionListener immer noch auf die Antworten der ersten Frage eingestellt.
Gibt es eine Möglichkeit den ActionListener zu entfernen und einen neuen zu definieren ?

Hier ist der Code:
Main:
Java:
public class biologie_main {


	
	public static void main(String[] args) {
		new Frage1();
	}

}

und die Frage 1:
Java:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Frage1 extends JFrame implements ActionListener{
 
	JFrame f;
	JLabel text = new JLabel("Hier kommt eine Biologie Frage hinein!");			//Frage Nr. 1
	JButton knopf1 = new JButton("Antwort A");									//Antwort A
	JButton knopf2 = new JButton("Antwort B");									//Antwort B
	JButton knopf3 = new JButton("Antwort C");									//Antwort C
	JButton knopf4 = new JButton("Antwort D");									//Antwort D
	int Punktzahl = 0;

	public Frage1(){
		f = new JFrame();
		
		f.setTitle("Biologie-Test   -   Frage 1"); //3 Leerzeichen
		
		f.add(text);
	
		f.add(knopf1);
		knopf1.addActionListener(this);
		f.add(knopf2);
		knopf2.addActionListener(this);
		f.add(knopf3);
		knopf3.addActionListener(this);
		f.add(knopf4);
		knopf4.addActionListener(this);
		f.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		f.setSize(800, 600);
		
		f.setBackground(Color.yellow);
		
		f.setLayout(new GridLayout(-1, 1));
		
		f.setVisible(true);
		
	}

	public void actionPerformed(ActionEvent a) {
		if(a.getSource() == knopf1){									// richtige Antwort
			System.out.println(a.getActionCommand());
			System.out.println(getTitle() + " " + "Richtig !");
			f.setBackground(Color.green);
			Punktzahl = Punktzahl + 1;
			System.out.println("Dein Punktestand beträgt:" + " " + Punktzahl);
			System.out.println(" ");
			Frage2();
		}else{															// falsche Antwort 
			System.out.println(a.getActionCommand());
			System.out.println(getTitle() + " " + "Falsch !");
			f.setBackground(Color.red);
			Punktzahl = Punktzahl + 0;
			System.out.println("Dein Punktestand beträgt:" + " " + Punktzahl);
			System.out.println(" ");
			Frage2();
		}
	}

	private void Frage2() {
		remove(f);
		f.setTitle("Biologie-Test   -   Frage 2");
		text.setText("Hier kommt die Biologie Frage Nr. 2 hinein");		//Frage Nr. 2
		text.repaint();
		knopf1.setText("Antwort A1");									//Antwort A
		knopf1.repaint();
		knopf2.setText("Antwort B1");									//Antwort B
		knopf2.repaint();
		knopf3.setText("Antwort C1");									//Antwort C
		knopf3.repaint();
		knopf4.setText("Antwort D1");									//Antwort D
		knopf4.repaint();
		
	}
}

Danke für eure Hilfe 🙂
 
Ich würde hier ein Frame erstellen,
das die Oberfläche zur Beantwortung zur Verfügung stellt.

Beim Starten werden die Fragen als Frage-Objekte in eine Liste geladen (optimalerweise als XML / Textdatei eingelesen). Je nach Beantwortung wird die nächste Frage geladen und die Oberfläche auf deren Informationen eingestellt ...

Nach deiner Vorgehensweise hast du ja dann ein Frame pro Frage. Und ob das so sinngemäß ist ...

Ganz grob die Klasse Frage

Java:
public class Frage
{
    private String frage;
    private String antwortA;
    private String antwortB;
    private String antwortC;
    private String antwortD;
    private String richtigeAntwort;

    public Frage( String frage, String antwortA, String antwortB, String antwortC, String antwortD, String richtigeAntwort )
    {
        this.frage = frage;
        this.antwortA = antwortA;
        this.antwortB = antwortB;
        this.antwortC = antwortC;
        this.antwortD = antwortD;
        this.richtigeAntwort = richtigeAntwort;
    }

    //Getter und Setter ...
}
 
Zuletzt bearbeitet:
Ich knüpfe an das an, was HarleyDavidson bereits gesagt hat.

Du brauchst eine Liste ArrayList<Frage> in der die Frageobjekte drin stehen.
Ausserdem brauchst du eine Integervariable in der auf die aktuelle Frage verwiesen wird.
Die steht am Anfang auf 0.

Mit frageArrayList.get(index) bekommst du das aktuelle Frageobjekt.

Deine Methode Frage2() würde ich umbenennen in naechsteFrage().
Innerhalb dieser kannst du die Choices umbenennen.(Nicht vergessen den index zu erhöhen)

In actionPerformed(e) fragst du dann nach
((JButton) e.getSource()).getText() == frageArrayList.get(index).getRichtig()
veränderst dementsprechend den Punktestand und rufst danach die Methode naechsteFrage() auf.

So ungefähr jedenfalls...

Viel Glück (und Spaß)
 

Zurück
Oben