Janela principal alternar entre jpanels escritos em classes separadas

11 respostas
L

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.

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);
    }
});
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

11 Respostas

U

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

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

L

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

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

U

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

É 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

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

L

Amigo, acho que vou fazer em abas.

L

Não… Eu vou fazer desse jeito mesmo.

U

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

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,
setVisible(getIgnoreRepaint());
Principal.adicionar();
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

lucasribeiro sempre que precisarmos, estaremos por aqui.

Criado 22 de agosto de 2013
Ultima resposta 23 de ago. de 2013
Respostas 11
Participantes 2