Best Practice Wie erstelle ich ein cardlayout?

Bitte aktiviere JavaScript!
Hallo,

kann mir jemand erklären wie ich ein cardlayout erstelle?
Also ich habe einen JFrame und darin erstelle ich ein cardlayout. Drei Buttons, jeweils wenn ich einen betätige ändert sich die "Karte".

Suche irgend was unkompliziertes, habe mir schon eine Menge Beispiele angesehen, nur die wahren alle so zugestopft mit anderen Funktionen ich konnte dort nicht erkennen was das eigentliche cardlayout ist.

MFG

MasterShredder
 
Das CardLayout ist eigentlich relativ einfach. Du erstellst ein JPanel auf dem alle deine "Seiten" liegen. Diesem Panel gibst du als LayoutManager eine Instanz eines CardLayouts mit. Am besten speicherst du dir das Layout in einer Variable ... Macht es später einfacher - ist aber nicht zwingend nötig.
Als nächstes fügst du alle Seiten zu dem JPanel hinzu
Java:
CardLayout layout = new CardLayout();
JPanel content = new JPanel(Layout);

JPanel page1 = new JPanel();
... 
content.add(page1, "PAGE1");
JPanel page2 = new JPanel();
.... 
content.add(page2, "PAGE2");
Das CardLayout besitzt nun verschiedene Methode um zwischen den hinzugefügten Seiten zu wechseln. So gibt es zum Beispiel die Show Methode welche einen Container, hier JPanel, und einen String - also den Namen der Komponente - entgegen nimmt.
Java:
layout.show(content, "PAGE1");
layout.show(content, "PAGE2");
Die Aufrufe kannst du dann zB aus einem ActionListener heraus machen
 
Hallo,

habe nun mal diesen Quelltext geschrieben, nur aus irgendwelchen gründen will die "show" Anweisung nicht angenommen werden. ??

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

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.CardLayout;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class mainframe extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    mainframe frame = new mainframe();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public mainframe() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
       
        JPanel content = new JPanel();
        contentPane.add(content, BorderLayout.CENTER);
        content.setLayout(new CardLayout(0, 0));
       
        JPanel page1 = new JPanel();
        content.add(page1, "PAGE1");
        page1.setLayout(null);
       
        JLabel lblSeite1 = new JLabel("Seite1");
        lblSeite1.setBounds(178, 123, 66, 15);
        page1.add(lblSeite1);
       
        JPanel page2 = new JPanel();
        content.add(page2, "Page2");
        page2.setLayout(null);
       
        JLabel lblSeite2 = new JLabel("Seite2");
        lblSeite2.setBounds(172, 111, 66, 15);
        page2.add(lblSeite2);
       
        JMenuBar menuBar = new JMenuBar();
        contentPane.add(menuBar, BorderLayout.NORTH);
       
        JMenuItem mntmSeite = new JMenuItem("Seite1");
        mntmSeite.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                content.show("PAGE1");
            }
        });
        menuBar.add(mntmSeite);
       
        JMenuItem mntmSeite_1 = new JMenuItem("Seite2");
        mntmSeite_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                content.show("PAGE2");
            }
        });
        menuBar.add(mntmSeite_1);
    }
}
 
Eigentlich solltest du anhand der beiden Beispiel oben in der Lage sein das ganze selbst hinzubekommen. Hier noch mal ein vollständiges Beispiel:
Java:
public class CardLayoutTest {

    private static final String FIRST_PAGE_IDENTIFIER = "PAGE_1";
    private static final String SECOND_PAGE_IDENTIFIER = "PAGE_2";
    private static final String THIRD_PAGE_IDENTIFIER = "PAGE_3";

    private JPanel pageContainer;
    private CardLayout cardLayout;

