# Mehrere JPanel nacheinander?!



## mavinatic (21. Dez 2011)

Hallo Community,

meine GUI besteht aus mehreren Schritten.
Als erstes muss man sich einloggen danach kommt ein AuswahlBildschirm mit verschiedenen Comboboxen und dann ein Spielfeld.

Gibt es für diesen "workflow" ein bestimmtes Muster/Pattern? Oder wie löst ihr solche GUI-Probleme geschickt?

Gruß


----------



## Michael... (21. Dez 2011)

CardLayout wäre eine Möglichkeit


----------



## Camino (21. Dez 2011)

Oder: einloggen und AuswahlBildschirm mit verschiedenen Comboboxen in ein JDialog.


----------



## mavinatic (21. Dez 2011)

Ich glaube ich habe mich nicht korrekt ausgedrückt  ich meinte ich habe einzelne JPanels....welche komplett über das JFrame gezogen werden, es sind einzelne Seiten, welche Nacheinander abgearbeitet werden. 

LoginPanel <JPANEL>
SelectionPanel <JPANEL>
GamePanel <JPANEL>

Alle 3 JPanel benötigen die komplette Fläche, des JFrame ;-)


----------



## Gast2 (21. Dez 2011)

Ja, dann probier das CardLayout, dass Michael... schon erwähnt hat.


----------



## Camino (21. Dez 2011)

Na ja, du hattest gefragt:


mavinatic hat gesagt.:


> Oder wie löst ihr solche GUI-Probleme geschickt?



Das mit dem JDialog wäre so eine andere Lösungsmöglichkeit. Aber wenn du das in verschiedenen Panel hast, die du nacheinander anzeigen möchtest, dann kommst du wohl um das CardLayout nicht herum. Da kannst du dir deine Panel anzeigen lassen.


----------



## mavinatic (21. Dez 2011)

Ja das CardLayout schein perfekt dafür geschaffen zu sein :-D


----------



## mavinatic (21. Dez 2011)

Hallo Community,

ich habe das Beispiel von der Oracle Seite ausgetestet, aber es hat einen ganz anderen Effekt als in meinem Programm.
Link zum SourceCode von Oracle

Mein SourceCode:


```
package com.mmo.client.gui;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JButton;
import javax.swing.JPanel;

import com.mmo.client.data.Configuration;
import com.mmo.client.data.ConnectionHandler;
import com.mmo.client.graphics.GamePanel;

public class MainPanel extends JPanel implements ItemListener
{	
	private ConnectionHandler conHandler = new ConnectionHandler();
	private Configuration config = Configuration.getInstance();
			
	private JPanel cards = new JPanel();
	private LoginPanel loginPanel = new LoginPanel();
	private GamePanel gamePanel = null;
	
	public MainPanel()
	{
		this.conHandler.setAccountURL(config.getValue("connection.accountServiceUrl"));
		this.conHandler.setGameDataURL(config.getValue("connection.gameDataServiceUrl"));
		this.conHandler.setIp(config.getValue("connection.host"));
		this.conHandler.setPort(Integer.parseInt(config.getValue("connection.port")));
		
		this.gamePanel = new GamePanel(conHandler);
		this.setLayout(new BorderLayout());
		
		cards.add(loginPanel, LoginPanel.LOGINPANEL);
		cards.add(gamePanel, GamePanel.GAMEPANEL);
		
		JButton button = new JButton("HeelloWelt");
		button.addItemListener(this);
		this.add(button, BorderLayout.NORTH);
		this.add(cards, BorderLayout.CENTER);
	}
	
	public JPanel getCurrentPanel()
	{
		return null;
	}

	@Override
	public void itemStateChanged(ItemEvent arg0) 
	{
		System.out.println(arg0);
		CardLayout cl = (CardLayout) cards.getLayout();
		cl.show(cards,(String)arg0.getItem());
	}
	
	
}
```

Ich habe garnicht diesen Wechselnden Effekt?!


----------



## Michael... (21. Dez 2011)

- für Buttons verwendet man ActionListener
- es wird nirgends ein CardLayout verwendet bzw. dem JPanel cards zugewiesen.


----------



## kartugo (8. Jan 2012)

Hallo zusammen!

Da ich vor dem selben Problem stehe, häng ich mich hier rein.

Problemstellung:
das jPanel "startscreen" sollte beim Aufruf der Klasse MainFrame sofort angezeigt werden.
Dieses Panel wurde schon fertiggestellt und beinhaltet einen Butten "nextPanel".
Bei einem Klick auf diesen Button sollte das jPanel "nextPanel", welches auch schon vorhanden ist, angezeigt werde.

So, nun hab ich das Problem, dass das Panel "startscreen" gar nicht angezeigt wird.


```
public class MainFrame extends JFrame implements ActionListener {
    CardLayout cl;
    private JPanel cardPanel =  null;
    private JPanel startscreen1 = null;
    private JPanel nextPanel1 = null;


    public MainFrame(){

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setMinimumSize(new Dimension(700, 700));
        setAlwaysOnTop(true);
        initComponents();
        setVisible(true);
    }

    public final void initComponents(){


        Container contentPane = getContentPane();
        contentPane.setLayout(null);

        cardPanel = new JPanel(new CardLayout());
        startscreen1 = new startscreen();
        nextPanel1 = new nextPanel();
        getContentPane().add(startscreen1,"startscreen");

        startscreen.jButton2.addActionListener(this);
        pack();
    }

    @Override
    public void actionPerformed(ActionEvent evt) {
        Object source = evt.getSource();
        cl = (CardLayout)cardPanel.getLayout();

        if(source == startscreen.jButton2){
            System.out.println("OK");
            cl.show(cardPanel, "nextPanel");
        }
    }

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


----------



## jgh (8. Jan 2012)

du musst die "Karten" natürlich der Komponente adden, die auch das CardLayout hat.

So sollte es funktionieren...:


```
public final void initComponents() {

		cardPanel = new JPanel(new CardLayout());
		startscreen1 = new startscreen();
		nextPanel1 = new nextPanel();
		cardPanel.add(startscreen1, "startscreen");
		cardPanel.add(nextPanel1, "nextPanel");
		add(cardPanel, BorderLayout.CENTER);
		startscreen.jButton2.addActionListener(this);
		pack();
	}

	@Override
	public void actionPerformed(ActionEvent evt) {
		Object source = evt.getSource();
		cl = (CardLayout) cardPanel.getLayout();

		if (source == startscreen.jButton2) {
			System.out.println("OK");
			cl.show(cardPanel, "nextPanel");
		}
	}
```


----------



## kartugo (8. Jan 2012)

danke für die schnelle Antwort!

Habe die Komponenten der Karte hinzugefügt, es wird mir aber des Panel "startscreen" noch nicht sofort angezeigt, es öffnet sich nur das leere Frame.

Edit:
Habe den Container auskommentiert, nun läufts

```
Container contentPane = getContentPane();
contentPane.setLayout(null);
```


----------

