Como usar efetivamente o cardlayout em java para mudar do painel usando botões dentro de vários construtores de painel

Eu sou novo no uso do cardlayout e tenho algumas perguntas sobre como implementá-lo. Primeiro, gostaria de saber a melhor maneira de implementar o layout do cartão para que eu possa alternar de painel para painel. Minha principal pergunta é como usar botões dentro dos construtores dos meus painéis para alternar de painel para painel. Comecei a trabalhar neste projeto hoje, para que você veja algum código que não está concluído ou que não faz sentido. Primeiro tentei fazer todas as minhas aulas estender o JFrame, mas isso levou a várias janelas indesejadas. Se eu puder obter algum tipo de exemplo de como usar efetivamente o layout do cartão e como alternar entre painéis usando os botões nos meus outros construtores de painéis. Minhas tentativas de usar o cardlayout funcionaram apenas para os botões que eu criei na minha classe de interface gráfica, mas esse não é o resultado que eu quero. Por favor, ajude se puder e obrigado antecipadamente.

Esta é a minha turma principal.

public class controller{
    public static void main(String[] args){

        new Gui();


    }
}

Esta é a minha aula de GUI.

import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class Gui extends JFrame{
    homePage home = new homePage();
    public JPanel loginPanel = new textEmailLog(), 
    registerPanel = new Register(),
    homePanel = new homePage(), viewPanel  = new emailView(),
    loadPanel = new loadEmail(), contentPanel = new JPanel(new CardLayout());
    CardLayout cardLayout = new CardLayout();


    public Gui(){
        super("Email Database Program");
        setSize(700,700);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        contentPanel.setLayout(cardLayout);

        contentPanel.add(loginPanel, "Login");
        contentPanel.add(registerPanel, "Register");
        contentPanel.add(homePanel, "Home");
        contentPanel.add(viewPanel, "View");
        contentPanel.add(loadPanel, "Load");
        this.setContentPane(contentPanel);

        cardLayout.show(contentPanel, "Login");


        setVisible(true);


    }

Classe Meu Painel de Login

import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

//panel has been added
public class textEmailLog extends JPanel{
        JPanel logGui = null;
        JButton registerBut, logBut;
        JTextField Login;

    public textEmailLog(){
        //default characteristics
        setSize(700,700);
        setName("Email Database");
        //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        //Labels for username and password
        JLabel userLab = new JLabel("Username");
        JLabel pwLab = new JLabel("Password");

        //textfields for username and password
        Login = new JTextField("", 15);
        JPasswordField Password = new JPasswordField("", 15);
        Password.setEchoChar('*');

        //login button that confirms username and password
        logBut = new JButton("Login");
        logBut.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                //needs regex checks prior to logging in 

                if(e.getSource() == logBut){
                    /* Change the panel to the homepage
                    if(Login.getText().equals() && Password.getText().equals()){

                    }
                */  
                    new homePage();
                }


            }
        });

        registerBut = new JButton("Register");
        registerBut.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if(e.getSource() == registerBut){
                    //Change the panel to the register panel
                }
            }

        });

        //Box layout for organization of jcomponents
        Box verticalContainer = Box.createVerticalBox();
        Box horizontalContainer = Box.createHorizontalBox();
        Box mergerContainer = Box.createVerticalBox();


        //add to panel
        verticalContainer.add(Box.createVerticalStrut(300));//begin relative to the center
        verticalContainer.add(userLab);//Login label and text
        verticalContainer.add(Login);
        verticalContainer.add(Box.createVerticalStrut(5));
        verticalContainer.add(pwLab);//password label and text
        verticalContainer.add(Password);
        verticalContainer.add(Box.createVerticalStrut(5));
        horizontalContainer.add(registerBut);//register button
        horizontalContainer.add(Box.createHorizontalStrut(5));
        horizontalContainer.add(logBut);//login button

        //combines both the vertical and horizontal container
        mergerContainer.add(verticalContainer);
        mergerContainer.add(horizontalContainer);
        add(mergerContainer);
        //this.add(logGui);
        setVisible(true);

    }

}

