2009-12-31 9 views
5

que añade un detector de estado de la ventana de la siguiente manera:estrecha ventana de eventos en Java

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

    }); 

Pero cuando estoy usando el botón de cierre X el evento no se llama. Creo que es algo relacionado con el framework netbean jdesktop. Pero no puedo encontrar cuál podría ser el problema. Gracias por su ayuda.

Respuesta

9

windowClosing es parte de la interfaz WindowListener. Use addWindowListener en lugar de addWindowStateListener.

+2

+1. tenga en cuenta que un 'WindowStateListener' se usa para manejar eventos que se desencadenan cuando la ventana se minimiza o maximiza, etc., pero no se cierra. – akf

3

Normalmente, utiliza un WindowListener para esto.

Consulte Closing an Application por un enfoque que uso, aunque debo admitir que nunca lo he probado con Netbeans porque no uso un IDE.

0

Como dice la documentación de Java, para cerrar realmente la ventana el oyente debe invocar el método dispose o setVisible (falso) de la ventana.

-2

Como otros han señalado la WindowListener es lo que está después ... pero debe hacerlo de ahora en adelante, cuando sustituir un método:

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

    }); 

A continuación, el compilador le dirá cuando no esté anulando un método y en su lugar agregando un nuevo método (que en este caso nunca será llamado).

+0

WindowAdapter es tanto un WindowListener como un WindowStateListener. El problema aquí es que se está agregando como WindowStateListener por lo que los métodos que tiene como WindowListener no se llaman. – lins314159

+0

ah cierto, no sabía que implementaba más que WindowListener. Qué extraño ... aparentemente agregaron eso en 1.4. Antes de 1.4, si Java tenía anotaciones, lo que dije habría funcionado :-) (no eliminar la respuesta, ya que es válida como regla general, simplemente no en este caso específico) – TofuBeer

3

No respondiendo su pregunta directamente (dado que ya se ha dado una respuesta), pero supongo que desea salir de su programa (o simplemente ocultar una ventana) al salir. Hay una solución más corta para estas situaciones:

window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
0

Gracias a todos por ayudarme a resolver el problema. No lo subrayo por completo, pero el siguiente código soluciona el problema:

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

     }); 
    } 

Parece que el marco agrega marcos adicionales. Gracias,

1

Acabo de eliminar un problema similar en mi programa Swing. Resultó ser un error de Java que mata los eventos de interfaz de usuario del sistema cuando se llama a ImageIO antes de que se cree la UI de Swing. Ver aquí para un ejemplo mínimo -

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

Este error se para los eventos de interfaz de usuario del sistema, tales como cristal de cierre, se entreguen a Java.

Cuestiones relacionadas