Ajuda com WindowListener

8 respostas
J

Boas, eu tenho um problema e gostava que alguém me ajudasse:
Eu tenho um programa com várias janelas, para este caso específico o que acontece é o seguinte: o utilizador está numa janela, vamos chamar lhe janela A, abre outra janela, vamos chamar lhe janela B, para ir registar uma coisa que é precisa na janela A, o que eu quero é executar uma função específica, na janela A, quando a janela B for fechada.
Para verificar se a janela B está fechada penso usar o método isVisible();
O que eu não sei é onde meter esse isVisible();
Alguém me pode ajudar?

Cumps

8 Respostas

S

Use um windowListener na janela B.
http://docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.html

Obs: Seja específico nos títulos dos tópicos ao criá-los.

J

Obrigado, vou agora tentar perceber esse código.
Sobre o título eu não sabia que título lhe dar, peço desculpa

J

Boas, eu estive a ver se percebia o código acima mencionado e não consigo pô lo a funcionar.

Eu criei uma classe JanelaEspia onde extendi a clase WindowAdapter: e criei uma função windowClosed

public class JanelaEspia extends WindowAdapter{
    
    
    
    @Override
    public void windowClosed(WindowEvent e){
        
        FolhaReparações janela = new FolhaReparações();
        janela.carregarComboModelo("nulo", 1);
        janela.carregarCombonrserie("nulo", 1);
        
        System.out.println("As combos foram carregadas");
    }
}

chamei essa função na janela B que é FormEquipamento, no main:

public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(FormEquipamento.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(FormEquipamento.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(FormEquipamento.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(FormEquipamento.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FormEquipamento().setVisible(true);
                new FormEquipamento().addWindowListener(new JanelaEspia());
                
            }
        });
    }

e eu tenho a janela A, que é a FolhaReparações aberta mas as combos não são atualizadas. Porque é que isso acontece?

Agradecia se alguém me puder ajudar.

S

Tenta com windowClosing().

Na API do WindowListener (http://docs.oracle.com/javase/7/docs/api/java/awt/event/WindowListener.html) diz que windowClosed é chamado quando é chamado o método dispose() sobre a janela e windowClosing é chamado quando a janela é fechada pelo menu do sistema (_ [] X).

J

Também tentei com o windowClosing e não dá na mesma :frowning:
Desta maneira não sei como fazer mas “contornei” o problema:
como o que eu queria era carregar uma comboBox, eu simplesmente a carrego em FocusGained().
Sei que não é a maneira ideal mas resolveu.
Devo por resolvido no título do tópico? o problema foi resolvido mas não foi com o WindowListener…
Cumps

S

Eu estava meio desatento hoje de manhã. Percebi agora dois erros no seu código:

  1. Não estenda WindowListener. O correto é implementar.
  2. Você está criando duas instâncias de FormEquipamento e somente a segunda está recebendo o listener.

Corrija e tente novamente, tenho certeza que funcionará agora.

J

A minha classe JanelaEspia é só uma classe, não é um JFrame, por isso eu não posso implementar, quando o faço ele dá erro e a solução desse erro é criar uma subclasse…

S

É mesmo, windowAdapter não é interface.
Pode ser feito também com classe anônima.

jframe.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ //Ações } }

Criado 23 de maio de 2013
Ultima resposta 27 de mai. de 2013
Respostas 8
Participantes 2