SwingUtilities.invokeLater
Ma question est liée à SwingUtilities.invokeLater
. Quand devrais-je utiliser? Dois-je utiliser chaque fois que j'ai besoin pour mettre à jour les composants de l'interface utilisateur? Que faut-il faire exactement? Est-il une alternative depuis son n'est pas intuitive et ajoute apparemment inutiles code?
- C'est l'équivalent de
Control.BeginInvoke
. - Est-ce à dire si j'ai un thread je n'ai pas à l'utiliser?
- Depuis le Swing cadres engendre un thread qui lui est propre (la HAE), vous aurez toujours ce thread. (Vous n'avez pas de message "vérification"-boucle qui traite l'utilisateur clique sur etc, non? Alors, comment ne les différentes
actionPerformed
méthodes appelées? Par l'EDT!) Donc quand vous dites que vous avez un thread, j'aurais à intepret que car vous n'avez que l'EDT (c'est à dire, vous avez jeté un GUI et est tombé sur le bord de la méthode main). Dans ce cas, NON, vous n'aurez pas besoin d'utiliserinvokeLater
. Toutefois, vous ne serez pas en mesure de faire une "arrière-plan" de traitement. Si vous le faites, vous allez verrouiller l'interface graphique complètement... - double possible de Ce n'SwingUtilities.invokeLater faire?
Vous devez vous connecter pour publier un commentaire.
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. (Le
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 à annexe effectuer la mise à jour par 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ée 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, ...).
D'utilisation de base pour
invokeLater()
Principales méthodes devraient toujours être enveloppé dans
invokeLater()
Retard (mais de manière asynchrone) d'action/événement à la fin de
EventQueue
,Si l'EDT n'existe pas alors vous devez créer un nouveau EDT en utilisant
invokeLater()
. Vous pouvez le tester avecif (SwingUtilities.isEventDispatchThread()) {...
Il existe
invokeAndWait()
, mais jusqu'à aujourd'hui, j'ai (juste mon avis) ne peuvent pas trouver une raison pour l'utilisation deinvokeAndWait()
au lieu deinvokeLater()
, à l'exception dur changements dans l'interface graphique (JTree & JTable), mais juste avec La Substance de L&F (excellent pour tester la cohérence des événements sur le HAE)Trucs de base: La simultanéité dans le Swing
Toute sortie de tâches en arrière-plan doit être enveloppé dans
invokeLater()
Chaque application Swing a au moins 2 threads:
Si vous souhaitez mettre à jour l'INTERFACE utilisateur, vous devez exécuter du code au sein de l'EDT.
Des méthodes comme SwingUtilities.invokeLater, SwingUtilities.invokeAndWait, EventQueue.invokeLater, EventQueue.invokeAndWait vous permettent d'exécuter du code par l'EDT.
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 les principauxJFrame
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.Que pour la plupart des applications.
Pas. 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.Garder à 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 de geler.
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.La plupart des événements initiés par l'utilisateur (clics, clavier) seront déjà sur l'EDT de sorte que vous n'aurez pas à utiliser SwingUtilities pour que. Qui couvre un grand nombre de cas, à l'exception de votre main() thread et les threads de travail de mise à jour de l'EDT.