¿Cuál es la acción correcta para cerrar ventanas en java / swing?

Acabo de escribir este código de prueba en mi clase CustomUIPanel:

public static void main(String[] args) { final JDialog dialog = CustomUIPanel.createDialog(null, CustomUIPanel.selectFile()); dialog.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } 

Funciona correctamente si CustomUIPanel.main() es el punto de entrada del progtwig, pero me hace pensar en algo: ¿qué CustomUIPanel.main() si otra clase llamada CustomUIPanel.main() para probar? Entonces mi llamada a System.exit(0) es incorrecta.

¿Hay alguna manera de indicarle a la secuencia de envío del evento Swing que salga automáticamente si no hay ventanas de nivel superior?

De lo contrario, ¿qué es lo correcto para JDialog / JFrame al cerrar si el objective es que el progtwig salga cuando se cierren todas las ventanas de nivel superior?

Puede usar el método setDefaultCloseOperation() de JDialog , especificando DISPOSE_ON_CLOSE :

 setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 

Ver también 12.8 Salida del progtwig .

Adición: Incorporando la respuesta útil de @camickr, este ejemplo sale cuando la ventana está cerrada o cuando se presiona el botón de cerrar.

 import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.WindowEvent; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; /** @see http://stackoverflow.com/questions/5540354 */ public class DialogClose extends JDialog { public DialogClose() { this.setLayout(new GridLayout(0, 1)); this.add(new JLabel("Dialog close test.", JLabel.CENTER)); this.add(new JButton(new AbstractAction("Close") { @Override public void actionPerformed(ActionEvent e) { DialogClose.this.setVisible(false); DialogClose.this.dispatchEvent(new WindowEvent( DialogClose.this, WindowEvent.WINDOW_CLOSING)); } })); } private void display() { this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); this.pack(); this.setLocationRelativeTo(null); this.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new DialogClose().display(); } }); } } 

No estoy seguro sobre cuándo usar un JDialog.

Pero al usar un JFrame, debe usar frame.dispose (). Si el marco es el último marco abierto, entonces la máquina virtual saldrá.

Tenga en cuenta que un cuadro de diálogo no tiene una opción EXIT_ON_CLOSE, ya que generalmente no debería salir de la máquina virtual.

Al cerrar el diálogo, siempre se puede obtener el cuadro principal de los cuadros de diálogo. Luego, podría enviar un evento al marco para indicarle que se cierre. Algo como:

 WindowEvent windowClosing = new WindowEvent(frame, WindowEvent.WINDOW_CLOSING); //Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(windowClosing); frame.dispatchEvent(windowClosing); 

Bien,

Podría usar un JFrame en su lugar. Se supone que JDialog se utiliza como una ventana emergente de una aplicación que se ejecuta en un JFrame para captar la atención de los usuarios y pausar la aplicación principal. Si JFrame está cerrado, puede llamar a System.exit (0)

diálogo tiene un método getParent() , que supongo que está establecido en nulo en su caso aquí CustomUIPanel.createDialog(null,

puedes usar eso para salir condicionalmente.

Esto es lo que recomendaría: dialog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Utilizar

 this.dispose(); 

Deberia de funcionar.