Fechar um JFrame através de um JPanel

11 respostas
D

Galera…seguinte:

Tenho um JFrame que recebe como parámetro um JPanel. Esse JFrame é padrão, o que vai alterar na verdade é o JPanel que sempre é passado como parâmetro. Preciso fechar o JFrame através do JPanel, em um método que se encontra no mesmo(JPanel)…como se fosse o método “dispose()” para o JFrame.

Alguém tem alguma idéia de como posso fazer isso???

Vlw!!!

11 Respostas

renanpto

Vc vai passar o panel para outros JFrame, dai vai chamar o metodo para fechar o JFrame anterior ? Isso ?

sech777

Amigo, se eu entendi bem, o que você precisa chama-se tratamento de eventos. Crie dentro desse seu JPanel um JButton. Daí, implemente nesse JButton o tratamento de evento de ação(ActionListener) e, através do método que esta interface proporciona, actionPerformed(ActionEvent ae) {}; , feche seu JFrame com o comando dispose(); caso queira fechar a aplicação recomendo o System.exit(0);
Não se esqueça criar uma referência para seu JFrame para que seja possível fechá-lo de dentro do método de tratamento de ações!!!

espero ter ajudado…

D

Aew galera…vlw pelas respostas, mas consegui implementar sozinho o que eu precisava…é bem mais complexo que um simples tratamento de eventos!!!

Mas vou explicar com calma…

Tenho um JFrame que é padrão para várias telas do meu sistema com uma JTollBar e eventos associados a cada botão. Porém, de acordo com qual JFrame estiver aberto, e consequentemente qual JPanel estiver contido no JFrame, a aplicação deve reagir diferente aos eventos. Isso resume um pouco o que devemos focar, rsrs!!!

A questão quanto a um JPanel fechar o JFrame através do método dipose() não pode ser implementada diretamente no JPanel, porque os JPanels não sabem da existencia dos JFrames, apenas estão contidos neles.

Resolvi meu problema fazendo uma chamada a um método do JPanel específico, e, de acordo com o retorno deste método, no JFrame decido se dêvo fecha-lo ou não. Isso porque, como disse, os eventos de um mesmo JFrame devem gerar resultados diferentes de acordo com os JPanels internos a eles.

Mas é isso ae, valew a quem tentou ajudar!!!

Ateh a próxima!!!

germanosk

{Desculpem ressucitar esse tópico}
A minha dúvida é muito parecida mas não estou conseguindo resolver.
Eu tenho 3 Classes:

Inicio extends JFrame Usuario extends JFrame Ficha extends JPanel

tem um botão em Inicio que eu chamo um JFrame com Usuario dentro

new JFrame().add(new Ficha()).setVisible(true);

Dentro de Ficha tem um botão que eu chamo um New Usuario e no qual eu quero também encerrar o JFrame criado para conter a ficha.
Como devo proceder para encerrar esse JFrame sem comprometer o andamento de Usuario?

Grato pela atenção e muito mais pela colaboração :wink: .

Jesuino_Master

Passe o frame como referência para o painel, no construtor, e quando o usuário clicar no botão chame o método dispose do frame.
Entendeu?

germanosk

Jesuino Master:
Passe o frame como referência para o painel, no construtor, e quando o usuário clicar no botão chame o método dispose do frame.
Entendeu?

Opa, obrigado pela resposta, eu entendi sim e aliais foi uma das primeiras coisas que tentei fazer … mas não consegui XD acho que errei a sintaxe. Vc poderia me ajudar?

Jesuino_Master

Ok, vou ver se monto um exemplo!

germanosk

Vlw muito obrigado.

Jesuino_Master

Ae, fiz um exemplo!

Acho que acontecia com você era que não consegui referenciar o painel dentro do listener do botão para fechar…

Vou primeiro para o Frame, contrui um de testes:

import javax.swing.JFrame;

public class Frame extends JFrame {

    public Frame() {
	setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	setSize(300, 300);
	setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
	Frame frame = new Frame();
	frame.setVisible(true);
    }

Acho que não existem detalhes a serem explicados no Frame, mas se existir posta ai depois.

Depois, temos um painel com um botão dentro. O construtor recebe a referência do painel, esse é o detalhe. A referência é local do construtor, por isso não podemos usa-la no listener!!!
Bem, recebendo a instância passamos a mesma para a nossa variável global!! Então podemos acessá-la dentro do ouvinte do botão!! Ao o usuário clicar no botão, caimos no método do listener e sumimos com o frame e em seguida jogamos o valor para null.

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Painel extends JPanel {
    private JButton btn;
    // Container onde está meu painel
    private JFrame container;

    // Construtor recebendo o Frame
    public Painel(JFrame pContainer) {
	// O container global referencia o local recebido
	container = pContainer;
	// Instanciando e adicionado
	btn = new JButton("Fechar");
	add(btn);
	btn.addActionListener(new ActionListener() {

	    public void actionPerformed(ActionEvent arg0) {
		// Escondemos o frame que chamou
		container.dispose();
		// anulamos para o GC pegar e não ficar pesando
		container = null;
	    }
	});

    }
}

Enfim, testamos:

public class Testar {

    public static void main(String[] args) {
	Frame frame = new Frame();
	frame.add(new Painel(frame));
	frame.setVisible(true);
    }

}

É isso, qualquer duvida posta ai!!

OBS: Todo mundo no mesmo pacote hein…

A

Muito bom seu exemplo, parabéns.

germanosk

Muito obrigado, e muito bom esse exemplo.

Criado 24 de maio de 2007
Ultima resposta 13 de fev. de 2009
Respostas 11
Participantes 6