février
2007
Cette semaine aura été consacré à la classe SwingWorker de Java 6 : vous n’aurez sans doute pas manqué l’article de Romain Vimont concernant des interfaces graphiques plus performantes avec SwingWorker, mais peut-être que vous êtes passé à coté d’un sujet sur le forum qui a fini en mini-débat…
Pour info/rappel, SwingWorker permet d’exécuter un traitement dans une tâche de fond et ainsi de laisser l’EDT faire son travail, c’est à dire de gérer l’affichage des composants et les évènements graphiques.
Du coup, j’ai codé une petite application simplement destiné à démontrer l’intérêt de SwingWorker :
Cette application comporte principalement trois éléments :
- Une icône animé (une JLabel avec un simple GIF).
- Une barre de menu, dont chaque item se contente de modifier d’afficher un libellé sous l’animation.
- Deux boutons destinés à simuler des traitements longs, simulés ici par une pause de 10 secondes. Les boutons devant être désactivés pendant toute la durée de leurs traitements.
Cette application avait pour but de démontrer l’intérêt de SwingWorker par rapport à une solution utilisant la méthode update() qui se contenait de forcer la mise à jours de l’affichage avant le traitement (pour plus de détail je vous invite à consulter le sujet).
En effet si update() force bien la mise à jour de l’interface, cette dernière se bloque et reste indisponible pendant toute la durée du traitement car le traitement long est exécuté dans l’EDT… alors que Swingworker permet de résoudre ce « problème ».
Vous pouvez tester cela par vous même en cliquant sur le bouton suivant afin de lancer l’application Java Web Start de démo :
Alors convaincu ?
5 Commentaires + Ajouter un commentaire
Tutoriels
Discussions
- Classes, méthodes private
- [ fuite ] memoire
- jre 1.5, tomcat 6.0 et multi processeurs
- [REFLEXION] Connaitre toutes les classes qui implémentent une interface
- Recuperation du nom des parametres
- Définition exacte de @Override
- L'apparition du mot-clé const est-il prévu dans une version à venir du JDK?
- Possibilité d'accéder au type générique en runtime
- Difference de performances Unix/Windows d'un programme?
Merci encore, c’est un bon complément à l’article de Romain Vimont notamment pour montrer de SwingWorker
Excellent ! Merci !
Ouais, l’exemple parle de lui même, pas mal
Oups !
Voilà ce qui arrive lorsqu’on fait une toute petite modif sans vérifier avant de poster sur le blog
Ca devrait fonctionner maintenant !
Merci
a++
Personnellement je n’arrive pas à lancer ton application…
Aussi bien avec java 6 qu’avec java 5 j’obtiens l’exception suivante :
java.security.AccessControlException: access denied (java.lang.RuntimePermission setDefaultUncaughtExceptionHandler)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
at java.security.AccessController.checkPermission(AccessController.java:427)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.Thread.setDefaultUncaughtExceptionHandler(Thread.java:1721)
at com.developpez.adiguba.demo.DemoSwingWorker.main(DemoSwingWorker.java:146)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.sun.javaws.Launcher.executeApplication(Launcher.java:1161)
at com.sun.javaws.Launcher.executeMainClass(Launcher.java:1108)
at com.sun.javaws.Launcher.continueLaunch(Launcher.java:951)
at com.sun.javaws.Launcher.handleApplicationDesc(Launcher.java:515)
at com.sun.javaws.Launcher.handleLaunchFile(Launcher.java:218)
at com.sun.javaws.Launcher.run(Launcher.java:165)
at java.lang.Thread.run(Thread.java:595)