    private void buildAndShowUI() {

        JFrame frame = new JFrame("CardLayout Test");
        frame.setSize(500,500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        JPanel pageContainer = buildPageContainer();
        JPanel buttonBar = buildButtonBar();

        frame.add(pageContainer);
        frame.add(buttonBar, BorderLayout.SOUTH);

        frame.setVisible(true);
    }

    private JPanel buildPageContainer() {
        cardLayout = new CardLayout();
        pageContainer = new JPanel(cardLayout);

        pageContainer.add(buildPage(FIRST_PAGE_IDENTIFIER), FIRST_PAGE_IDENTIFIER);
        pageContainer.add(buildPage(SECOND_PAGE_IDENTIFIER), SECOND_PAGE_IDENTIFIER);
        pageContainer.add(buildPage(THIRD_PAGE_IDENTIFIER), THIRD_PAGE_IDENTIFIER);

        return pageContainer;
    }

    private JPanel buildPage(String identifier) {
        JPanel page = new JPanel(new BorderLayout());
        page.add(new JLabel(identifier, JLabel.CENTER));
        return page;
    }

    private JPanel buildButtonBar() {
        JPanel buttonBar = new JPanel(new GridLayout(1, 3));
        buttonBar.add(buildButton(FIRST_PAGE_IDENTIFIER));
        buttonBar.add(buildButton(SECOND_PAGE_IDENTIFIER));
        buttonBar.add(buildButton(THIRD_PAGE_IDENTIFIER));

        return buttonBar;
    }

    private JButton buildButton(String identifier) {
        JButton button = new JButton(identifier);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed( ActionEvent e ) {
                cardLayout.show(pageContainer, identifier);
            }
        });
        return button;
    }

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

}
 
Robat: Eigentlich solltest du anhand der beiden Beispiel oben in der Lage sein das ganze selbst hinzubekommen.
Ehrlich gesagt! Nein!

Eigentlich dachte ich es gäbe nur "Eine" Möglichkeit oder Zwei Drei ..mit CardLayout... Fenster aufzurufen.
Aber da scheint es ja unendlich zu geben, ich werde hier auch mit Befehlen zu geworfen die kenne ich alle gar nicht.
Hatte eigentlich was simples gesucht, bin noch Anfänger habe gerade mal die Basics durch.

Wenn ich es auch so mache wie du es mir oben erklärt hast (Das ich die Methode auf dem Panel mit CardLayout aufrufen muss, habe die Buttons dort hin verschoben und aufgerufen) funktioniert es nicht. Die Buttons legen sich über den ganzen Panel und wenn ich mit "setBounds" sie an eine Position und eine Größe setzten will, schrumpft mein Panel weg.o_O
 
Also ich möchte niemandem zu nahe treten, aber:
- Man sollte sich immer ein Thema nach dem anderen von Grund auf erarbeiten. Die Vorstellung, dass man ohne eine Ahnung von einem Thema zu haben sich Dinge einfach so zusammen kopieren kann, geht früher oder später schief.
- Wenn Grundlagen fehlen, dann sollte man sich diese als erstes erarbeiten!

Also zum einen war die Aussage, dass Du show auf dem CardLayout aufrufen solltest und nicht auf irgendwelchen Paneln. In Deinem Code hast Du dir aber gar keine Referenz zu dem CardLayout in einer Variablen gespeichert, so dass es daran schon scheitert.
Aber ebenfalls wichtig: Da ging es um den Aufruf der show Methode. Wo die Buttons hinterlegt sind, ist da eigentlich egal. Daher ist da die Frage, wieso Du daran auch noch groß etwas dran rumbastelst. => Löse immer erst ein Problem systematisch und fang nicht zig gleichzeitige Baustellen an.

Bezüglich des Layouts: In Swing gibt es LayoutManager und diese sollte man kennen. Wenn Du in Swing etwas bauen willst, dann fang doch erst einmal klein an und spiel mit den Möglichkeiten erst einmal rum, so dass Du da die Grundlagen alle verstehst. Ein guter Anfang könnte hier das freie Buch Java ist auch eine Insel sein - Kapitel 19: http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_001.htm
Da findet sich dann auch ein Abschnitt zu LayoutManagern! (19.11 wäre das, 19.11.5 wäre BorderLayout das Du zu nutzen scheinst ....)
 
Ohne Worte.
Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.CardLayout;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class mainframe extends JFrame {

    private JPanel contentPane;
    private CardLayout layout;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    mainframe frame = new mainframe();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public mainframe() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
        
        layout = new CardLayout();
        JPanel content = new JPanel(layout);
        contentPane.add(content, BorderLayout.CENTER);
//        content.setLayout(new CardLayout(0, 0));
        
        JPanel page1 = new JPanel();
        content.add(page1, "PAGE1");
        page1.setLayout(null);
        
        JLabel lblSeite1 = new JLabel("Seite1");
        lblSeite1.setBounds(178, 123, 66, 15);
        page1.add(lblSeite1);
        
        JPanel page2 = new JPanel();
        content.add(page2, "Page2");
        page2.setLayout(null);
        
        JLabel lblSeite2 = new JLabel("Seite2");
        lblSeite2.setBounds(172, 111, 66, 15);
        page2.add(lblSeite2);
        
        JMenuBar menuBar = new JMenuBar();
        contentPane.add(menuBar, BorderLayout.NORTH);
        
        JMenuItem mntmSeite = new JMenuItem("Seite1");
        mntmSeite.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                layout.show(content, "PAGE1");
            }
        });
        menuBar.add(mntmSeite);
        
        JMenuItem mntmSeite_1 = new JMenuItem("Seite2");
        mntmSeite_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                layout.show(content, "PAGE2");
            }
        });
        menuBar.add(mntmSeite_1);
    }
}
Und ohne Worte von Eclipse.:oops:
 
Was soll ich da schreiben? Wie wäre es mit einfach "ohne Worte"? Hilft Dir das?

Wie wäre es mit etwas mehr Details darüber was geht oder nicht geht? Das wäre schon eine super Sache!

Ansonsten ist das ein super Beispiel, dass man eben nicht im Code ständig das verwendet, was man "Magic Numbers" nennt, auch wenn es hier Strings sind. Die packt man generell in Konstanten oder so.

Du versuchst bei dem Button Seite2 das Layout auf "PAGE2" zu setzen, nur leider heißt die Seite "Page2", so dass er nicht umschalten kann....
 
OH JAA Danke!!
Es klappt, wirklich peinlicher Fehler:mad:.

Noch was ich habe vorhin gelesen das die Schreibweise "PAGE1" alt.... Fehler verursachen kann, nur wie könnte ich es sonst noch schreiben?
 
Wahrscheinlich im YT Pong-Tutorial...

@MasterShredder wo hast Du denn die ganzen Weisheiten her?

Noch was ich habe vorhin gelesen das die Schreibweise "PAGE1" alt.... Fehler verursachen kann, nur wie könnte ich es sonst noch schreiben?
Hat doch @kneitzel schon geschrieben, mit "Konstanten", also als final deklarierte Klassenvariablen:
Java:
static final String FIRST_PAGE = "PAGE1";
static final String SECOND_PAGE = "PAGE2";
Wenn Du dann FIST_PAGE bzw. SECOND_PAGE im Code verwendest, hast Du das Problem nicht mehr (die Namen habe ich nur verwendet, um den Unterschied zwischen dem Bezeichner und dem String hervozuheben, natürlich kannst Du die Bezeichnung auch PAGE1 und PAGE2 nennen). Ach, Konstanten schreibt man übrigens in UPPER_CASE (also nur Großbuchstaben, Wörter durch Unterstrich getrennt).
 
OK,

Also von Kursen auf https://open.hpi.de/, aus einem Buch aus meiner Stadtbibliothek "Programmieren lernen mit Java" von Hans-Peter Habelitz und ein wenig aus dem Internet. Es kam mir auch komisch vor als ich das gelesen habe, weil man Klassen immer Groß schreiben soll. Ich habe es auch nur gerade in meinem Test Projekt so übernommen bis ich was näheres weiß.;)

Ja das das bei den Konstanten wieder was anderes ist, hab ich auch soo verstanden, das hat was mit der Zuordnung zu tun von CardLayout. ??
 
Zuletzt bearbeitet:
das hat was mit der Zuordnung zu tun von CardLayout. ??
??? Eine Konstante hat ganz einfach den Vorteil, dass sie einmalig definiert wird und anschließend der Bezeichner (vom Compiler geprüft) verwendet werden kann. Würdest Du statt FIRST_PAGE z. B. versehentlich first_page schreiben, bekommst Du einen Compiler-Fehler, weil es den Bezeichner first_page nicht gibt.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben