Botão cancelar que fecha usando o evento WindowClosing

Olá pessoal,
Já pesquisei bastante no forum e não achei nada parecido com o que preciso fazer.
Posso fazer um evento que escuta o fechamento de uma janela através do X da janela, mas se eu colocar um botão com a função fechar esse evento não é executado.
Dessa forma, minha pergunta é: como faço para um botão fechar a janela da mesma forma como o botão X da janela?

Ou então, se precisar fechar só a janela:

suaJanela.setVisible(false);

Olha esse exemplo, é só adaptar o método do jeito que vc quer:

addWindowListener(new WindowAdapter() {
	public void windowClosing(WindowEvent e) {
	int i = JOptionPane.showConfirmDialog(null,
		"Deseja realmente sair?", "Saída",
		JOptionPane.YES_NO_OPTION);
			if (i == JOptionPane.YES_OPTION) {
				System.exit(0);
			} else {
				repaint();
			}
	}
});
1 curtida

Ou vc pode usar:


JFrame.DISPOSE_ON_CLOSE;

ou

JFrame.HIDE_ON_CLOSE;

Creio que vcs não me entenderam. Vou colocar uns passos aqui para descrever o que estou dizendo:

  1. crie um JFrame com apenas um botão
  2. crie um evento formWindowClosing

addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { formWindowClosing(evt); } });

private void formWindowClosing(java.awt.event.WindowEvent evt) { System.out.println("Fechando a janela"); }
3) coloque no botão o System.exit(0) ou o dispose()
4) rode o projeto a primeira vez e feche pelo X da janela.
5) observe o System.out
6) rode o projeto a segunda vez e feche através do bortão.
7) observe o System.out

Notaram a diferença?

A diferença é que vc passará um objeto WindowEvent ao clicar no X da Janela e qndo clicar no botão passará um objeto ActionEvent

private void formWindowClosing(java.awt.event.WindowEvent evt) {                                   
         System.out.println("Fechando a janela");
 }

private void formWindowClosing(java.awt.event.ActionEvent evt) {                                   
         System.out.println("Fechando a janela");
 }

Um, e tem alguma forma de passar o WindowEvent ao clicar no JButton? A minha maior dúvida é quanto o parâmetro evt. O que passar nele?

Pra que você precisa passar o WindowEvent, se você não está utilizando o evento para nada?

Use um método externo sem evento nenhum e então chame esse método tanto para o ActionListener do JButton, quanto para o WindowListener do JFrame.

Putz, é mesmo!!!
E olha que eu já tinha usado essa técnica antes. Valeu!!!

É mesmo Vinny. Obrigado!!!

System.exit(0);

Creio q deva ser

System.exit(0);