web-dev-qa-db-fra.com

Fermer un JFrame sans en fermer un autre?

Je veux afficher deux (ou plus) JFrames en même temps.
Lorsque je ferme l'un d'entre eux (utilisez le bouton de fermeture par défaut), les autres cadres doivent toujours être visibles.

Comment puis je faire ça?

53
Keating

Si vous ne souhaitez pas que votre application se termine lorsqu'un JFrame est fermé, utilisez

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)

au lieu de

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

De la documentation :

  • DO_NOTHING_ON_CLOSE (Défini dans WindowConstants): Ne faites rien; exiger que le programme gère l'opération dans la méthode windowClosing d'un objet WindowListener enregistré.
  • HIDE_ON_CLOSE (Défini dans WindowConstants): Masque automatiquement le cadre après avoir appelé tous les objets WindowListener enregistrés.
  • DISPOSE_ON_CLOSE (Défini dans WindowConstants): masque et supprime automatiquement le cadre après avoir appelé tous les objets WindowListener enregistrés.
  • EXIT_ON_CLOSE (Défini dans JFrame): Quittez l'application en utilisant la méthode d'exit System. Utilisez-le uniquement dans les applications.

C'était ma réponse avant que la question ne soit clarifiée, cela pourrait quand même être utile:

Vous pouvez utiliser setVisible(false) sur votre JFrame si vous souhaitez afficher à nouveau le même cadre.
Sinon, appelez dispose() à supprimez toutes les ressources d'écran natives .

84
Peter Lang

Est-ce que cela vous aide?

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

    }
}
3
Laurent K