# CardLayout bei einem Quiz



## Recover (8. Aug 2006)

Hallo,

ich hab mir schon ein paar Threads zum Thema CardLayout durchgelesen. Einiges konnte ich auch in mein Programm
einarbeiten, nur leider gibt es da noch ein paar Probleme.
Mein JFrame ist in mehrere Panels aufgeteilt und nach dem drücken auf den Knopf soll eine neue Frage erscheinen...
Ich bin noch am Anfang des Programmes und somit wollte ich es erstmal beim Knopfdruck die Frage ändern lassen.
Leider erscheint beim anwenden des CardLayouts auf mein FragenPanel der Text nicht mehr.

Hat vielleicht jemand von euch eine Lösung für mich parat? Geht es vielleicht auch ohne CardLayout?

Anbei mein bisheriger Code:



```
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class radio extends JFrame {

	//	Variablen
	
		private JPanel	ueberschriftPanel, fragenPanel, fragenPanel1, antwortenPanel, knopfPanel, punktePanel, cards;
		private JLabel	ueberschriftText, fragenText, punkteText, fragenText1;
		private JRadioButton	antwort1, antwort2, antwort3, antwort4, antwort5;
		private JButton	beep;
		
		
	radio()
	{
		super();
		this.setTitle("Quiz");
		this.setLayout(null);
		
	//	Überschrift
		
		ueberschriftPanel	=	new JPanel();
		ueberschriftPanel.setSize(90,50);
		ueberschriftPanel.setLocation(270,10);
		
		ueberschriftText	=	new JLabel("Das Quiz!");
		
		ueberschriftPanel.add(ueberschriftText);
		this.add(ueberschriftPanel);
			
			
//			Fragen
				
				fragenPanel			=	new JPanel();
				fragenPanel.setSize(200,200);
				fragenPanel.setLocation(20,100);
				fragenText			=	new JLabel();
				fragenText.setText("<html>Frage 1 von 25: 
Was steht hinter dem Bus?</html>");
				fragenPanel.add(fragenText);
				
				
				fragenPanel1			=	new JPanel();
				fragenPanel1.setSize(200,200);
				fragenPanel1.setLocation(20,100);
				fragenText1			=	new JLabel();
				fragenText1.setText("<html>Frage 2 von 25: 
Was steht vor dem Zug?</html>");
				fragenPanel1.add(fragenText1);
				
				cards				= new JPanel(new CardLayout());
						
				cards.add("a", fragenPanel);
				cards.add("b", fragenPanel1);
				
				
				fragenPanel.setBackground(new Color(24,24,244));
						
				this.add(cards);
		
		
		
	//	Antworten
		
		antwortenPanel		=	new JPanel();
		antwortenPanel.setSize(380,200);
		antwortenPanel.setLocation(230,100);
		antwortenPanel.setLayout(new GridLayout(5,1));
		
		antwort1			=	new JRadioButton("Antwort die 1.!");
		antwort2			=	new JRadioButton("Antwort die 2.!");
		antwort3			=	new JRadioButton("Antwort die 3.!");
		antwort4			=	new JRadioButton("Antwort die 4.!");
		antwort5			=	new JRadioButton("Antwort die 5.!");
		
		ButtonGroup		antwortenGroup	=	new		ButtonGroup();
		
		antwortenGroup.add(antwort1);
		antwortenGroup.add(antwort2);
		antwortenGroup.add(antwort3);
		antwortenGroup.add(antwort4);
		antwortenGroup.add(antwort5);
		
		antwortenPanel.add(antwort1);
		antwortenPanel.add(antwort2);
		antwortenPanel.add(antwort3);
		antwortenPanel.add(antwort4);
		antwortenPanel.add(antwort5);
		this.add(antwortenPanel);
		
		
		
	//	Knöpfe
		
		knopfPanel				=	new	JPanel();
		knopfPanel.setSize(150,50);
		knopfPanel.setLocation(400,350);
		
		beep					=	new JButton("weiter");		
		
		knopfPanel.add(beep);
		this.add(knopfPanel);
		
		
		
	//	Punkte
		
		punktePanel				=	new	JPanel();
		punktePanel.setSize(150,50);
		punktePanel.setLocation(70,350);
		punkteText				=	new	JLabel("Deine Punkte: ");
		
		punktePanel.add(punkteText);
		this.add(punktePanel);
		
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
		
		beep.addActionListener(new ActionListener() {
	        public void actionPerformed(ActionEvent e) {
	            Object source = e.getSource();
	            if(source==beep){
	                ((CardLayout)cards.getLayout()).show(cards, "b");
	            }
	        }});
		
	}
	
	
	
	
	
	
	public static void main(String[] args) 
	{
		radio fenster	= new radio();
		fenster.setSize(640,480);
		fenster.setLocation(350,200);
		
		fenster.setVisible(true);

	}
	
}
```


