Adicionando um WindowListener em um FrameView


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

Comments: 3
  • #1

    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.

  • #2

    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!

  • #3

    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();
    }
    }

    }