Boa tarde galera,
Mais uma vez estou com uma dúvida desta vez acredito que não seja tão complicado mas ainda não consegui obter uma resposta.
Gostaria de saber o que acontece quando eu clico em um botão de fechar “X” de um JFrame, quando o mesmo possui o as constantes como EXIT_ON_CLOSE e DISPOSE_ON_CLOSE qual a diferença entre eles o que acontece internamente?
A duvida surgiu da seguinte maneira, possuo um JFrame principal, que dentro dele possuo um retangulo e quando clico neste retangulo devo abrir uma outra JFrame com suas respctivas funções, porém, se eu clicar novamente na tela abrirá uma outra tela novamente.
MinhaJanela minhaJanela = new MinhaJanela();
minhaJanela.setVisible(true);
Para resolver este problema, verifico se minha variável minhaJanela possui uma referencia para um objeto MinhaJanela, caso não possua ai sim instancio uma nova janela.
MinhaJanela minhaJanela;
if(minhaJanela == null){
minhaJanela = new MinhaJanela();
minhaJanela.setVisible(true);
}
Só que agora vem o verdadeiro problema, este codigo funciona até eu instanciar e fechar a primeira janela, pois quando eu clico novamente na tela para exibir e instanciar a janela novamente sua referencia já não é mais null ou seja as constantes EXIT_ON_CLOSE e DISPOSE_ON_CLOSE não limpam minha referencia para eu realizar a verificação desta forma.
Como eu posso verificar se o usuário clicou no botão de fechar “X” da JFrame, ou algo do tipo:
if(usuarioClicouNoBotaoDeFechar){
minhaJanela.dispose();
minhaJanela = null;
}
Agradeço a todos
Obrigado
se ele nao estiver mais null, eh so dar um setVisible(true);
Hum eu já pensei nisso mas não posso, pois teria problemas de performance, que no caso está janela que se abre realiza diversos cálculos dependendo de onde o cursor do mouse está e tudo isso é realizado dentro de uma Thread, e se o usuário não estiver utilizando esta janela não tem por que manter a referencia dela em minha aplicação, pois possuindo a referencia, os métodos que utilizo para alterar o conteúdo desta JFrame irão continuar sendo chamados mesmo não sendo necessário, e como eles são chamados e um evento MouseMoved seria varias chamados que utilizaria um tempo enorme de processamento desnecessário, eu precisava realmente de uma maneira de verificar se o usuário clicou no botão fechar para limpar exatamente está referencia, pois sem uma referência tenho certeza que não estarei executando nenhum outro recurso desnecessariamente.
Use entao JInternalFrame ele eh mais adequado para isso!
Mas a intenção é que realmente seja uma nova JFrame, não teria como verificar se o usuário clicou no botão de fechar da janela ?
[quote=mauricioadl]tem sim, use os eventos de windowListener.
http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/event/WindowListener.html
[]'s[/quote]
vlw mauricioadl vou dar uma olhada e já posto como que foi…
Usar EXIT_ON_CLOSE vai fechar a sua aplicação inteira, é o mesmo que chamar System.exit(). DISPOSE_ON_CLOSE apenas fecha o seu formulário, liberando os recursos de exibição associados a ele. (Se você tornar a usar setVisible(true) num formulário fechado com DISPOSE_ON_CLOSE, os recursos de exibição necessários serão readquiridos automaticamente. Usar HIDE_ON_CLOSE não libera os recursos de exibição ao fechar o formulário).
Para processar o botão “X” de fechamento do frame, use DO_NOTHING_ON_CLOSE e processe o evento de fechamento windowClosing() através de um WindowListener, como disse o mauricioadl.
to de bom humor hehehe tae o codigo!
JFrame frame = new JFrame();
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
super.windowClosed(e);
System.out.println("Fechou a janela!!!");
}
});
Recomendação: em vez de super.windowClosed(e), use dispose() ou setVisible(false).
[quote=mauricioadl]to de bom humor hehehe tae o codigo!
JFrame frame = new JFrame();
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
super.windowClosed(e);
System.out.println("Fechou a janela!!!");
}
});
[/quote]
Valeu era isso mesmo que eu precisava
Obrigado pela recomendação também Roger
Vlw mesmo está funcionando perfeiramente agora