Janela principal alternar entre jpanels escritos em classes separadas
11 respostas
L
lucasribeiro
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.
// Este código está inserido em uma das classes filhas: a classe Empresas.// Esta classe é recebida pela janela principal.JButtonbtnAdicionar=newJButton("Adicionar");btnAdicionar.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){setVisible(false);Empresaempresa=newEmpresa();empresa.setVisible(true);add(empresa);}});
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.
lucasribeiro faz o seguinte, adiciona no teu código:
add(empresa);
//Logo após
repaint();
L
lucasribeiro
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?
L
lucasribeiro
ah, é óbvio que eu instanciei a classe Empresa, né Empresa empresa = new Empresa();
U
urbgames
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.
L
lucasribeiro
É 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
Empresas empresas = new Empresas();
empresas.setVisible(true); // só para calar o warning de não usado
panel.add(empresas);
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?
L
lucasribeiro
mas parece que uma interface não resolve meu caso…
L
lucasribeiro
Amigo, acho que vou fazer em abas.
L
lucasribeiro
Não… Eu vou fazer desse jeito mesmo.
U
urbgames
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.
L
lucasribeiro
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
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
U
urbgames
lucasribeiro sempre que precisarmos, estaremos por aqui.