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;
}
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.
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;
}
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.