Frame nao deveria fechar caso de cancelamento

Ola,
estou com um problema com o fechamento de um frame. Coloquei no codigo para perguntar o usuario se ele deseja realmente fechar o frame e 2 botoes para responder a questao ( OK e Cancel) mas ambos os botões fecham o frame, o mesmo codigo em outro programa funcionou beleza. Estou usando o eclipse agora, antes era o netbeans.

Onde estou errando?

Codigo:

public class Principal extends JFrame{
	
	public Principal(){
		
		setPreferredSize(new Dimension(FrameLargura,FrameAltura));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		addWindowListener(new WindowAdapter(){ 
			public void windowClosing(WindowEvent evt){
				formWindowClosing(evt);
			}
		});
	}
	
	
	public void formWindowClosing(WindowEvent evt){
		String ConfirmaSaida = " CONFIRMAR SAIDA ? ";
		String TituloPane = "CONFIRMAÇÃO DE SAIDA";
        int i=JOptionPane.showConfirmDialog(null,ConfirmaSaida,TituloPane,JOptionPane.CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE);	
     	if(i==JOptionPane.OK_OPTION)//se ele nao entrar aqui ele deveria voltar
            System.exit(1);//mas ele sai de qualquer jeito 
	}

	private static final int FrameAltura = 750;//mudar para 800 quando concluir
	private static final int FrameLargura = 1025;
}

Obrigado…

Testei aqui, o problema não está no IF. Se você debugar a aplicação verá que o código não passa pelo System.exit( 1 ) caso aperte cancel.

Achei bem bizarro, sendo que encontrei outros trechos de código iguais ao seu na internet. Tente rodar o código fora do Eclipse para ver se a mesma coisa ocorre.

Irei testar mais tarde quando chegar em casa no TextPad pra ver se esta OK.

Obrigado …

Eu rodei o codigo por outro lugar e aconteceu a mesma coisa.

Fiz a seguinte modificacao:


public void formWindowClosing(WindowEvent evt){
		String ConfirmaSaida = " CONFIRMAR SAIDA ? ";
		String TituloPane = "CONFIRMAÇÃO DE SAIDA";
        int i=JOptionPane.showConfirmDialog(null,ConfirmaSaida,TituloPane,JOptionPane.OK_CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE);     	
        if(i!=2)//se igual a 2 eh pq cancelou
            System.exit(1);
       //quando eu removo o else ele novamente fecha de qualquer maneira
      //com o else ele nao fecha mais tambem nao aparece o JOptionPane
       //aparece no console do Eclipse de Exceptions
        else
        	JOptionPane.showMessageDialog(null,"VOLTANDO AO PROGRAMA","RETORNO",JOptionPane.INFORMATION_MESSAGE);
	}


[quote=phzao]Ola,
estou com um problema com o fechamento de um frame. Coloquei no codigo para perguntar o usuario se ele deseja realmente fechar o frame e 2 botoes para responder a questao ( OK e Cancel) mas ambos os botões fecham o frame, o mesmo codigo em outro programa funcionou beleza. Estou usando o eclipse agora, antes era o netbeans.

Onde estou errando?

Codigo:

public class Principal extends JFrame{
	
	public Principal(){
		
		setPreferredSize(new Dimension(FrameLargura,FrameAltura));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		addWindowListener(new WindowAdapter(){ 
			public void windowClosing(WindowEvent evt){
				formWindowClosing(evt);
			}
		});
	}
	
	
	public void formWindowClosing(WindowEvent evt){
		String ConfirmaSaida = " CONFIRMAR SAIDA ? ";
		String TituloPane = "CONFIRMAÇÃO DE SAIDA";
        int i=JOptionPane.showConfirmDialog(null,ConfirmaSaida,TituloPane,JOptionPane.CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE);	
     	if(i==JOptionPane.OK_OPTION)//se ele nao entrar aqui ele deveria voltar
            System.exit(1);//mas ele sai de qualquer jeito 
	}

	private static final int FrameAltura = 750;//mudar para 800 quando concluir
	private static final int FrameLargura = 1025;
}

Obrigado…[/quote]

Fala phzao!

Eita, mas que post antigo e sem solução! hehehe
Mas acredito que já não precisa mais de ajuda.
Acabei caindo aqui por engano, mas pra não deixar o post sem uma solução, vou falar onde está o problema.
É o seguinte:
Por padrão, todo JFrame é inicializado com o seu DefaultCloseOperation com o valor EXIT_ON_CLOSE.
De fato, ainda assim, vc colocou esse valor novamente:

Evidentemente, isso não representa problema algum, mas atribuir esse valor para o JFrame, significa que ele, e todos as demais janelas chamadas à partir da mesma aplicação que ele foi criado, tb serão fechadas, independente do evento que vc capturar.
Assim, uma solução para o seu problema, aproveitando EXATAMENTE o mesmo código, seria alterar o DefaultCloseOperation do seu JFrame, para que ao invés de fechar, ele não faça nada (DO_NOTHING_ON_CLOSE). Assim, o código que citei deveria ser alterado para:

	public Principal(){
		...
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		...
	}

Contudo, agora vc terá que chamar o método System.exit explicitamente, que é o que a sua aplicação já está fazendo.

Espero que ajude.


spider-max