Salve a tutti! Intanto.. fantastico forum! In questi mesi non so che avrei fatto senza le conoscenza racchiuse qui dentro! Ho deciso di aprire la discussione perché sono quattro giorni che cerco di risolvere senza successo un problema riguardante le GUI. Io ho studiato java a livello universitario ( quindi non granchè ..) e ho sempre fatto tutto da terminale. Il mio progetto attuale riguarda un software di supporto per un gioco di ruolo, però volevo farlo con l'interfaccia grafica. Mi sono scaricato WindowBuilder e ci ho studiato un po'

Il problema è questo:

ho scritto un Jframe, una windowApp, un panel "contenitore" con il layout a carte e altri due JPanel.
Negli ultimi due JPanel ho messo dei bottoni per muovermi fra i panel, ma giuro su tutti i programmatori del mondo che non capisco cosa scrivere nei listener dei bottoni per scambiare i pannelli nel frame.

è un po' lungo ma allego il codice.
Frame:
codice:
public class ASMainFrame extends JFrame {

    //COSTRUTTORE
    
    public ASMainFrame() {
        setFont(new Font("Microsoft Sans Serif", Font.PLAIN, 12));
        
        setForeground(Color.DARK_GRAY);
        setTitle("AD SIDERA v1.0");
        setBackground(Color.DARK_GRAY);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 726, 479);    
    }
    
}
Primo JPanel:
codice:
public class PannelloContenitore extends JPanel {

public PannelloContenitore() {
        
        setBackground(new Color(34, 139, 34));
        setBorder(new LineBorder(new Color(0, 0, 0), 2));
        setLayout(new CardLayout(0, 0));
        PannelloPrincipale pannelloPrincipale = new PannelloPrincipale();
        PannelloPropositoApp pannelloPropositoApp = new PannelloPropositoApp();
        add(pannelloPrincipale, "nome principale");
        add(pannelloPropositoApp, "name PropositoApp");    


    }


}
Primo dei JPanel / carta:
codice:
public class PannelloPrincipale extends JPanel {

//Costruttore

    public PannelloPrincipale() {
        
        setBackground(Color.DARK_GRAY);
        setBorder(new EmptyBorder(0, 0, 0, 0));
        
        
        JLabel titoloPrincipale = new JLabel("AD SIDERA");
        titoloPrincipale.setFont(new Font("mono 07_65", Font.BOLD, 70));
        titoloPrincipale.setForeground(new Color(34, 139, 34));
        titoloPrincipale.setHorizontalAlignment(SwingConstants.CENTER);
        
        JSeparator separatorePrincipale = new JSeparator();
        separatorePrincipale.setForeground(new Color(34, 139, 34));
        separatorePrincipale.setBackground(new Color(34, 139, 34));
        
        JLabel etichettaMenuPrincipale = new JLabel("MENU' PRINCIPALE");
        etichettaMenuPrincipale.setForeground(new Color(34, 139, 34));
        etichettaMenuPrincipale.setFont(new Font("Microsoft Sans Serif", Font.BOLD, 14));
        
        JButton bottAppPrincipale = new JButton("A proposito dell'App");
        
        
        bottAppPrincipale.setHorizontalAlignment(SwingConstants.LEFT);
        bottAppPrincipale.setBackground(Color.DARK_GRAY);
        bottAppPrincipale.setForeground(new Color(34, 139, 34));
        bottAppPrincipale.setFont(new Font("Microsoft Sans Serif", Font.PLAIN, 13));
         
        GroupLayout gl_pannelloPrincipale = new GroupLayout(this);
        gl_pannelloPrincipale.setHorizontalGroup(
            gl_pannelloPrincipale.createParallelGroup(Alignment.LEADING)
                .addComponent(titoloPrincipale, GroupLayout.DEFAULT_SIZE, 695, Short.MAX_VALUE)
                .addGroup(gl_pannelloPrincipale.createSequentialGroup()
                    .addGap(10)
                    .addComponent(separatorePrincipale, GroupLayout.DEFAULT_SIZE, 675, Short.MAX_VALUE)
                    .addContainerGap())
                .addGroup(gl_pannelloPrincipale.createSequentialGroup()
                    .addGap(98)
                    .addGroup(gl_pannelloPrincipale.createParallelGroup(Alignment.LEADING, false)
                         
                        .addComponent(etichettaMenuPrincipale)
                         
                         
                        .addComponent(bottAppPrincipale, GroupLayout.DEFAULT_SIZE, 190, Short.MAX_VALUE)
                    .addContainerGap(96, Short.MAX_VALUE))
        );
        gl_pannelloPrincipale.setVerticalGroup(
            gl_pannelloPrincipale.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_pannelloPrincipale.createSequentialGroup()
                    .addComponent(titoloPrincipale, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.UNRELATED)
                    .addComponent(separatorePrincipale, GroupLayout.PREFERRED_SIZE, 9, GroupLayout.PREFERRED_SIZE)
                    .addGroup(gl_pannelloPrincipale.createParallelGroup(Alignment.LEADING, false)
                        .addGroup(gl_pannelloPrincipale.createSequentialGroup()
                            .addGap(32)
                            .addComponent(etichettaMenuPrincipale)
                            .addGap(30)
                            .addComponent(bottAppPrincipale)
                            .addPreferredGap(ComponentPlacement.RELATED)
                             .addContainerGap())
        );
        setLayout(gl_pannelloPrincipale);


        // I LISTENER DEI BOTTONI
        
        bottAppPrincipale.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
            
        
            }
        });
        
    }


}
Secondo JPanel / carta:
codice:
public class PannelloPropositoApp extends JPanel {

//COSTRUTTORE

