Qual è l’azione giusta da eseguire alla chiusura di Windows in java / swing?

Ho appena scritto questo codice di test nella mia class 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); } }); } 

Funziona correttamente se CustomUIPanel.main() è il punto di ingresso del programma, ma mi chiedo qualcosa: cosa succede se un’altra class si chiama CustomUIPanel.main() per il test? Quindi la mia chiamata a System.exit(0) non è corretta.

C’è un modo per dire al thread di invio dell’evento Swing di uscire automaticamente se non ci sono windows di livello superiore?

In caso contrario, qual è la cosa giusta per un JDialog / JFrame da fare alla chiusura se l’objective è che il programma esca quando tutte le windows di primo livello sono chiuse?

    È ansible utilizzare il metodo setDefaultCloseOperation() di JDialog , specificando DISPOSE_ON_CLOSE :

     setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 

    Vedi anche 12.8 Esci dal programma .

    Addendum: incorporando la risposta utile di @ camickr, questo esempio viene chiuso quando si chiude la finestra o si preme il pulsante di chiusura.

     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 actionPerformsd(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(); } }); } } 

    Non sono sicuro riguardo all’utilizzo di un JDialog.

    Ma quando usi un JFrame dovresti usare frame.dispose (). Se il frame è l’ultimo frame aperto, la VM uscirà.

    Nota una finestra di dialogo non ha un’opzione EXIT_ON_CLOSE poiché generalmente non dovrebbe uscire dalla VM.

    Quando si chiude la finestra di dialogo è sempre ansible ottenere il frame principale della finestra di dialogo. Quindi puoi inviare un evento al frame per dirgli di chiudersi. Qualcosa di simile a:

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

    Bene,

    Potresti usare invece una JFrame. JDialog dovrebbe essere usato come popup di un’applicazione che viene eseguita in un JFrame per catturare l’attenzione degli utenti e mettere in pausa l’applicazione principale. Se JFrame è chiuso, puoi chiamare System.exit (0)

    dialog ha un metodo getParent() , che suppongo, è impostato su null nel tuo caso qui CustomUIPanel.createDialog(null,

    puoi usarlo per uscire condizionatamente.

    Ecco cosa consiglierei: dialog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Uso

     this.dispose(); 

    Dovrebbe funzionare.