Classe do painel Meu registro

    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.Box;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;

    //No Panel addition
    public class Register extends JPanel{
            JButton submit, previous;
            JLabel firstLab, lastLab, userLab, passwordLab, repassLab, address, emailAdd, errorLabel;
            JTextField firstText, lastText, userText, addText, emailAddText;
            JPasswordField passwordText, repassText;

        public Register(){
            setSize(700,700);
            //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


            //register values and their labels and textfields
            firstLab = new JLabel("First Name: ");
            firstText = new JTextField("", 25);
            lastLab = new JLabel("Last Name: ");
            lastText = new JTextField("", 40);
            userLab = new JLabel("Username: ");
            userText = new JTextField("", 25);
            passwordLab = new JLabel("Password: ");
            passwordText = new JPasswordField("", 25);
            passwordText.setEchoChar('*');
            repassLab = new JLabel("Confirm Password");
            repassText = new JPasswordField("", 25);
            repassText.setEchoChar('*');
            address = new JLabel("Address: ");
            addText = new JTextField("", 50);
            emailAdd = new JLabel("Email Address: ");
            emailAddText = new JTextField("", 50);

            //error message for reigstration issues
            errorLabel = new JLabel();
            errorLabel.setForeground(Color.red);

            submit = new JButton("Submit");

            submit.addActionListener(new ActionListener(){

                @SuppressWarnings("deprecation")
                public void actionPerformed(ActionEvent e) {
                    // TODO Auto-generated method stub
                    if(e.getSource() == submit){
                        //confirm with regex methods and if statements that have been created and need to be created
                        if(firstText.getText().length() == 0){
                            errorLabel.setText("*You have not entered a first name!");
                        }else
                        if(lastText.getText().length() == 0){
                            errorLabel.setText("*You have not entered a last name!");
                        }else
                        if(userText.getText().length() == 0){
                            errorLabel.setText("*You have not entered a username!");
                        }else
                        if(passwordText.toString().length() == 0){
                            errorLabel.setText("*You have not entered a Password!");
                        }else
                        if(repassText.toString().length() == 0){    
                            errorLabel.setText("*You have not matched your password!");
                        }
                        if(addText.getText().length() == 0){
                            errorLabel.setText("*You have not entered an address!");
                        }else
                        if(emailAddText.getText().length() == 0){
                            errorLabel.setText("*You have not entered an Email address!");
                        }else
                        if(userText.getText().length() < 8){
                            errorLabel.setText("*Username is too short!");
                        }
                        else
                        if(!(passwordText.toString().matches(repassText.toString()))){
                            errorLabel.setText("Passwords do not match!");
                        }
                        else
                        if(!isValidEmailAddress(emailAddText.getText())){
                            errorLabel.setText("*Invalid Email!");
                        }
                        else
                        if(!isValidAddress(addText.getText())){
                            errorLabel.setText("*Invalid Address!");
                        }
                    }
                }

            });
            //returns to the previous page
            previous = new JButton("Previous Page");
            previous.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e) {
                    // TODO Auto-generated method stub
                    if(e.getSource() == previous){
                        //card.show(login panel);
                    }
                }

            });
            Box verticalContainer = Box.createVerticalBox();
            Box horizontalContainer = Box.createHorizontalBox();
            Box mergerContainer = Box.createVerticalBox();

            verticalContainer.add(Box.createVerticalStrut(150));
            verticalContainer.add(firstLab);
            verticalContainer.add(firstText);
            verticalContainer.add(Box.createVerticalStrut(5));
            verticalContainer.add(lastLab);
            verticalContainer.add(lastText);
            verticalContainer.add(Box.createVerticalStrut(5));
            verticalContainer.add(userLab);
            verticalContainer.add(userText);
            verticalContainer.add(Box.createVerticalStrut(5));
            verticalContainer.add(passwordLab);
            verticalContainer.add(passwordText);
            verticalContainer.add(Box.createVerticalStrut(5));
            verticalContainer.add(repassLab); 
            verticalContainer.add(repassText);  
            verticalContainer.add(Box.createVerticalStrut(5));
            verticalContainer.add(address); 
            verticalContainer.add(addText);
            verticalContainer.add(Box.createVerticalStrut(5));
            verticalContainer.add(emailAdd);
            verticalContainer.add(emailAddText);    
            verticalContainer.add(Box.createVerticalStrut(5));

            //horizontal
            verticalContainer.add(Box.createVerticalStrut(5));
            horizontalContainer.add(submit);
            horizontalContainer.add(Box.createHorizontalStrut(5));
            horizontalContainer.add(previous);

            //merger
            mergerContainer.add(verticalContainer);
            mergerContainer.add(horizontalContainer);

            add(mergerContainer);
            setVisible(true);
        }

        //regex check for valid Email
    public boolean isValidEmailAddress(String email){
            java.util.regex.Pattern p = java.util.regex.Pattern.compile("[A-Za-z0-9._\\%-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}");
            java.util.regex.Matcher m = p.matcher(email);
            return m.matches();

        }
    //regex check for valid Address
    public boolean isValidAddress(String address){
        java.util.regex.Pattern p = java.util.regex.Pattern.compile("\\d{1,3}.?\\d{0,3}\\s[a-zA-Z]{2,30}\\s[a-zA-Z]{2,15}");
        java.util.regex.Matcher m = p.matcher(address);
        return m.matches();

    }
    }

Classe do painel da página inicial

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

//NO Panel Yet
@SuppressWarnings("serial")
public class homePage extends JPanel{

        JButton uploadEmail, viewEmail;
    public homePage(){
        setSize(700,700);
        uploadEmail = new JButton("Upload Your Email");
        uploadEmail.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if(e.getSource() == uploadEmail){
                    new loadEmail();
                }
            }

        });
        viewEmail = new JButton("View An Email");
        viewEmail.addActionListener(new ActionListener(){       

            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if(e.getSource() == viewEmail){
                    new emailView();
                }
            }

        });

        add(uploadEmail);
        add(viewEmail);
        setVisible(true);
    }
}

