Best Practice Wie erstelle ich ein cardlayout?

MasterShredder

Aktives Mitglied
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
 

Robat

Top Contributor
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
 

MasterShredder

Aktives Mitglied
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);
    }
}
 

Robat

Top Contributor
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());
    }

}
 

MasterShredder

Aktives Mitglied
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
 
K

kneitzel

Gast
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 ....)
 

MasterShredder

Aktives Mitglied
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:
 
K

kneitzel

Gast
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....
 

MasterShredder

Aktives Mitglied
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?
 

mihe7

Top Contributor
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).
 

MasterShredder

Aktives Mitglied
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:
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
O Wie erstelle ich eine Instanz in einer Klasse für die ich die Instanz will? Java Basics - Anfänger-Themen 4
M Wie erstelle ich dieses Parallelogramm??? Java Basics - Anfänger-Themen 6
S Wie erstelle ich eine Vorbedingung für eine Variable einer Methode ? Java Basics - Anfänger-Themen 5
J Wie erstelle ich ein Testprogramm in Eclipse? Java Basics - Anfänger-Themen 6
I erstelle Vorschaubild mit der lib PDF-Renderer und möchte danach Dateiname ändern -> geht aber nicht Java Basics - Anfänger-Themen 0
D Wie erstelle ich eine neue Hauptklasse mit eclipse? Java Basics - Anfänger-Themen 3
H Wie erstelle ich diese Klassen? Java Basics - Anfänger-Themen 44
J Wie erstelle ich Vektoren? Java Basics - Anfänger-Themen 5
J wie erstelle ich nun ein echtes "programm"? Java Basics - Anfänger-Themen 3
SexyPenny90 Wie erstelle ich ein extra Fenster mit einer Meldung Java Basics - Anfänger-Themen 2
N wie erstelle ich einen pfad? Java Basics - Anfänger-Themen 4
H Wie erstelle ich eine Liste? Java Basics - Anfänger-Themen 4
J wie erstelle ich die *.ico-datei? Java Basics - Anfänger-Themen 4
K Wie erstelle ich eine txt-Datei? Java Basics - Anfänger-Themen 10
G Wie erstelle ich eine ausführbare ".jar" Datei? Java Basics - Anfänger-Themen 22
A wie erstelle ich ein java programm= Java Basics - Anfänger-Themen 6
F Objekte dynamisch erstelle Java Basics - Anfänger-Themen 11
A Problem mit JBuilder -> Wie erstelle ich eine Datei?! Java Basics - Anfänger-Themen 5
N Abfragen eines Textes aus einem JTextField in Java, Funktion, CardLayout, Java Basics - Anfänger-Themen 2
Q CardLayout und NullPointer Java Basics - Anfänger-Themen 3
N Probleme mit Class in andere Class adden (Cardlayout) Java Basics - Anfänger-Themen 2
I Hangman CardLayout/repaint? Java Basics - Anfänger-Themen 2
S Toolbar im CardLayout Java Basics - Anfänger-Themen 4
U CardLayout Java Basics - Anfänger-Themen 3
R CardLayout: wrong parent Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben