Dúvida com o CardLayout

8 respostas
pimenta

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));
montaPanel(panelContato, "Contato");
ou
montaPanel(panelUsuario, "Usuario");
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");
        }  
    }

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,

8 Respostas

T

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.

pimenta

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?

T

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.

pimenta

algo dpo tipo:

layout = (CardLayout) panelPrinc.getLayout();

Seria isso?

T

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

pimenta

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.

T

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

Sombriks

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,

Criado 12 de maio de 2008
Ultima resposta 25 de jul. de 2009
Respostas 8
Participantes 3