Executar método ao fechar um JFrame. [RESOLVIDO]

Boa tarde,

Minha dúvida é o seguinte,

Como posso executar um método ( ex: salvarDados() ) quando fechar o JFrame?
Eu tenho uma tela de alteração de dados e la tem um botão SALVAR, mas quero que sempre que o usuário
fechar o JFrame ele pergunte se o usuário quer Salvar ou não, se sim ele executa o mesmo método do botão.
Tenho como objetivo nisso, fazer com que o usuário não feche a tela esquecendo assim de salvar os dados alterados.

1 curtida

Você tem um botão fechar para isso?

Se tiver é simples, chame este método dentro da ação do botão Fechar!!!

atravez da verificação de um evento.

use actionListener e faça a condição “se o painel for fechado” executa o que você quer.

public void actionPerformed(ActionEvent evt) {
		JPanel panel = new JPanel();
		panel.setLayout(null);
		Object source;
		source = evt.getSource();
//não tenho certeza se essa verificação é por "panel.close()"
		if(source == panel.close()){
//			//executa a função que você quer
}

Fala cara, blza?

Então, para fazer isso vc precisa implementar na sua classe o WindowListener, mas como quando vc implementa uma interface vc deve obrigatoriamente implementar os métodos da interface, existe uma classe adaptadora, a WindowAdapter. Nela, vc só implementa o método que vc quer, pois agora já não é mais uma interface e sim uma classe
Se vc extendeu JFrame na sua classe, faça assim:

addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { if (JOptionPane.showConfirmDialog(null,"Deseja sair")==JOptionPane.OK_OPTION){ salvarDados(); } } });
Não testei, mad me lembro um pouco, deve ser alguma coisa assim.

Abraço

1 curtida

Boa tarde…

1 Então, eu não tenho um botão fechar, pois justamente a minha dúvida é quando ao fechar “x” la de cima da janela.
2 Eu não tenho nenhum Panel, é apenas um JFrame no qual tem um JTable no qual faço as alterações de cadastro.
E tenho um botão SALVAR. A minha idéia é justamente perguntar ao usuário se ele quer salvar quando clicar no “x” para fechar a janela
para que ele não feche e sem querer esqueça de salvar as alterações.

Ah, me lembrei.

Antes de vc fazer o que lhe mostrei, faça isso:

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

Porque daí, quando clicar no “x”, vai depender só da sua implementação do WindowClosing se vai fechar o JFrame ou não.
Ah, e depois do salvarDados();, mande um System.exit(0);, esqueci disso tbm.

Teste ai e veja se vai.

Abraço

2 curtidas

Perfeito Thiago Luis
NOTA 10!
Era justamente isto que eu queria, mas ainda não estudei sobre Listener.
Não adicionei o System.exit(0); porque esta não é a tela principal.

Sei que não faz parte deste tópico, mas por acaso alguém saberia como fazer Quebra Automática de Linha nas linhas de uma coluna de uma JTable?

2 curtidas

E o que voce chama por quebra automatica de linhas?

[quote=Thiago Luis]Fala cara, blza?

Então, para fazer isso vc precisa implementar na sua classe o WindowListener, mas como quando vc implementa uma interface vc deve obrigatoriamente implementar os métodos da interface, existe uma classe adaptadora, a WindowAdapter. Nela, vc só implementa o método que vc quer, pois agora já não é mais uma interface e sim uma classe
Se vc extendeu JFrame na sua classe, faça assim:

addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { if (JOptionPane.showConfirmDialog(null,"Deseja sair")==JOptionPane.OK_OPTION){ salvarDados(); } } });
Não testei, mad me lembro um pouco, deve ser alguma coisa assim.

Abraço[/quote]

vc sabe pq isso nao funciona dentro de um laço?
tipo… qnd eu fecho um jframe, eu dou a ação pra abrir outro
ao inves do salvaDados ae
funciona na primeira vez q passa no laço
na segunda nao
eu clico em fechar e nao acontece nada
alguem pode ajudar?

Então, este windowClosing() só esta implementado neste JFrame, que neste caso chama o método salvarDados().

No seu caso, você chama outro JFrame certo?

Ou seja, o que você precisa fazer é implementar no seu outro JFrame uma rotina igual a esta, mas com as condições que forem necessárias neste novo JFrame

Daí você não usaria este laço que vc falou.

Abraço