Painel My View Email

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class emailView extends JPanel{
        JPanel viewPanel;
        JButton logout, delete, homepage;
        JTable emailList;

        //Cannot be edited or may be in a new panel
        /*
        JLabel fileLab, toLab, fromLab, subjectLab,topicLab, emailLab, notesLab, attachLab;
        JTextField fileText, toText, fromText, subjectText, topicText;
        JTextArea emailText, notesText, attachText;
        */
    public emailView(){
        setSize(700,700);
        setVisible(true);

        emailList = new JTable();
        logout = new JButton("Logout");
        logout.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if(e.getSource() == logout){
                    new textEmailLog();
                }
            }

        });
        delete = new JButton("Delete");
        delete.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if(e.getSource() == delete){

                }
            }

        });
        homepage = new JButton("HomePage");
        homepage.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if(e.getSource() == homepage){
                    new homePage();
                }

            }

        });
        Box horizontalContainer = Box.createHorizontalBox();
        Box verticalContainer = Box.createVerticalBox();
        Box mergerContainer = Box.createVerticalBox();

        horizontalContainer.add(logout);
        horizontalContainer.add(Box.createHorizontalStrut(5));
        horizontalContainer.add(homepage);
        horizontalContainer.add(Box.createHorizontalStrut(5));
        horizontalContainer.add(delete);
        horizontalContainer.add(Box.createVerticalStrut(5));
        verticalContainer.add(emailList);
        mergerContainer.add(horizontalContainer);
        mergerContainer.add(verticalContainer);
        add(mergerContainer);

        setVisible(true);
    }
}

My Upload Email Panel

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class loadEmail extends JPanel{
        JPanel loadPanel;
        JLabel fileLab, toLab, fromLab, subjectLab, topicLab, emailLab, notesLab, attachLab;
        JTextField fileText, toText, fromText, subjectText, topicText;
        JTextArea emailText, notesText, attachText; //attachment text will be changed
        JButton cancel, complete, enter;//enter may not be necessary
    public loadEmail(){
        setSize(700,700);

        fileLab = new JLabel("Enter a new File: ");
        fileText = new JTextField();
        enter = new JButton("Enter");
        enter.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if(e.getSource() == enter){
                    //opens file directory window
                }
            }

        });
        toLab = new JLabel("To: ");
        toText = new JTextField();
        toText.setSize(5, 30);
        fromLab = new JLabel("From: ");
        fromText = new JTextField();
        subjectLab = new JLabel("Subject: ");
        subjectText = new JTextField();
        topicLab = new JLabel("Topic: ");
        topicText = new JTextField();
        emailLab = new JLabel("Email Content: ");
        emailText = new JTextArea();
        notesLab = new JLabel("Comments: ");
        notesText = new JTextArea();
        attachLab = new JLabel("Attachments");
        attachText = new JTextArea();
        cancel = new JButton("Cancel");
        cancel.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if(e.getSource() == cancel){
                    //dispose page
                }
            }

        });
        complete = new JButton("Complete");
        complete.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if(e.getSource() == complete){
                    //store in database, prompt user for new email to enter in other wise return to homepage

                }
            }

        });

        Box verticalContainer = Box.createVerticalBox();
        Box horizontalContainer = Box.createHorizontalBox();
        Box mergerContainer = Box.createVerticalBox();

        verticalContainer.add(fileLab);
        verticalContainer.add(fileText);
        verticalContainer.add(Box.createVerticalStrut(5));
        verticalContainer.add(Box.createHorizontalStrut(50));
        verticalContainer.add(enter);
        verticalContainer.add(Box.createVerticalStrut(5));
        verticalContainer.add(toLab);
        verticalContainer.add(toText);
        verticalContainer.add(Box.createVerticalStrut(5));
        verticalContainer.add(fromLab);
        verticalContainer.add(fromText);
        verticalContainer.add(Box.createVerticalStrut(5));
        verticalContainer.add(subjectLab);
        verticalContainer.add(subjectText);
        verticalContainer.add(Box.createVerticalStrut(5));
        verticalContainer.add(topicLab);
        verticalContainer.add(topicText);
        verticalContainer.add(Box.createVerticalStrut(5));
        verticalContainer.add(emailLab);
        verticalContainer.add(emailText);
        verticalContainer.add(Box.createVerticalStrut(5));
        verticalContainer.add(notesLab);
        verticalContainer.add(notesText);
        verticalContainer.add(Box.createVerticalStrut(5));
        verticalContainer.add(attachLab);
        verticalContainer.add(attachText);
        verticalContainer.add(Box.createVerticalStrut(5));

        horizontalContainer.add(cancel);
       , horizontalContainer.add(Box.createHorizontalStrut(5));
        horizontalContainer.add(complete);

        mergerContainer.add(verticalContainer);
        mergerContainer.add(horizontalContainer);
        add(mergerContainer);
        setVisible(true);

    }

}

questionAnswers(1)

yourAnswerToTheQuestion