2009-12-31 2 views
5

ho aggiunto un ascoltatore stato della finestra come segue:chiudi finestra evento in java

this.addWindowStateListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
      ExitAction.getInstance().actionPerformed(null); 
     } 

    }); 

Ma quando sto usando il pulsante di chiusura X l'evento non viene chiamato. Penso che abbia qualcosa a che fare con il framework jbeshk netbean. Ma non riesco a trovare quale potrebbe essere il problema. Grazie per il vostro aiuto.

risposta

9

windowClosing fa parte dell'interfaccia WindowListener. Utilizzare addWindowListener anziché addWindowStateListener.

+2

+1. si noti che un 'WindowStateListener' è usato per gestire eventi che vengono attivati ​​quando la finestra è ridotta a icona o ingrandita, ecc, ma non chiusa. – akf

3

Normalmente si utilizza un WindowListener per questo.

Verificare Closing an Application per un approccio che utilizzo, anche se devo ammettere che non l'ho mai provato con Netbeans poiché non utilizzo un IDE.

0

Come dice la documentazione Java, per chiudere effettivamente la finestra il listener dovrebbe richiamare il metodo dispose o setVisible (false) della finestra.

-2

Come altri hanno fatto notare la WindowListener è che cosa siete dopo ... ma si dovrebbe fare questo da ora in poi quando l'override un metodo:

this.addWindowStateListener(
    new WindowAdapter() 
    { 
     @Overrides 
     public void windowClosing(WindowEvent e) 
     { 
      ExitAction.getInstance().actionPerformed(null); 
     } 

    }); 

Poi il compilatore vi dirà quando non si è in realtà sovrascrivendo un metodo e aggiungendo invece un nuovo metodo (che in questo caso non verrà mai chiamato).

+0

WindowAdapter è sia un WindowListener che un WindowStateListener. Il problema qui è che viene aggiunto come WindowStateListener in modo che i metodi che ha come WindowListener non vengano chiamati. – lins314159

+0

ah vero, non sapevo che implementasse più di WindowListener. Che strano ... a quanto pare hanno aggiunto quello in 1.4. Prima di 1.4, se Java aveva annotazioni, ciò che ho detto avrebbe funzionato :-) (non eliminando la risposta poiché è valida come regola generale, non solo in questo caso specifico) – TofuBeer

3

Non rispondere direttamente alla domanda (poiché è già stata fornita una risposta), ma presumo che voglia uscire dal programma (o semplicemente nascondere una finestra) all'uscita. C'è una soluzione più breve per queste situazioni:

window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
0

Grazie a tutti per avermi aiutato a risolvere il problema. Non lo comprendo completamente ma il seguente codice risolve il problema:

Frame[] frames = Frame.getFrames(); 
    for(Frame f: frames){ 
     f.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       ExitAction.getInstance().actionPerformed(null); 
      } 

     }); 
    } 

Sembra che la struttura aggiunga frame aggiuntivi. Grazie,

1

Ho appena corretto il debug di un problema simile nel mio programma Swing. Si è rivelato un bug Java che uccide gli eventi dell'interfaccia utente del sistema quando ImageIO viene chiamato prima che venga creata l'interfaccia utente di Swing. Vedi qui per un esempio minimo -

https://stackoverflow.com/questions/18964138/osx-specific-new-java-ui-bug-reproducable-java-imageio-close-window-event-bug

Questo bug ferma gli eventi del sistema di interfaccia utente, come ad esempio finestra vicino, di essere consegnato a Java.