Uma vez criando um programa eu tive a necessidade de verificar e fechar o banco de dados antes que o sistema fosse fechado. Se você estiver utilizando o NetBeans, fazer isto num FrameView parece bem complicado. Pesquisando muito na internet eu consegui achar uma solução.
Vamos imaginar que eu quero criar um aplicativo chamado MeuSistema. O NetBeans irá criar dois arquivos, o MeuSistemaAPP.java e o MeuSistemaView.java. MeuSistemaApp é a classe principal e MeuSistemaView é quem toma conta de criar o frame.
Em MeuSistemaApp.java nós podemos modificar o startup void desta forma (sobrescrevendo CanExit() e WillExit() ):
/** * At startup create and show the main frame of the * application. */ @Override protected void startup() { show(new MeuSistemaView(this)); // Create the ExitListener ExitListener exitListener = new ExitListener() { public boolean canExit(EventObject arg0) { // return statement return false; } public void willExit(EventObject arg0) {} }; // Add the Listener addExitListener(exitListener); }
Depois disto, em MeuSistemaView.java, sobrescreva o WindowClosing void ( e qualquer outro método do WindowListener):
final JFrame frame = this.getFrame();
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter(){
@override
public void windowClosing(WindowEvent we){
/*pede confirmação antes de sair */ int answer = JOptionPane.showConfirmDialog(null, "Quer mesmo fechar o sistema?", "Fechando o Sistema com segurança...", JOptionPane.YES_NO_OPTION); if (answer == 1) return; try { closeJDBC();//criado por mim } catch (NullPointerException Ex) { // if null connection just exit w/no error mesg return; } catch (Exception Ex) { JOptionPane.showMessageDialog(null, "Falha na desconexão!\n" + Ex.getMessage(), "Conexão",JOptionPane.ERROR_MESSAGE); } System.exit(0); }
Agora, quando clicar no 'X' (botão fechar), o aplicativo irá fazer o que foi implementado no WindowClosing, que, neste caso, é uma pergunta se você quer mesmo fechar o sistema e também fechar o banco de dados que estava aberto com segurança.
Enjoy! =]
Write a comment
Ronan (Saturday, 18 June 2011 11:40)
Puxa, muito obrigado! Passei horas catando uma solução. Estava usando <NomedaClasseApp>.getApplication().getMainFrame() ao invés de this.getFrame() e não funcionava de jeito algum.
rauljcs (Saturday, 18 June 2011)
Que bom! Passei por problemas como este e decidi criar o tutorial para ajudar os outros com este problema.
Até mais!
dlg (Monday, 13 February 2012 10:25)
muito bom, me auxiliou bastante para conseguir resolver um problema na aplicação.
so tive que modificar um pouco para poder fazer o logoff do usuario que fica fora do metodo construtor. ficou mais ou menos assim:
public class W3DesktopView extends FrameView {
public W3DesktopView(SingleFrameApplication app) {
super(app);
initComponents();
getFrame().setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getFrame().addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
/*pede confirmação antes de sair */
int answer = JOptionPane.showConfirmDialog(null,
"Deseja Fechar o Programa?",
"Fechando o Programa com segurança...",
JOptionPane.YES_NO_OPTION);
if (answer == JOptionPane.YES_OPTION) {
exitX();
return;
}
System.exit(0);
}
});
}
//Desaloca o usuario e finaliza a aplicação
//caso nao haja usuario logado simplismente o fecha
private void exitX() {
if (this.usuarioLogado != null) {
new Login().doLogoff(this.usuarioLogado);
this.getFrame().dispose();
} else {
this.getFrame().dispose();
}
}
}