52 votes

SwingUtilities.invokeLater

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?

53voto

aioobe Points 158466

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, ...).

14voto

mKorbel Points 90340
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)

5) un truc de base

6) toute sortie de Tâches en arrière-plan doit être wraped en invokeLater()

7voto

JVerstry Points 12414

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.

7voto

Ammar Points 666

Chaque application Swing a au moins 2 threads:

  1. Le thread principal qui exécute l'application
  2. 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.

3voto

Garrett Hall Points 11902

La plupart des événements déclenchés par l'utilisateur (clics, clavier) seront déjà sur l'EDT, vous n'aurez donc pas à utiliser SwingUtilities pour cela. Cela couvre beaucoup de cas, à l'exception de votre thread principal () et des threads de travail qui mettent à jour l'EDT.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X