----------



## Recover (11. Aug 2006)

hat keiner ne lösung? sollte eigentlich ein geschenk für meine freundin zum jahrestag werden. ich weis nicht mehr weiter...


----------



## L-ectron-X (11. Aug 2006)

Hier mal ein Rohbau, den du entsprechend weiterentwickeln kannst:

```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Quiz extends JFrame {
   private JLabel headline, points;
   private JButton next;
   private JPanel mainPanel, cardPanel, panel;
   private Question1 quest1;
   private Question2 quest2;
   private CardLayout cards;

   public Quiz(String title) {
      super(title);
      setSize(600, 500);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      
      //Hauptpanel für äußeren Rahmen und alle Komponenten
      mainPanel = new JPanel(new BorderLayout());
      mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
      
      //Überschrift
      headline = new JLabel("<html><font size=5>Ein Quiz von ... für ...</font></html>");
      headline.setBorder(BorderFactory.createEmptyBorder(0, 0, 20, 0));
      headline.setHorizontalAlignment(SwingConstants.CENTER);
      mainPanel.add(headline, BorderLayout.NORTH);
      
      //Punktzahl-Label
      points = new JLabel("Deine Punkte: 0");

      //Weiter-Button
      next = new JButton("Weiter");
      next.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            cards.next(cardPanel);
         }
      });
      
      //Panel zum Tauschen und Anzeigen der Fragen
      cards = new CardLayout();
      cardPanel = new JPanel(cards);
      cardPanel.setBorder(BorderFactory.createEtchedBorder());
      
      quest1 = new Question1(this);
      quest2 = new Question2(this);
      cardPanel.add(quest1, "1");
      cardPanel.add(quest2, "2");
      
      //Punktzahl und Weiter-Button anordnen
      panel = new JPanel(new BorderLayout());
      panel.setBorder(BorderFactory.createEmptyBorder(20, 0, 0, 0));
      panel.add(points, BorderLayout.WEST);
      panel.add(next, BorderLayout.EAST);
      
      //Hauptpanel bestücken
      mainPanel.add(panel, BorderLayout.SOUTH);
      mainPanel.add(cardPanel, BorderLayout.CENTER);
      add(mainPanel, BorderLayout.CENTER);
   }

   public static void main(String[] args) {
      try {
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      }
      catch(Exception e) {}
      new Quiz("Quiz").setVisible(true);
   }
}
```


```
import javax.swing.*;
import java.awt.*;

public class Question1 extends JPanel {
   private JRadioButton rb1, rb2, rb3;
   private ButtonGroup group;
   private JLabel question;
   private Quiz owner;
   
   public Question1(Quiz owner) {
      this.owner = owner;
      
      setLayout(new BorderLayout());

      group = new ButtonGroup();

      question = new JLabel("<html><font size=4>Frage 1: In welcher Programmiersprache wurde dieses Quiz erstellt?</font></html>");
      question.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
      
      JPanel panel = new JPanel(new GridLayout(0, 1));
      panel.setBorder(BorderFactory.createEmptyBorder(0, 60, 30, 20));
      
      rb1 = new JRadioButton("Antwort 1: Russisch");
      group.add(rb1);
      panel.add(rb1);
      
      rb2 = new JRadioButton("Antwort 2: Japanisch");
      group.add(rb2);
      panel.add(rb2);

      rb3 = new JRadioButton("Antwort 3: Java");
      group.add(rb3);
      panel.add(rb3);
      
      add(question, BorderLayout.NORTH);
      add(panel, BorderLayout.CENTER);
   }
}
```


