web-dev-qa-db-fra.com

JFrame Quitter à la fermeture de Java

Je ne comprends pas comment utiliser ce code:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

pour fermer le programme avec le bouton x.

47
user983246

Vous avez besoin de la ligne

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

Parce que le comportement par défaut du JFrame lorsque vous appuyez sur le bouton X est équivalent à

frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);

Donc, presque toutes les fois où vous aurez besoin d'ajouter cette ligne manuellement lors de la création de votre JFrame

Je fais actuellement référence aux constantes dans WindowConstants, comme WindowConstants.EXIT_ON_CLOSE au lieu des mêmes constantes déclarées directement dans JFrame, car les précédentes reflètent mieux l'intention.

73
Jaime Hablutzel

Si vous ne l'avez pas, le JFrame sera simplement éliminé. Le cadre se fermera, mais l'application continuera à s'exécuter.

7
Jeff Storey

Appeler setDefaultCloseOperation(EXIT_ON_CLOSE) fait exactement cela. Cela provoque la fermeture de l'application lorsqu'elle reçoit un événement de la fenêtre de fermeture du système d'exploitation. En appuyant sur le bouton fermer (X) de votre fenêtre, le système d'exploitation génère un événement de fermeture de la fenêtre et l'envoie à votre application Java. L'événement de fermeture de la fenêtre est traité par la boucle d'événements AWT dans votre application Java qui la quittera en réponse à l'événement.

Si vous n'appelez pas cette méthode, la boucle d'événements AWT ne peut pas quitter l'application en réponse à l'événement de fermeture de la fenêtre, mais la laisser s'exécuter en arrière-plan .

4
Brian Coleman

J'ai passé pas mal de temps à utiliser Internet pour trouver une solution élégante à ce problème. Comme d'habitude, j'ai trouvé beaucoup d'informations contradictoires.

J'ai finalement fini avec:

  1. N'utilisez pas EXIT_ON_CLOSE car cela peut laisser des ressources derrière;
  2. Utilisez quelque chose comme ceci dans l’initialisation de JFrame:

    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    
  3. La véritable découverte consistait à envoyer un message de fenêtre à JFrame. Par exemple, dans le cadre de votre JMenuItem pour quitter l'application, utilisez ce qui suit, dans lequel la fonction getFrame() renvoie une référence à JFrame:

    public class AppMenuFileExit extends JMenuItem implements ActionListener
    {
        // do your normal menu item code here
    
          @Override
          public void actionPerformed(ActionEvent e)
          {
            WindowEvent we;
            we = new WindowEvent((Window) App.getFrame(), WindowEvent.WINDOW_CLOSING);
    
            App.getFrame().dispatchEvent(we);
          }
    }
    

    JFrame est une sous-classe de Window et peut donc être converti dans Window à cette fin.

  4. Et, dans votre classe JFrame, disposez des éléments suivants pour gérer les messages Windows:

    public class AppFrame extends JFrame implements WindowListener
    {
      // Do all the things you need to for the class
    
      @Override
      public void windowOpened(WindowEvent e)
      {}
      @Override
      public void windowClosing(WindowEvent e)
      {/* can do cleanup here if necessary */}
    
      @Override
      public void windowClosed(WindowEvent e)
      {
        dispose();
        System.exit(0);
      }
      @Override
      public void windowActivated(WindowEvent e)
      {}
      @Override
      public void windowDeactivated(WindowEvent e)
      {}    
      @Override
      public void windowDeiconified(WindowEvent e)
      {}
      @Override
      public void windowIconified(WindowEvent e)
      {}
    }
    
2
Higgs

Si vous utilisez un cadre (Class Extends Frame), vous ne recevrez pas le 

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
1
Yacine

this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

cela a fonctionné pour moi dans le cas de Class Extends Frame

0
Aditya Joshi

Si vous ne prolongez pas JFrame et utilisez JFrame lui-même dans variable, vous pouvez utiliser:

frame.dispose();
System.exit(0);
0
Dmitriy Potapov

Le code suivant fonctionne pour moi:

System.exit(home.EXIT_ON_CLOSE);
0