Janela principal alternar entre jpanels escritos em classes separadas

Olá pessoal,

estou escrevendo uma aplicação para gerenciar registros de empresas.
Criei a seguinte arquitetura: uma janela principal com um painel que recebe instâncias de outras classes.
Entretanto, em uma dessas classes filhas há um JButton “btnAdicionar” que chama uma outra classe filha
chamada Empresa. [code]
// Este código está inserido em uma das classes filhas: a classe Empresas.
// Esta classe é recebida pela janela principal.

JButton btnAdicionar = new JButton(“Adicionar”);
btnAdicionar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
Empresa empresa = new Empresa();
empresa.setVisible(true);
add(empresa);
}
});
[/code] Mas está errado.
O conteúdo do painel da janela principal apenas se esvazia, mas a instância da classe chamada não se apresenta.
Imagino que para isso exista um procedimento simples e usado em larga escala, mas, por falta de experiência,
lhes peço ajuda.

Agradecido

Lucas Ribeiro

lucasribeiro faz o seguinte, adiciona no teu código:

add(empresa); //Logo após repaint();

urbgames,

eu fiz isso. Com “setVisible(false);” deu o mesmo resultado.
Sem ele, nada aconteceu, só o console que encheu de letra vermelha…

Fiz assim: JButton btnAdicionar = new JButton("Adicionar"); btnAdicionar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { add(empresa); repaint(); } }); Foi assim que disseste?

ah, é óbvio que eu instanciei a classe Empresa, né Empresa empresa = new Empresa();

lucasribeiro acho que entendi o que está acontecendo.

Levemos em consideração que o código em questão esteja dentro de uma classe que estenda de Jframe, então vejamos:

JButton btnAdicionar = new JButton("Adicionar"); btnAdicionar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //No comando abaixo você está setando a tela principal como false. // Se deseja setar o panel, então faca: panel.setVisible(false) e elimine a linha seguinte setVisible(false); Empresa empresa = new Empresa(); empresa.setVisible(true); add(empresa); } });

Se o código estiver dentro de um jpanel, o que não faz sentido, dará o mesmo problema pois você está setando o jpanel como false e depois add um elemento a ele.

É verdade, urbgames.

Lhe agradeço a atenção. Entretanto, “dentro da classe Principal”, que se estende à classe JFrame, instanciei um “JPanel panel” contendo após [code]

Empresas empresas = new Empresas();
empresas.setVisible(true); // só para calar o warning de não usado
panel.add(empresas);

[/code] Já a classe Empresas contém o código do botão btnAdicionar que você visualizou, e se estende à classe JPanel.
Minha intenção foi interromper a exibição da instância da classe Empresas no painel da classe Principal, e iniciar a exibição do JFrame Empresa.
Mas após a interrupção de Empresas, o resto das instruções foi invalidado (estou certo?).
Isso me leva a pensar em usar interfaces, você possui um recurso mais simples?

mas parece que uma interface não resolve meu caso…

Amigo, acho que vou fazer em abas.

Não… Eu vou fazer desse jeito mesmo.

lucasribeiro ajudaria bastante se você pudesse colocar outras partes do código aqqui, pois não estou entendendo direito como está sua aplicação.

Se possível coloca ai.

urbgames, consegui…

O problema é que o JPanel Empresas desaparecia, mas o JPanel Empresa (singular) não surgia.
Para conseguir, eu criei na janela principal um método para abrir a classe Empresa: aquela que não abria.
E na classe Empresas, ao invés de instruir setVisible(false); como você viu, era simples:
você estava certo, [code]

setVisible(getIgnoreRepaint());
Principal.adicionar();

[/code] observe nosso amigo “repaint()” na linha. Funcionou bonito…
Estou no deserto juntando gotas d’água antes de morrer de sede; mas se eu chegar na cidade, me faço rei.

Agradecido
Lucas Ribeiro

lucasribeiro sempre que precisarmos, estaremos por aqui.