2008-10-29 4 views
14

Si je fais un JFrame comme celui-ciPourquoi mon application continue-t-elle de fonctionner après la fermeture de la fenêtre principale?

public static void main(String[] args) { 

    new JFrame().setVisible(true); 
} 

puis après la fermeture de la fenêtre du appication ne s'arrête pas (je besoin de le tuer).

Quelle est la manière correcte d'afficher les fenêtres principales de l'application?

J'aimerais aussi connaître la raison d'une solution proposée.

Merci d'avance.

Répondre

20

Vous devriez appeler le setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); dans votre JFrame.

code Exemple:

public static void main(String[] args) { 
    Runnable guiCreator = new Runnable() { 
     public void run() { 
      JFrame fenster = new JFrame("Hallo Welt mit Swing"); 
      fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      fenster.setVisible(true); 
     } 
    }; 
    SwingUtilities.invokeLater(guiCreator); 
} 
+1

Je déteste parfois Java.Cela devrait être le comportement par défaut, à mon avis. –

+0

Ok, j'ai trouvé la raison - il y a deux threads AWT supplémentaires en cours d'exécution et c'est pourquoi mon application ne se termine pas lorsque la méthode "principale" se termine. J'oublie toujours que JFrame est non-modal et crée ces threads. –

+4

Pourquoi devrait-il être le comportement par défaut? De nombreuses applications créent plusieurs fenêtres. Si c'était la valeur par défaut, vous devriez la changer chaque fois que vous créez une nouvelle fenêtre. – Herms

2

Il y a une différence entre la fenêtre d'application et l'application elle-même ... La fenêtre exécute dans son propre fil, et la finition main() ne sera pas mettre fin à l'application si d'autres threads sont toujours actifs . Lors de la fermeture de la fenêtre, vous devez également vous assurer de fermer l'application, éventuellement en appelant System.exit(0);

Yuval = 8)

3

Vous devez disposer du cadre, invoquant la méthode Éliminez dans votre écouteur de fenêtre ou en utilisant setDefaultCloseOperation. Pour l'argument de la dernière, vous pouvez utiliser deux options:

DISPOSE_ON_CLOSE ou EXIT_ON_CLOSE.

DISPOSE_ON_CLOSE seulement disposer les ressources de trame.

EXIT_ON_CLOSE supprime les ressources de trame puis appelle System.exit.

Il n'y a pas de réelle différence entre les deux sauf si vous avez des threads non démon. Je préfère utiliser DISPOSE_ON_CLOSE parce que de cette façon, je suis capable de remarquer si j'ai oublié de terminer un thread, car la JVM s'arrêtera s'il n'y a plus de threads en cours d'exécution. C'est également la raison pour laquelle la fermeture d'un Frame sans disposer de l'application ne mettra pas fin à l'application, car Swing crée un thread pour gérer les événements qui se terminent uniquement lorsque cette commande est appelée.

0

Vous pouvez définir un écouteur de fenêtre sur l'image pour que le programme se termine après la fermeture.

 frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
    } 
0

La bonne façon de le faire (sauf si vous écrivez une application unique fenêtre très trivial, à savoir pas d'autres fenêtres ou de fils, etc ..) est d'attraper l'événement windowClosing(), puis appeler la méthode dispose(); de la forme. Si votre programme ne se termine pas complètement après cela, cela signifie que vous avez d'autres threads non-Deamon en cours d'exécution, et vous devez les arrêter au mieux selon votre programme. L'appel System.exit() ou setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); va forcer l'arrêt de tous les autres threads (et de l'ensemble du programme), ce qui signifie que votre code est moins portable, et que les threads forcés sont manifestement dangereux (en programmation).

Questions connexes