[RESOLVIDO] Abrir JPanel dentro de JFrame

E aí galera blz?

Sei que é uma dúvida muito comum, mas em todos os lugares que vi não consegui achar uma solução.
Tenho a tela principal que é um JFrame e quando clico em um botão quero abrir um JPanel, este sendo uma outra classe.
O meu código está assim e não funciona.

teste t = new Teste(); // Essa é a classe JPanel
PrincipalGUI p = new PrincipalGUI();
p.add(t);
p.repaint();
p.revalidate();

Procure por cardLayout. :wink:

EHS.
Acredito eu que um jpanel só pode ser visualizado dentro de um jframe.
Nunca ouvi falar em abrir um jpanel assim.

Mas é isso que eu quero, tenho um JFrame principal e dentro dele um Jpanel, quando executo o programa ele abre esse JFrame
com o Jpanel como tela principal, daí tenho um botão, então quando clico nesse botão quero abrir um JPanle
e esse Jpanel tem um formulário, ele seria como uma outra tela do sistema.

Não sei se entendi direito, mas para usar o cardLayout eu teria que ter vários Jpanel dentro do JFrame principal e não é isso que eu quero.
Quero que cada Jpanel seja uma tela do sistema, qdo inicio abre a principal com JFrame e um Janel, nele tem uma barra de botões que funciona
como um menu, então em cada botão desses que eu clicar quero que chame uma nova classe JPanel, não sei se fui claro.

[quote]Não sei se entendi direito, mas para usar o cardLayout eu teria que ter vários Jpanel dentro do JFrame principal e não é isso que eu quero.
Quero que cada Jpanel seja uma tela do sistema, qdo inicio abre a principal com JFrame e um Janel, nele tem uma barra de botões que funciona
como um menu, então em cada botão desses que eu clicar quero que chame uma nova classe JPanel, não sei se fui claro.[/quote]

O cardLayout possibilita exatamente isso. O cardLayout “guarda” seus paineis. Quando vc clica no botão referente ao painel, ele “mostra” aquele painel.

Quando eu quero chamar um jframe, que contém um jpanel com o formulário que eu desenhei.
eu chamo ele assim:

new TUsuarios().setVisible(true);

Mas o TUsuarios é uma classe que extende jframe;

Então fiz assim:

        teste t = new teste();
        CardLayout cl = new CardLayout();
        cl = (CardLayout) t.getLayout();
        cl.show(t, null);

e gerou esse erro na terceira linha:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.GroupLayout cannot be cast to java.awt.CardLayout

[quote=Dani Gomes]Quando eu quero chamar um jframe, que contém um jpanel com o formulário que eu desenhei.
eu chamo ele assim:

new TUsuarios().setVisible(true);

Mas o TUsuarios é uma classe que extende jframe;[/quote]

Mas desse jeito abre uma nova janela e eu não quero abrir uma nova janela.

Olha um exemplo bem tosco de cardLayout. Vê se te ajuda. :smiley:

Main:

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new TelaPrincipal();
            }
        });
    }
}

Tela principal:

public class TelaPrincipal extends JFrame{

    private CardLayout cardLayout;

    private JPanel painelCardLayout;

    public TelaPrincipal() {
        setSize(new Dimension(500, 500));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        setLocationRelativeTo(null);
        init();
    }
    
    private void init() {
        setLayout(new BorderLayout());
        
        add(getBotoes(), BorderLayout.WEST);
        add(getCardLayout(), BorderLayout.CENTER);
    }
    
    private JPanel getCardLayout() {
        if (painelCardLayout == null) {
            cardLayout = new CardLayout();
            painelCardLayout = new JPanel();
            painelCardLayout.setLayout(cardLayout);
            painelCardLayout.add(new JPanel1(), "panel1");
            painelCardLayout.add(new JPanel2(), "panel2");
            painelCardLayout.add(new JPanel(), "principal");
            cardLayout.show(painelCardLayout, "principal");
            painelCardLayout.setBackground(Color.GREEN);
             
             return painelCardLayout;
        } else {
            return painelCardLayout;
        }
    }
    
    private JPanel getBotoes() {
        JPanel pn = new JPanel();
        pn.setLayout(new GridLayout(2, 1));
        
        JButton btnPainel1 = new JButton("Painel1");
        btnPainel1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
               cardLayout.show(painelCardLayout, "panel1");
            }
        });
        
        JButton btnPainel2 = new JButton("Painel2");
        btnPainel2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                cardLayout.show(painelCardLayout, "panel2");
            }
        });
        
        pn.add(btnPainel1);
        pn.add(btnPainel2);
        
        return pn;
    }
}

Painel1:

public class JPanel1 extends JPanel{

    public JPanel1() {
        init();
    }

    private void init() {
        setLayout(new BorderLayout());
        add(new JLabel("Oi, sou o Painel1!!"), BorderLayout.EAST);
        setBackground(Color.BLUE);
    }
}

Painel2:

public class JPanel2 extends JPanel{
    
    public JPanel2() {
        init();
    }

    private void init() {
        setLayout(new BorderLayout());
        add(new JLabel("Oi, sou o Painel2!!"), BorderLayout.EAST);
        setBackground(Color.RED);
    }
}

Eu acho que não interfere em nada, mas estou usando o netbeans para desenvolver então os componentes eu arrasto para a tela.
Pelo exemplo que vc me passou eu fiz isso

PrincipalGUI

public PrincipalGUI() {
        initComponents();
        setLayout(new BorderLayout());
        add(getCardLayout(), BorderLayout.CENTER);
    }
private JPanel getCardLayout() {    
        if (painelCardLayout == null) {  
            cardLayout = new CardLayout();  
            painelCardLayout = new JPanel1();  
            painelCardLayout.setLayout(cardLayout);  
            //painelCardLayout.add(new ContatoGUI(), "panel1");  
            painelCardLayout.add(new JPanel2(), "panel2");  
            painelCardLayout.add(new JPanel1(), "principal");  
            cardLayout.show(painelCardLayout, "principal");  
            
             return painelCardLayout;
        } else {  
            return painelCardLayout;  
        }
    }
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        cardLayout.show(painelCardLayout, "panel2");  
}

O que acontece é que qdo executo aparece tanto o painel da tela principal como o painel 2 que é o que vc passou anteriormente, o vermelho.

Refiz o código e agora funcionou, obrigado pela ajuda Felipe. Segue código

public PrincipalGUI() {
        initComponents();
        
        setLocationRelativeTo(null);
        init();
}
private void init() {  
        setLayout(new BorderLayout());
          
        add(getCardLayout(), BorderLayout.CENTER);  
    }  

     private JPanel getCardLayout() {  
        if (painelCardLayout == null) {
            cardLayout = new CardLayout();  
            painelCardLayout = new JPanel();  
            painelCardLayout.setLayout(cardLayout);  
            //painelCardLayout.add(new JPanel1(), "panel1");  
            painelCardLayout.add(new Contato(), "contato");
            painelCardLayout.add(new JPanel2(), "panel2");
            painelCardLayout.add(new JPanel(), "principal");  
            cardLayout.show(painelCardLayout, "principal");  
            painelCardLayout.setBackground(Color.GREEN);  
               
             return painelCardLayout;
        } else {  
            return painelCardLayout; 
        }  
    }
private void buttonContatoActionPerformed(java.awt.event.ActionEvent evt) {
        cardLayout.show(painelCardLayout, "contato");
    }