Sobrepor (substituir) JPanel em um JFrame

Olá,
possuo uma aplicação com a seguinte estrutura:

Uma classe Vnc que extende JFrame, e outras duas classes Funcionario e Manutencao que extendem JPanel.

Por padrão a classe Vnc cria um objeto de cada uma das duas classes e adiciona somente o objeto funcionario ao contentPane.

Sempre ou um ou outro tem que ser exibido e sempre no mesmo lugar.

Existe um JMenu em Vnc que faz (ou pelo menos deveria fazer) com que entrasse na tela de manutenção.

O problema é que não estou conseguindo fazer funcionar.

esse é um trecho do código do construtor da classe Vnc

func = new Funcionario(db);
manu = new Manutencao(db);
		
setLayout(new BorderLayout());
add(func, BorderLayout.CENTER);

e aqui o trecho do actionPerformed do botão que deveria fazer a troca dos painéis

removeAll();
add(manu, BorderLayout.CENTER);

Ao clicar no botão nenhuma exceção é lançada, a aplicação simplesmente conjela.
A aplicação também não usa nada de processo da máquina.
E a execução passa pelo trecho do evento pois já coloquei um System.out.println após o add(manu… e é impresso normalmente o teste.

Já tentei adicionar por cima sem usar o removeAll() mas assim ele se comporta de uma maneira muito estranha,
na tela não acontece nada, ao gerar qualquer evento ele exibe o painel manu e oculta o painel func com exceção do botão que gerou o evento,
e após isso conforme eu movo o mouse sobre os componentes eles vão reaparecendo.

Não sei mais o que fazer.
Não sou muito experiente, nunca tive essa situação até hoje.

Grato a qualquer tipo de colaboração.

Edit: Não sei se muda alguma coisa mas os painéis estão estão setados com os seguintes layouts:
func está com null
e manu está com FlowLayout

guedes,

Utilize CardLayout ao invés de BorderLayout na classe Vnc. Com o CardLayout, os componentes filhos ficam “empilhados” como cartas, e você só precisa ir alterando a “carta” que está no topo.

Consegui,
ou pelo menos contornei a situação.

ao invés de usar o removeAll() usei um func.setVisible(false).

Não sei se é a melhor solução mas funciona e por enquanto ficara assim.

Olá pango,

não conhecia esse gerenciador.

Vou dar uma pesquisada qualquer coisa eu posto novamente.

Obrigado o toque.
:wink:

Se o frame só possui um único painel, esse código deve funcionar:

Inicialmente:


this.setContentPane(func)

No actionPerformed:


this.setContentPane(manu)

Olá tjamir,

o setContentPane(manu) apresentou o mesmo sintoma descrito antes.

Conjelamento da aplicação.
=/