2009-10-10 8 views
0

J'ai construit mon propre composant en étendant JPanel. J'ai ajouté quelques méthodes comme calculateWhatever() ... Devrais-je appeler ces méthodes avec invokeLater() aussi? Substance L & F ne s'en plaint pas mais j'ai de rares problèmes de peinture au hasard et je me demande s'ils se produisent à cause de ces calculs à l'intérieur de la composante d'élongation prolongée.Utilisation du composant Swing étendu, doute de thread

Répondre

2

Si vous effectuez un grand nombre de calculs, il est prudent de les exécuter dans un thread autre que le thread d'envoi d'événement. Si vous utilisez JDK 1.6, vous pouvez également utiliser la classe SwingWorker plutôt que invokeLater.

+0

Donc, juste être des méthodes d'un composant de swing étendu implique l'exécution dans l'EDT par défaut? – ktulur

+0

Jetez un oeil à cet article. C'est un bon résumé. http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html –

0

Vous n'avez besoin d'appeler ces méthodes qu'en utilisant invokeLater() (ou en utilisant le SwingWorker) lorsque vous modifiez votre composant (ou peignez dessus) à l'intérieur de ces méthodes. Si vous faites simplement des calculs, vous n'avez besoin de synchroniser que lorsque vous accédez au résultat, par exemple. la méthode paint().

0

Vous devez généralement utiliser SwingUtilities.invokeLater ou SwingWorker pour isoler les modifications apportées aux composants de l'interface graphique de tout scénario de verrouillage potentiel (E/S sur fichier ou appels de serveur distant) ou des opérations gourmandes en ressources. Si vos calculs effectuent des lectures ou des écritures sur le disque, ou si vous faites des appels à un serveur, je vous suggère de réorganiser votre code pour que vous puissiez peindre tous les appels dans le fil AWT. De même, si vous réalisez que vos calculs prennent trop de temps à se terminer et que votre interface graphique semble léthargique, il serait prudent de les éliminer.

Questions connexes