Bonjour,

Je vous propose un nouvel élément à utiliser : ProgressMonitor : Un agent de traitements asynchrones pour JavaFX

En deux mots...



Voici donc un autre composant JavaFX, qui, contrairement au précédent (la boîte de dialogue modal), permet de suivre les progrès d'une tâche longue sans bloquer l'application.



Les évolutions Java des dernières années ont produit plusieurs "solutions" génériques à cette fin : Future, Worker, Task ou Service, Reactive Programming, etc. Tout en restant assez proche des bases de ces idées (bases probablement aussi anciennes que les premiers pas de l'informatique multi-tâche), le composant présenté ici s'en distingue sur deux aspects :



1. Il n'est pas générique : il se présente de prime abord comme un objet graphique dans la javafx.scene, construit comme une extension d'AnchorPane, comportant quelques champs d'affichage read-only (type Label), un visualiseur d'évolution quantitative (type ProgressIndicator) et un unique bouton multifonction (type Button) ;

2. Il est simple à comprendre (et donc à modifier, si besoin), ses rouages internes étant entièrement accessibles et n'utilisant que des outils classiques et bien connus.





La librairie ProgressMonitor est accompagnée ici d'une "application témoin", TestMonitor, qui permet de voir quelques utilisations concrètes de la Popup. Trois "missions" servent d'exemples :



1. Lancé via le bouton "Try download...", un téléchargement en http depuis le WEB, qui se nourrit de deux paramètres : l'URL source (à entrer préalablement dans le premier champ tout au-dessus) et un répertoire local de destination à saisir via un DirectoryChooser. Le chargement lui-même est défini/implémenté dans la méthode "executeWebDownload()" de la classe ProgressWorkerImpl et est, pour l'essentiel, super classique ;



2. Lancée via le bouton "Load verified...", la même mission, mais complétée pour calculer à la volée une signature Sha-1 qui est en finale comparée à la signature publiée (troisième paramètre dans ce cas, à copier dans la zone sous les boutons). L'intérêt de cette version est d'exploiter, si les deux signatures sont différentes, la possibilité de bloquer temporairement le Moniteur pour déclencher une autre Popup de notification qui permet de demander à l'utilisateur s'il souhaite ou non conserver le fichier téléchargé. S'il répond (vite assez) "Keep", le fichier est gardé ; dans les autres cas (click sur "Remove", ou attente trop longue), il est supprimé du disque. L'un ou l'autre de ces événements libère le Moniteur ;



3. Lancé via le bouton "Try counting...", un scan d'un répertoire calculant le nombre de ses sous-répertoires, le nombre de tous les fichiers ordinaires et la somme de leurs tailles en octets (résultat facile à contrôler sur Windows via les Propriétés du répertoire source). Cette mission permet de montrer l'insertion d'une fonction récursive dans la mission ; elle requiert un seul paramètre, le chemin complet vers le répertoire à scaner (dans le champ du dessus).







Ce release.



On trouvera ici quatre fichiers :



1. dist.zip

qui contient tout ce qu'il faut pour exécuter la maquette. Il suffit d'extraire le tout dans un répertoire et d'exécuter TestMonitor.jar (un double-click sous Windows, si une jvm 8 est installée).

Dans le sous-répertoire "lib" se trouve bien entendu le binaire ProgressMonitor.jar ; il suffit d’inclure ce jar dans un projet JavaFX pour pouvoir exploiter la Popup.



2. Popup-src.zip

qui contient les sources de ProgressMonitor, réparties en deux packages : "monitorPopupPKG", qui contient la définition de la Popup, et "monitorRunnerPKG", qui contient le ProgressPilot, le ProgressWorker abstrait, et deux Enum, les Actions et les States ;



3. Test-src.zip

qui contient les sources de la maquette d'Application, TestMonitor, réparties elles aussi en deux packages : "testPopupMainPKG", qui contient le Main, le fxml, le css et le Controler, et "testPopupWorkerPKG" qui contient la classe concrète qui implémente le ProgressWorker : ProgressWorkerImpl ;



4. Vade Mecum.pdf

un document de présentation plus complet, avec quelques copies d'écran.



Qu'en pensez-vous ?