```
import javax.swing.*;
import java.awt.*;

public class Question2 extends JPanel {
   private JRadioButton rb1, rb2, rb3;
   private ButtonGroup group;
   private JLabel question;
   private Quiz owner;

   public Question2(Quiz owner) {
      this.owner = owner;

      setLayout(new BorderLayout());

      group = new ButtonGroup();

      question = new JLabel("<html><font size=4>Frage 1: Welchen Namen sollte Java ursprünglich erhalten?</font></html>");
      question.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

      JPanel panel = new JPanel(new GridLayout(0, 1));
      panel.setBorder(BorderFactory.createEmptyBorder(0, 60, 30, 20));

      rb1 = new JRadioButton("Antwort 1: George");
      group.add(rb1);
      panel.add(rb1);

      rb2 = new JRadioButton("Antwort 2: Oak");
      group.add(rb2);
      panel.add(rb2);

      rb3 = new JRadioButton("Antwort 3: Elizabeth");
      group.add(rb3);
      panel.add(rb3);

      add(question, BorderLayout.NORTH);
      add(panel, BorderLayout.CENTER);
   }
}
```


----------



## Recover (11. Aug 2006)

Danke L-ectron-X für deine Mühe!!!
Ich werde etwas darauf aufbauen.


----------



## Recover (9. Sep 2006)

momentan hab ich das problem, dass ich nicht weis wie ich es realisieren kann, die punktezahl bei einer richtigen antwort zu
erhöhen und bei einer falschen zu reduzieren...
kann mir da vielleicht jemand unter die arme greifen?


----------



## Recover (11. Sep 2006)

ich hab es grad mit vererbung probiert...
also quiz in der question klasse extended um beim drücken auf den weiter button die punktezahl zu erhöhen oder zu verringern....
aber irgendwie funzt das auch nicht so richtig


----------



## L-ectron-X (12. Sep 2006)

Probiere es mal mit einer statischen int-Variable, die einen Wert nach deiner Vorgabe addiert bzw. subtrahiert.


----------



## Recover (13. Sep 2006)

da hab ich ja dann aber immernoch das problem mit dem klassenübergreifen....
da müsste ich ja dann die 'Question' klasse von 'Quiz.java' ableiten....
weil ja der weiter button in der quiz klasse definiert ist und ich ja beim klicken darauf
prüfen muss ob der richtige radio button ausgewählt wurde....


----------



## L-ectron-X (13. Sep 2006)

Sorry, ich verstehe dein Problem nicht.
Schreib doch eine Klasse _Evaluation_ (Auswertung), die eine statische int-Variable namens _points_ (Punkte) und eine entsprechende Zugriffsmethode _addPoints(int value)_ bzw. _removePoints(int value)_ hält.
Je nach nach dem, welcher JRadioButton geklickt wurde kannst du doch nun Punkte vergeben oder abziehen...
z.B.

```
Evaluation.addPoints(5);
```
Bei der Schlussauswertung rufst du eine Methode

```
int points = Evaluation.getPoints();
```
auf, um die Gesamtpunktzahl zu ermitteln.


----------



## Recover (14. Sep 2006)

das mit dem punktezählen im hintergrund wäre ja kein problem...
aber die momentane punktezahl soll ja permanent in den einem Label angezeigt werden....
und ich weis halt nicht wie ich die punktzahl von den einzelnen fragenklassen (question) in die
anzeigeklasse (quiz) bekomme...  
der quellcode ist im groben und ganzen noch deiner von da oben, den du mir netterweise zur
verfügung gestellt hast...


----------

