Chiudere un JFrame senza chiuderne un altro?

Voglio mostrare due (o più) JFrames allo stesso tempo.
Quando ne chiudo uno (usa il pulsante di chiusura predefinito), gli altri fotogrammi dovrebbero essere ancora visibili.

Come lo posso fare?

Se non vuoi che la tua applicazione si chiuda quando un JFrame è chiuso, usa

 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) 

invece di

 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

Dalla documentazione :

  • DO_NOTHING_ON_CLOSE (definito in WindowConstants): non fare nulla; richiedere al programma di gestire l’operazione nel metodo windowClosing di un object WindowListener registrato.
  • HIDE_ON_CLOSE (definito in WindowConstants): nasconde automaticamente il fotogramma dopo aver richiamato gli oggetti WindowListener registrati.
  • DISPOSE_ON_CLOSE (definito in WindowConstants): nasconde e disponga automaticamente il frame dopo aver richiamato gli oggetti WindowListener registrati.
  • EXIT_ON_CLOSE (definito in JFrame): chiude l’applicazione utilizzando il metodo di uscita del sistema. Usalo solo nelle applicazioni.

Questa è stata la mia risposta prima che la domanda fosse chiarita, potrebbe comunque essere utile:

Puoi usare setVisible(false) sul tuo JFrame se vuoi visualizzare di nuovo lo stesso fotogramma.
Altrimenti chiama dispose() per rimuovere tutte le risorse della schermata nativa .

Ti aiuta?

 import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class TwoJFrames { public static void main(String[] args) { int nb = 4; if (args != null && args.length > 0) { nb = Integer.parseInt(args[0]); } final int frameCount = nb; SwingUtilities.invokeLater(new Runnable() { public void run() { for (int i = 0; i < frameCount; i++) { JFrame frame = new JFrame("Frame number " + i); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); JPanel p = new JPanel(new BorderLayout()); p.add(new JLabel("Click on the corner to close..."), BorderLayout.CENTER); frame.setContentPane(p); frame.setSize(200, 200); frame.setLocation(100 + 20 * i, 100 + 20 * i); frame.setVisible(true); } } }); } }