Zwischen verschiedenen Panels wechseln

pmSave

Mitglied
Hallo zusammen,
ich versuche gerade ein neues Spiel zu programmieren mit Swing.
Es besteht aus 2 "views", die ich in 2 verschiedenen JPanels untergebracht habe. Ein Startbildschirm und dann das echte Spiel.
Mein Problem besteht darin, dass ich das CardLayout dafür für unpassend halte und gerne mit einem JButton zwischen den beiden Panels wechseln möchte. Das habe ich auch implementiert, nur funktioniert es leider nicht, da mir nach betätigen des Buttons gar kein Panel mehr angezeigt wird.

hier die Methode die vom Button ausgeführt wird:

private void change() {
if (getContentPane() == contentPane) { //das 2. contentPane ist der Startbildschirm
contentPane.removeAll();
setContentPane(gamePane);
invalidate();
repaint();
} else {
contentPane.removeAll();
setContentPane(contentPane);
invalidate();
repaint();
}
}

ich habe mit invalidate() und repaint() hin und her probiert, aber etwas besseres als einen leeren JFrame nach betätigen des Buttons konnte ich nicht erreichen..
 
Ohne CardLayout:

Java:
import java.awt.BorderLayout;

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

public class Test {

    private JPanel content;
    private int index = 0;

    void createAndShowGUI() {
        JPanel panel1 = new JPanel();
        panel1.add(new JLabel("Panel 1"));

        JPanel panel2 = new JPanel();
        panel2.add(new JLabel("Panel 2"));

        final JPanel[] panels = {panel1, panel2};
        content = new JPanel(new BorderLayout());
        show(panels);

        JButton button = new JButton("Next");
        button.addActionListener(e -> nextPanel(panels));
       
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(content);
        frame.add(button, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    void nextPanel(JPanel[] p) {
        index = (index + 1) % p.length;
        show(p);
    }

    void show(JPanel[] p) {
        content.removeAll();
        content.add(p[index]);
        content.revalidate();
        content.repaint();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().createAndShowGUI());
    }
}

Mit CardLayout:

Java:
import java.awt.BorderLayout;
import java.awt.CardLayout;

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

public class Test {

    private JPanel content;
   
    void createAndShowGUI() {
        CardLayout layout = new CardLayout();
        content = new JPanel(layout);

        JPanel panel1 = new JPanel();
        panel1.add(new JLabel("Panel 1"));

        JPanel panel2 = new JPanel();
        panel2.add(new JLabel("Panel 2"));

        content.add(panel1);
        content.add(panel2);

        JButton button = new JButton("Next");
        button.addActionListener(e -> nextPanel());
       
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(content);
        frame.add(button, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    void nextPanel() {
        CardLayout layout = (CardLayout) content.getLayout();
        layout.next(content);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().createAndShowGUI());
    }
}
 
Danke für die schnelle Hilfe. Ich revidiere meine Aussage, dass das CardLayout für das Projekt ungeeignet ist.
Ich hatte nur eine falsche Vorstellung vom besagten und habe durch eigenständiges arbeiten gelernt wie man es benutzt und mittlerweile funktioniert es perfekt in meinem Programm. Alles Top.
 

Zurück
Oben