Ma question concerne SwingUtilities.invokeLater
. Quand devrais-je l'utiliser? Dois-je utiliser chaque fois que je dois mettre à jour les composants de l'interface graphique? Que fait-il exactement? Y a-t-il une alternative à cela, car cela ne semble pas intuitif et ajoute du code apparemment inutile?
Réponses
Trop de publicités?Dois-je utiliser chaque fois que j'ai besoin pour mettre à jour les composants de l'interface utilisateur?
Non, pas si vous êtes déjà sur l'event dispatch thread (HAE), qui est toujours le cas lorsque l'on répond à initiées par l'utilisateur des événements tels que les clics et les sélections. (
actionPerformed
Des méthodes, etc, sont toujours appelés par l'EDT.)Si vous êtes pas sur l'EDT, cependant, et veulent faire de la GUI de mises à jour (si vous voulez mettre à jour l'interface utilisateur graphique de certains thread horloge, ou d'un réseau de fil, etc), vous aurez à planifier la mise à jour soit effectuée par l'EDT. C'est ce que cette méthode est pour.
Swing est fondamentalement thread dangereux. I. e., l'interaction avec l'API doit être effectué sur un seul thread (HAE). Si vous avez besoin de faire de la GUI de mises à jour à partir d'un autre thread (thread horloge, la mise en réseau de filetage, ...) vous avez besoin d'utiliser des méthodes telles que celle que vous avez mentionné (SwingUtilities.invokeLater, SwingUtilities.invokeAndWait, ...).
Swing is single threaded and all changes to the GUI must be done on EDT
l'utilisation (de base) invokeLater()
1) principales méthodes devraient toujours être enveloppé dans invokeLater()
2) en retard (mais de manière asynchrone) d'action/événement pour la fin de l' EventQueue
,
3) si l'EDT n'existe pas alors vous devez créer un nouveau EDT en utilisant invokeLater()
pouvez-vous tester avec if (SwingUtilities.isEventDispatchThread()) {...
4) il y a exister invokeAndWait()
, mais jusqu'à aujourd'hui, je (just my view
) ne peuvent pas trouvé de raison pour l'utilisation de invokeAndWait()
au lieu de invokeLater()
, à l'exception dur changements dans l'interface graphique (JTree & JTable) mais en Substance L&F (excelent pour tester la cohérence des événements sur le EDT)
6) toute sortie de Tâches en arrière-plan doit être wraped en invokeLater()
My question this time is related to SwingUtilities.invokeLater: When should I use it?
Ce qui est essentiel à comprendre est que Java a un thread séparé (HAE) le traitement Swing événements connexes.
Vous devez utiliser invokeLater()
pour afficher le principal JFrame
d'une application de bureau (par exemple), au lieu d'essayer de le faire dans le thread courant. Il permettra également de créer le contexte pour gracieux fermeture de l'application plus tard.
C'est à ce sujet pour la plupart des applications.
Do I have to use each time I need to update the GUI components? What does it exactly do?
Pas de. Si vous modifiez un composant d'interface graphique, il va déclencher un événement qui est enregistré pour plus tard envoi par Swing. Si il y a un écouteur pour l'événement, l'EDT thread va appeler quelque part en bas de la route. Vous n'avez pas besoin d'utiliser invokeLater()
, il suffit de définir vos auditeurs sur les composants correctement.
Gardez à l'esprit que ce fil est le même thread, dessin, images, etc... sur votre écran. Par conséquent, les auditeurs ne devraient pas effectuer complexe/long/UC les tâches, sinon, votre écran va geler.
Is there an alternative to it since it doesn't sound intuitive and adds seemingly unnecessary code?
Vous n'avez pas besoin d'écrire plus de code que l'affichage de votre application avec invokeLater()
+ écouteurs qui vous intéresse sur le composant. Le reste est géré par Swing.
Chaque application Swing a au moins 2 threads:
- Le thread principal qui exécute l'application
- L'EDT (Event Dispatching Thread) est un thread qui met à jour l'interface utilisateur (afin que celle-ci ne se fige pas).
Si vous souhaitez mettre à jour l'interface utilisateur, vous devez exécuter du code dans l'EDT. Des méthodes telles que SwingUtilities.invokeLater, SwingUtilities.invokeAndWait, EventQueue.invokeLater, EventQueue.invokeAndWait vous permettent d'exécuter du code via l'EDT.