Dúvida com o CardLayout

Dei uma procurada aqui no forum antes de postar, mas não achei o que tirasse minha dúvida, por isso estou postando.

Segue os trechos de declaração e chamada do meu código:

JPanel panelPrinc = new JPanel(new CardLayout()); JPanel panelUsuario = new JPanel(new GridLayout(3,3)); JPanel panelContato = new JPanel(new GridLayout(3,3));

ou

[code] private void montaPanel(JPanel pPanel, String indOrigem){

    CardLayout layout = new CardLayout();

    if(indOrigem.equals("Usuario")){
        //pPanel.setLayout(new GridLayout(3,3));            
        JLabel label1 = new JLabel("Usuario"); 
        pPanel.add(label1);            
        //panelPrinc.add(pPanel, "Usuario");            
        layout.show(panelPrinc,"Usuario");            
        JOptionPane.showMessageDialog(frame, "Cadastro Usuario");
    } else{
        //pPanel.setLayout(new GridLayout(3,3));            
        JLabel label2 = new JLabel("Contato");            
        pPanel.add(label2);
        //pPanel.add(panelContato, "Contato");            
        panelPrinc.add(pPanel, "Contato");
        layout.show(panelPrinc,"Contato");            
        JOptionPane.showMessageDialog(frame, "Cadastro Contato");
    }  
}[/code]

Quando ele chama o montaPanel e chama o método show de CardLayout é lançada a seguinte exceção:

“Exception in thread “AWT-EventQueue-0” java.lang.IllegalArgumentException: wrong parent for CardLayout”

Alguém pode me dizer o que tem errado aí?

Abraços,

Você tem de associar (setLayout) o CardLayout ao panelPrinc, senão você vai ter esse erro mesmo. O melhor lugar para fazer isso é na criação do próprio panelPrinc. Um CardLayout não existe “no vazio” como você fez aí no seu programa.

Mas lá em cima na declaração dos JPanel eu defini o Layout do panelPrinc como CardLayout… aquilo não resolve? Mesmo assim tenho que associar com o setLayout?

Veja a linha 3 da sua rotina montaPanel. Se você viu direitinho, o CardLayout que você está usando nessa rotina é um objeto distinto do objeto associado ao panelPrinc.

Você tem de pegar o objeto de layout (acho que é com getLayout) do panelPrinc, e efetuar um cast para CardLayout.

algo dpo tipo:

layout = (CardLayout) panelPrinc.getLayout();

Seria isso?

Acho que sim. Teste e veja se é isso mesmo.

Parou de lançar a exceção… só não tá fazendo o que eu quero, mas isso eu vejo aqui o porque.

Valeu mais uma vez, thingol.

http://java.sun.com/docs/books/tutorial/uiswing/layout/card.html

alguém um dia confirme que cardlayout não se aplica a JFrame,

eu pelo menos detectei isso e tal fato não consta no tutorial,