Bienvenue dans le monde merveilleux du fil de répartition des événements bloqués (et violation du fil initial)
Fondamentalement, Swing est un environnement fileté unique, toutes les mises à jour et modifications de l'interface utilisateur devraient être exécutées dans le contexte du thread de répartition des événements (AKA EDT).
L'EDT est responsable, entre autres, des demandes de repeindre. Si, pour une raison quelconque, vous bloquez ce fil (par exemple, en utilisant une longue boucle de course ou en bloquant IO), cela empêchera l'EDT de traiter les nouvelles demandes de peinture, ce qui donne l'impression que votre programme avait suspendu ... parce que essentiellement il a.
La raison pour laquelle vous pourriez voir une différence entre courir Timer
Directement et l'utiliser dans votre interface graphique est parce que lorsque l'application est démarrée, elle s'exécutera à l'intérieur, ce que l'on appelle communément le thread "principal".
Lorsque vous créez un conteneur de swing de haut niveau, l'EDT est démarré (qui est un thread séparé), ce qui signifie que l'interface utilisateur apparaîtra dans son propre fil, mais l'application continuera à fonctionner dans le thread "principal", permettant à votre iterate
Méthode pour s'exécuter indépendamment de l'EDT.
Cependant, lorsque vous essayez de l'exécuter à partir de votre interface graphique, tout fonctionne dans le contexte de l'EDT, ce qui le fait bloquer.
Commencez par jeter un coup d'œil
Pour résoudre le problème, en fonction de votre exemple de code, je suggère d'utiliser un SwingWorker
. Cela vous permettra d'exécuter votre "longue tâche en cours d'exécution" dans un thread d'arrière-plan, mais fournit un certain nombre de méthodes qui vous permettent de reprendre vos mises à jour à l'EDT. Ceci est très important, car vous ne devez jamais tenter de mettre à jour l'interface utilisateur ou de modifier son état à partir d'un fil autre que l'EDT.
Jeter un coup d'œil à Fil de travail et swingworker pour plus de détails
Et si nécessaire, quelques exemples ...