Quelle est la bonne façon de mettre fin à une application Swing à partir du code et quels sont les pièges?
J'avais essayé de fermer mon application automatiquement après le déclenchement d'une minuterie. Mais le simple fait d'appeler dispose()
le JFrame
n'a pas fait l'affaire - la fenêtre a disparu mais l'application ne s'est pas arrêtée. Cependant, lors de la fermeture de la fenêtre avec le bouton de fermeture, l'application se termine. Que devrais-je faire?
Réponses:
Votre action de fermeture par défaut JFrame peut être définie sur "
DISPOSE_ON_CLOSE
" au lieu deEXIT_ON_CLOSE
(pourquoi les gens continuent à utiliser EXIT_ON_CLOSE me dépasse).Si vous avez des fenêtres non éliminées ou des threads non démon, votre application ne se terminera pas. Cela devrait être considéré comme une erreur (et le résoudre avec System.exit est une très mauvaise idée).
Les coupables les plus courants sont java.util.Timer et un thread personnalisé que vous avez créé. Les deux doivent être définis sur daemon ou doivent être explicitement supprimés.
Si vous souhaitez vérifier toutes les images actives, vous pouvez utiliser
Frame.getFrames()
. Si tous les Windows / Frames sont supprimés, utilisez un débogueur pour rechercher tous les threads non démon en cours d'exécution.la source
back
fenêtre? Si la deuxième fenêtre est ensuite fermée et que vous utilisezDISPOSE_ON_CLOSE
le programme ne se termine pas parce que la première fenêtre est toujours "non disposée" ... y a-t-il un moyen de résoudre cela sans utiliserDISPOSE_ON_CLOSE
?Je suppose que EXIT_ON_CLOSE
avant
System.exit(0)
c'est mieux car vous pouvez écrire un écouteur de fenêtre pour effectuer certaines opérations de nettoyage avant de quitter réellement l'application.Cet écouteur de fenêtre vous permet de définir:
la source
Essayer:
Brut, mais efficace.
la source
Peut-être que le moyen le plus sûr est quelque chose comme:
la source
Frame
avec une majuscule, exactement comme le nom d'une classe…Le programme suivant inclut du code qui mettra fin à un programme dépourvu de threads superflus sans appeler explicitement System.exit (). Afin d'appliquer cet exemple aux applications utilisant des threads / écouteurs / minuteries / etc, il suffit d'insérer un code de nettoyage demandant (et, le cas échéant, en attente) leur terminaison avant que WindowEvent ne soit lancé manuellement dans actionPerformed ().
Pour ceux qui souhaitent copier / coller du code capable de fonctionner exactement comme indiqué, une méthode principale légèrement moche mais autrement non pertinente est incluse à la fin.
la source
Si je vous comprends bien, vous souhaitez fermer l'application même si l'utilisateur n'a pas cliqué sur le bouton de fermeture. Vous devrez peut-être enregistrer WindowEvents avec addWindowListener () ou enableEvents () selon ce qui convient le mieux à vos besoins.
Vous pouvez ensuite appeler l'événement avec un appel à processWindowEvent (). Voici un exemple de code qui créera un JFrame, attendra 5 secondes et fermera le JFrame sans intervention de l'utilisateur.
Comme vous pouvez le voir, la méthode processWindowEvent () provoque le déclenchement de l'événement WindowClosed lorsque vous avez l'opportunité de faire du code de nettoyage si vous en avez besoin avant de fermer l'application.
la source
Jetez un œil à la documentation Oracle .
À partir du JDK 1.4, une application se termine si:
Cornercases:
Le document indique que certains packages créent des composants affichables sans les libérer. Un programme qui appelle Toolkit.getDefaultToolkit () ne se terminera pas. est entre autres donné à titre d'exemple.
D'autres processus peuvent également maintenir AWT en vie lorsqu'ils, pour une raison quelconque, envoient des événements dans la file d'attente d'événements native.
J'ai également remarqué que sur certains systèmes, il faut quelques secondes avant que l'application se termine réellement.
la source
Je pense que l'idée est ici le WindowListener - vous pouvez y ajouter n'importe quel code que vous souhaitez exécuter avant que la chose ne s'arrête
la source
En réponse à d'autres commentaires, DISPOSE_ON_CLOSE ne semble pas quitter correctement l'application - il détruit seulement la fenêtre, mais l'application continuera de fonctionner. Si vous souhaitez mettre fin à l'application, utilisez EXIT_ON_CLOSE.
la source