Jump to content

Cancelar saida de um JFrame


Nuno_Martins
 Share

Recommended Posts

Olá,

Estou a fazer um editor de texto. Quando carrego no X para fechar a JFrame se o documento não estiver gravado exibe um JOptionPane com 3 opções (Yes/No/Cancel).

A minda ideia no Cancel é que quando o utilizador carregar nele não saia da aplicação, ou seja, que a JFrame não seja terminada...

Passando ao código:

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
	if(!(text.getText().equals(textBackup))) {					
		int n = JOptionPane.showConfirmDialog(TextEditor.this, "The document is not saved!\n Do you want to save it?", 
					"Choose an option", JOptionPane.YES_NO_CANCEL_OPTION);
		if(n == JOptionPane.YES_OPTION) {
			if(fileChooser.showSaveDialog(TextEditor.this) == JFileChooser.APPROVE_OPTION)
				save(fileChooser.getSelectedFile());
		} else if(n == JOptionPane.NO_OPTION) {
			//Mantendo aqui sem código o programa termina sem problemas...
		} else if(n == JOptionPane.CANCEL_OPTION) {
			//Aqui pretendo que se este botão for premido que a JFrame não seja terminada...
		}

	}
}
});

Podem-me dar uma ideia para solucionar isto?

Link to comment
Share on other sites

A base do problema é que esse evento é disparado quando a janela já está a fechar. Uma forma simples de resolveres isso é definires o comportamento por omissão para DO_NOTHING_ON_CLOSE usando o método setDefaultCloseOperation().

Esse evento será lançado na mesma, apesar da janela deixar de fechar e teres de colocar código para a fechar, um simples System.exit(0) chega.

Link to comment
Share on other sites

Não sei se era isto que querias dizer:

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
	if(!(text.getText().equals(textBackup))) {					
		int n = JOptionPane.showConfirmDialog(TextEditor.this, "The document is not saved!\n Do you want to save it?", 
					"Choose an option", JOptionPane.YES_NO_CANCEL_OPTION);
		if(n == JOptionPane.YES_OPTION) {
			if(fileChooser.showSaveDialog(TextEditor.this) == JFileChooser.APPROVE_OPTION)
				save(fileChooser.getSelectedFile());
		} else if(n == JOptionPane.NO_OPTION) {
			System.exit(0);
		} else if(n == JOptionPane.CANCEL_OPTION) {

		}

	}
}
});

//.....

public static void main(String[] args) {
TextEditor frame = new TextEditor();
frame.setTitle("Text Editor");
frame.setSize(800, 500);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setVisible(true);
}

Só que agora quando clico no "No" dá-me o seguinte erro:

Exception while removing reference: java.lang.InterruptedException

java.lang.InterruptedException

at java.lang.Object.wait(Native Method)

at java.lang.ref.ReferenceQueue.remove(Unknown Source)

at java.lang.ref.ReferenceQueue.remove(Unknown Source)

at sun.java2d.Disposer.run(Unknown Source)

at java.lang.Thread.run(Unknown Source)

Link to comment
Share on other sites

O excerto de código, para mim, executa perfeitamente.

Verifica se estás a usar mais eventos que estejam a pendurar a Thread do Swing, ou se esse JFileChooser está a ser criado dentro da Thread Swing como é suposto. Pode ser um problema de JVM, não vejo razão para teres essa excepção, pelo menos só com o que está aí.

Já agora, o System.exit() não deveria estar fora dessas condições todas? É que assim parece que só sais da aplicação se o primeiro IF for verdadeiro e carregares no não, e se o primeiro IF falhar?

Link to comment
Share on other sites

Descobri agora que só dá erro quando eu abro a aplicação e a fecho logo, ou seja, sem colocar texto no editor. Caso lá coloque alguma coisa já funciona bem, vou ver melhor a ver se descubro o que se passa  👍

Sim, tinhas razão faltava lá um System.exit(0)  🙂

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.