2008-10-29 40 views

Respuesta

20

Debe llamar al setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); en su JFrame.

código

Ejemplo:

public static void main(String[] args) { 
    Runnable guiCreator = new Runnable() { 
     public void run() { 
      JFrame fenster = new JFrame("Hallo Welt mit Swing"); 
      fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      fenster.setVisible(true); 
     } 
    }; 
    SwingUtilities.invokeLater(guiCreator); 
} 
+1

Odio Java a veces.Ese debería ser el comportamiento predeterminado, en mi opinión. –

+0

Ok, encontré el motivo: hay dos subprocesos AWT adicionales en ejecución y es por eso que mi aplicación no finaliza cuando finaliza el método "principal". Siempre me olvido de que JFrame no es modal y crea esos hilos. –

+4

¿Por qué debería ser el comportamiento predeterminado? Muchas aplicaciones crean ventanas múltiples. Si fuera el predeterminado, tendría que cambiarlo cada vez que cree una nueva ventana. – Herms

2

Hay una diferencia entre la ventana de la aplicación y la aplicación en sí ... La ventana se ejecuta en su propio hilo, y terminando main() no terminará la aplicación si otros hilos siguen activos . Al cerrar la ventana también debe asegurarse de cerrar la aplicación, posiblemente llamando System.exit(0);

Yuval = 8-)

3

Debe desechar el marco, invocando el método dispose en su oyente ventana o usando setDefaultCloseOperation. Para el argumento del último, puede usar dos opciones:

DISPOSE_ON_CLOSE o EXIT_ON_CLOSE.

DISPOSE_ON_CLOSE solo deseche los recursos del marco.

EXIT_ON_CLOSE dispone los recursos de marco y luego invoca System.exit.

No hay diferencia real entre los dos a menos que tenga subprocesos no daemon. Prefiero usar DISPOSE_ON_CLOSE porque de esta manera puedo notar si olvidé terminar un hilo, porque la JVM se detendrá si no hay más hilos en ejecución. Esa es también la razón por la que cerrar un Frame sin deshacerse no terminará la aplicación, ya que Swing crea un hilo para manejar los eventos que finalizan solo cuando se invoca el dispose.

0

Puede establecer oyente de ventana en el marco para que el programa finalice después de cerrarlo.

 frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
    } 
0

La forma correcta de hacer esto (a menos que usted está escribiendo una aplicación de una sola ventana muy trivial, es decir, no hay otras ventanas o hilos, etc ..) es atrapar el evento windowClosing(), y luego llamar al método dispose(); de la forma.

Si su programa no sale por completo después de esto, significa que tiene otros subprocesos no deamon en ejecución, y debe detenerlos de la mejor manera que considere adecuada según su programa.

Llamar System.exit() o setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); forzará la detención de otros hilos (y todo el programa), lo que significa que su código es menos portátil, y los hilos de detención de fuerza son obviamente peligrosos (en una especie de programación).

Cuestiones relacionadas