    public PannelloPropositoApp() {


setBackground(Color.DARK_GRAY);
        
        
        JLabel titoloPropositoApp = new JLabel("A proposito dell'App");
        titoloPropositoApp.setHorizontalAlignment(SwingConstants.CENTER);
        titoloPropositoApp.setFont(new Font("Microsoft Sans Serif", Font.BOLD, 20));
        titoloPropositoApp.setForeground(new Color(34, 139, 34));
        
        JSeparator separatorePropositoApp = new JSeparator();
        separatorePropositoApp.setForeground(new Color(34, 139, 34));
        separatorePropositoApp.setBackground(new Color(34, 139, 34));
        
        JTextPane testoPropositoApp = new JTextPane();
        testoPropositoApp.setForeground(new Color(34, 139, 34));
        testoPropositoApp.setBackground(Color.DARK_GRAY);
        testoPropositoApp.setBorder(new LineBorder(new Color(0, 0, 0), 2));
        testoPropositoApp.setEditable(false);
        testoPropositoApp.setText("Prova");
        
        JButton bottMenùPropositoApp = new JButton("Torna al men\u00F9 principale");
        bottMenùPropositoApp.setHorizontalAlignment(SwingConstants.LEFT);
        bottMenùPropositoApp.setForeground(new Color(34, 139, 34));
        bottMenùPropositoApp.setBackground(Color.DARK_GRAY);
        bottMenùPropositoApp.setFont(new Font("Microsoft Sans Serif", Font.PLAIN, 13));
        GroupLayout gl_pannelloPropositoApp = new GroupLayout(this);
        gl_pannelloPropositoApp.setHorizontalGroup(
            gl_pannelloPropositoApp.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_pannelloPropositoApp.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(gl_pannelloPropositoApp.createParallelGroup(Alignment.LEADING)
                        .addComponent(separatorePropositoApp, GroupLayout.PREFERRED_SIZE, 430, Short.MAX_VALUE)
                        .addComponent(titoloPropositoApp, GroupLayout.PREFERRED_SIZE, 216, GroupLayout.PREFERRED_SIZE)
                        .addComponent(bottMenùPropositoApp)
                        .addComponent(testoPropositoApp, GroupLayout.DEFAULT_SIZE, 568, Short.MAX_VALUE))
                    .addContainerGap())
        );
        gl_pannelloPropositoApp.setVerticalGroup(
            gl_pannelloPropositoApp.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_pannelloPropositoApp.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(titoloPropositoApp, GroupLayout.PREFERRED_SIZE, 50, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(separatorePropositoApp, GroupLayout.PREFERRED_SIZE, 2, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(testoPropositoApp, GroupLayout.DEFAULT_SIZE, 299, Short.MAX_VALUE)
                    .addGap(18)
                    .addComponent(bottMenùPropositoApp)
                    .addGap(22))
        );
            setLayout(gl_pannelloPropositoApp);
        
    }


}
Ho provato nei listener a fare una cosa del genere (nel codice qui sopra sono vuoti)

codice:
CardLayout cl = (CardLayout)(cards.getLayout());
    cl.show(cards, "nome");
ma non funziona una ciospa. Ho provato anche ad utilizzare un altro layout e scambiare i panel con getContentPane() e facendo repaint() e validate() ma niente. In pratica devo riuscire, cliccando il bottAppPrincipale a scambiare il pannelloPrincipale con il pannelloPropositoApp..

Nell' applicazione window richiamo il frame con questo:


ASMainFrame frame = new ASMainFrame();
PannelloContenitore nuovoContenitore = new PannelloContenitore();
frame.setContentPane(nuovoContenitore);


Che fare?