juin
2006
Décidément les forums de developpez.com sont une source de connaissance inépuisable… Même dans un message qui peut sembler anodin à première vue, on peut apprendre des petits trucs bien sympathique voir très enrichissant…
En lisant les réponses d’une question concernant le fonctionnement de la méthode paint() des composants AWT/Swing, je suis tombé sur une réponse très instructive de Romain Guy alias Gfx :
On peut aussi faire un RepaintManager qui detecte si des operations ont lieu en dehors de l’EDT (cf http://www.clientjava.com/blog/2004/08/20/1093059428000.html)
En effet, comme chaque développeur Swing le sait (ou devrait le savoir), toutes modifications sur l’interface graphique doit être exécutées dans l’EDT afin d’éviter des problèmes de synchronisation et d’accès simultanée (voir l’article Threads and Swing
pour plus de détail)…
Mais c’est plus complexe qu’il n’y parait, puisqu’il faut également éviter d’y effectuer des traitements long, sous peine de se retrouver avec une interface bloquée…
Ainsi, il faut à la fois exécuter les traitements dans un thread différent, et mettre à jour l’interface graphique dans l’EDT : on utilise pour cela les méthodes invokeLater() et invokeAndWait() de la classe SwingUtilities. Malheureusement, le risque d’erreur ou d’oubli est assez grand, et difficile à repérer puisque les erreurs sont imprévisible pour la plupart (elles dépendent de l’état des différents threads).
En utilisant son propre RepaintManager, il est ainsi possible de vérifier si les mises à jours de l’affichage sont bien effectué dans l’EDT et non pas depuis d’autres threads, et d’afficher le stacktrace lorsque ce n’est pas le cas…
Pour plus de détail, je vous invite à consulter les divers articles sur le sujet (en anglais, avec le code source) :
- Easily Find Swing Threading Issues – Part I
- Easily Find Swing Threading Issues – Part II
- Easily Find Swing Threading Issues – Part III
Bonne lecture…
1 Commentaire + Ajouter un commentaire
Tutoriels
Discussions
- jre 1.5, tomcat 6.0 et multi processeurs
- Difference de performances Unix/Windows d'un programme?
- Classes, méthodes private
- Recuperation du nom des parametres
- [ fuite ] memoire
- L'apparition du mot-clé const est-il prévu dans une version à venir du JDK?
- Définition exacte de @Override
- [REFLEXION] Connaitre toutes les classes qui implémentent une interface
- Possibilité d'accéder au type générique en runtime
Il faut bien avouer que la présence réguliere de Gfx sur le forum java et interfaces graphiques java c’est que du bonheur !