JOPTIONPANE.SHOWMESSAGEDIADIAGEOG est censé être un utilitaire utile pour obtenir les commentaires de l'utilisateur car il bloque votre fil actuel pendant que vous attendez. P>
Je m'attendrais donc que ce serait une sécurité de thread et que vous n'auriez pas besoin d'envelopper l'appel dans une invoquater ou un invokeandwait. P>
est-ce le cas? p>
3 Réponses :
Vous ne devez appeler cette méthode que sur le thread d'expédition de l'événement, car il s'agit du seul fil qui devrait interagir avec des composants de balançoire.
Si vous souhaitez mettre en pause le traitement des antécédents tout en attendant les commentaires de l'utilisateur, je vous suggère d'utiliser un swingworker implémentation dans laquelle le doinbackground () < / Code> Méthode Appels périodiquement
Publier () Code>, permettant à
processus () code> à appeler sur le thread swing.
DOINBackground () CODE> peut alors potentiellement bloquer jusqu'à ce que certaines mesures soient prises dans le processus
() code>. Par exemple: p>
Merci, je connais le swingworker.
Pas de problème ... bien que cela soit aguable, que vous souhaitiez faire une pause de votre fil d'arrière-plan tout en affichant la boîte de dialogue; Cela a probablement plus de sens pour qu'il continue de traiter jusqu'à ce que l'utilisateur prend une décision.
tiré de la description du package Javax.swing: P>
Politique de threading de Swing h2>
En général Swing n'est pas le fil sûr. Tous les composants swing et les classes connexes, sauf indication contraire, doivent être consultés sur le thread d'expédition de l'événement. Les applications de swing typiques traitent en réponse à un événement généré à partir d'un geste de l'utilisateur. Par exemple, cliquer sur un JButton notifie tous les accidents ajoutés au JButton. Comme tous les événements générés à partir d'un geste d'utilisateur sont expédiés sur le thread d'expédition des événements, la restriction n'est pas affectée par la restriction. p>
Lorsque l'impact réside, cependant, construit et montrant une application Swing. Les appels vers une méthode principale d'une application, ou des méthodes d'applet, ne sont pas invoquées sur le thread d'expédition de l'événement. En tant que tels, il faut prendre soin de transférer le contrôle sur le fil d'expédition des événements lors de la construction et de la présentation d'une application ou d'une applet. Le moyen préféré de transférer le contrôle et commencer à travailler avec Swing consiste à utiliser invoquater. La méthode InvOKELater planifie une exécution d'une exécution exécutable sur le thread d'expédition de l'événement. p> blockQuote>
JOPTIONPANE NE DOCUMENT NE DOCUMENT PAS QU'IL SA SA SA SA SAFE, vous devez donc utiliser
invoqater () code>. P>
Joptionpane n'est jamais utilisé à l'extérieur du fil de la file d'attente, si vous essayez de modifier ou de quoi que ce soit, il s'agirait d'un endroit dangereux.
Non, ce n'est pas le cas. Le comportement de blocage est très spécifiquement codé dans la file d'attente d'événement (en appuyant sur une nouvelle file d'attente afin que d'autres événements puissent être traités et bloquer celui-ci). Comme avec tous les composants swing, ils ne peuvent être utilisés que dans la file d'attente d'événement. P>
Il y a une discussion connexe dans les réponses et les commentaires de cette question . Un argument est que, même si ce n'est pas le fil sûr, ce n'est pas un problème et il n'est pas nécessaire de l'exécuter sur l'EDT.