~ / TIS3 / AL / tps / 5-notification /

Tâches longues et interactivité avec Java/Swing

© 2013 – 2021 Renaud Blanch

Le but de ce TD est d'aborder la question des tâches longues dans les applications interactives. Celles-ci nécessitent en effet d'utiliser une programmation multi-fils d'exécution si l'on veut que l'application reste interactive pendant l'exécution de la tâche longue. Il s'agit donc de réaliser un gestionnaire de téléchargement qui permettra aux utilisateurs de lancer, mettre en pause, annuler plusieurs téléchargements simultanément.

Questions

Récupérez l'archive du noyau fonctionnel et décompressez-la. Le noyau fonctionnel permet de télécharger les fichiers dont les URLs sont passées sur la ligne de commande. Lisez et comprenez le code de la classe downloader.fc.Downloader ainsi que la manière dont la classe downloader.fc.Test l'utilise.

Pour tester ce code, vous pouvez l'exécuter (Run > Run Project), mais il ne fera rien si on n'indique pas quelle URL télécharger au programme en lui passant via un argument de la ligne de commande. Pour cela, ouvrir la fenêtre de configuration du projet (Run > Set Project Configuration > Customize…) et, dans l'onglet Run, indiquez une URL dans le champs Arguments: (par exemple http://iihm.imag.fr/index.html).

Créez un classe downloader.ui.Main qui ouvre un fenêtre principale, lance un téléchargement en tâche de fond. Pour cela, remarquez que la classe downloader.fc.Downloader est une spécialisation de SwingWorker, et que celle-ci propose une méthode pour lancer son action (codée dans doInBackground) dans un fil d'exécution (thread) distinct de celui de l'appel à cette fonction : SwingWorker.execute.

Pour représenter un téléchargement dans l'interface utilisateur, créez une classe downloader.ui.Download qui aura pour fonction de gérer l'affichage d'un téléchargement (géré dans le noyau par une instance de downloader.fc.Downloader). Pour l'instant votre downloader.ui.Download sera juste une specialisation d'une barre de progression. Pour qu'elle montre la progression du téléchargement, elle doit s'abonner au downloader.fc.Downloader, qui propose une méthode addPropertyChangeListener. Votre classe doit donc implémenter l'interface PropertyChangeListener pour s'abonner à downloader.fc.Downloader. Lorsque la propriété progress change, elle pourra ainsi mettre à jour la valeur de la barre de progression (setValue et setString).

Faites en sorte de pouvoir ajouter plusieurs téléchargement à votre fenêtre, et que les Download s'empilent verticalement en haut de la fenêtre, et que leur largeur occupe tout l'espace disponible. Pour cela, utilisez le gestionnaire de géométrie downloader.ui.StackLayout fourni.

Ajoutez également en bas de la fenêtre principale un champs texte et un bouton qui permettent à l'utilisateur d'entrer une URL et de lancer son téléchargement.

À la fin de cette question, votre application pourra ressembler à cette capture :

exemple d'interface

Améliorez la présentation des téléchargements en affichant avec chaque barre de défilement l'URL du fichier téléchargé et un bouton permettant de supprimer ce téléchargement.

Ajoutez également un bouton permettant alternativement de mettre un téléchargement en pause et de le reprendre. Pour cela, ajouter utilisez les méthodes play et pause de la classe downloader.fc.Downloader.

Le résultat final pourra ressembler à l'image suivante: interface finale

mise à jour : 12 avril 2021