ventanas ventana una secundarias salir para con codigo cerrar boton aplicación aplicacion java swing

ventana - codigo para salir en java



¿Por qué mi aplicación todavía se ejecuta después de cerrar la ventana principal? (5)

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

Yuval = 8-)

Si hago un JFrame como este

public static void main(String[] args) { new JFrame().setVisible(true); }

luego de cerrar la ventana, la aplicación no se detiene (tengo que matarla).

¿Cuál es la forma correcta de mostrar las ventanas principales de la aplicación?

También me gustaría saber el motivo de una solución propuesta.

Gracias por adelantado.


Debe disponer del cuadro, invocar el método de eliminación en su oyente de ventana o usar setDefaultCloseOperation. Para el argumento de la última, puede usar dos opciones:

DISPOSE_ON_CLOSE o EXIT_ON_CLOSE .

DISPOSE_ON_CLOSE solo DISPOSE_ON_CLOSE 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 hilos 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.


Puede establecer un 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); } }


Debería llamar a setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); en tu JFrame

Código de 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); }


La forma correcta de hacerlo (a menos que esté escribiendo una aplicación de ventana única muy trivial, es decir, sin otras ventanas o hilos, etc.) es atrapar el evento windowClosing() y luego invocar el dispose(); método de la forma.

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

Llamar a 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).