SwingUtilities.invokeLater

Ma question est liée à SwingUtilities.invokeLater . Quand devrais-je l’utiliser? Dois-je utiliser chaque fois que j’ai besoin de mettre à jour les composants de l’interface graphique? Qu’est-ce que ça fait exactement? Y a-t-il une alternative à cela car il ne sonne pas intuitif et ajoute du code apparemment inutile?

Dois-je utiliser chaque fois que j’ai besoin de mettre à jour les composants de l’interface graphique?

Non, pas si vous êtes déjà sur le thread de dissortingbution d’événements (EDT), ce qui est toujours le cas lorsque vous répondez à des événements initiés par l’utilisateur, tels que les clics et les sélections. (Les méthodes actionPerformed , etc. sont toujours appelées par l’EDT.)

Si vous n’êtes pas sur l’EDT et que vous souhaitez effectuer des mises à jour de l’interface graphique (si vous souhaitez mettre à jour l’interface graphique depuis un thread de timer ou un thread réseau, etc.), vous devez planifier la mise à jour effectuée par l’EDT. . C’est à quoi sert cette méthode.

Swing est fondamentalement un thread dangereux. C’est-à-dire que toutes les interactions avec cette API doivent être effectuées sur un seul thread (l’EDT). Si vous devez effectuer des mises à jour d’interface graphique à partir d’un autre thread (thread de temporisation, thread de réseau, …), vous devez utiliser des méthodes telles que celle que vous avez mentionnée (SwingUtilities.invokeLater, SwingUtilities.invokeAndWait, …).

 Swing is single threaded and all changes to the GUI must be done on EDT 

Utilisation de base pour invokeLater()

  1. Les méthodes principales doivent toujours être enveloppées dans invokeLater()

  2. Action / événement retardé (mais asynchrone) à la fin de EventQueue ,

  3. Si EDT n’existe pas, vous devez créer un nouvel EDT en utilisant invokeLater() . Vous pouvez le tester avec if (SwingUtilities.isEventDispatchThread()) {...

  4. Il existe invokeAndWait() , mais jusqu’à aujourd’hui (juste ma vue), je ne trouve aucune raison d’utiliser invokeAndWait() au lieu de invokeLater() , sauf les modifications matérielles dans l’interface graphique (JTree et JTable), mais uniquement avec Substance L & F (excellent pour tester la cohérence des événements sur l’EDT)

  5. Trucs de base: concurrence dans Swing

  6. Toutes les sorties des tâches en arrière-plan doivent être invokeLater() dans invokeLater()

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 (l’interface utilisateur 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 par l’EDT.

Ma question cette fois est liée à SwingUtilities.invokeLater : Quand devrais-je l’utiliser?

Ce qu’il faut comprendre, c’est que Java a un thread séparé (EDT) pour gérer les événements liés à Swing.

Vous devez utiliser invokeLater() pour afficher le JFrame principal d’une application de bureau (par exemple), au lieu d’essayer de le faire dans le thread en cours. Cela créera également le contexte pour la fermeture harmonieuse de l’application ultérieurement.

C’est à peu près tout pour la plupart des applications.

Dois-je utiliser chaque fois que j’ai besoin de mettre à jour les composants de l’interface graphique? Qu’est-ce que ça fait exactement?

Non. Si vous modifiez un composant graphique, cela déclenchera un événement qui sera enregistré pour une dissortingbution ultérieure par Swing. S’il y a un auditeur pour cet événement, le thread EDT l’appellera quelque part. Vous n’avez pas besoin d’utiliser invokeLater() , définissez simplement vos écouteurs sur les composants correctement.

Gardez à l’esprit que ce fil est le même fil dessinant des frameworks etc. sur votre écran. Par conséquent, les auditeurs ne doivent pas effectuer de tâches complexes / longues / intensives sur le processeur, sinon votre écran se fige.

Y a-t-il une alternative à cela car il ne sonne pas intuitif et ajoute du code apparemment inutile?

Vous n’avez pas besoin d’écrire plus de code que d’afficher votre application avec invokeLater() + écouteurs sur invokeLater() vous êtes intéressé. Le rest est géré par Swing.

La plupart des événements initiés par les utilisateurs (clics, clavier) se trouvent déjà sur l’EDT, vous n’avez donc pas à utiliser SwingUtilities pour cela. Cela couvre beaucoup de cas, sauf pour votre thread principal () et les threads de travail qui mettent à jour l’EDT.