~ / INFO4 / IHM / tps / 2-downloader /
© 2013—2022 – 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.
Récupérez les sources du squelette de l'application.
% git clone https://gricad-gitlab.univ-grenoble-alpes.fr/blanch-ens/java-swing-downloader downloader % cd downloader downloader% git remote remove origin downloader% git remote add origin https://gricad-gitlab.univ-grenoble-alpes.fr/info4-iihm/2022-2023/XX/2-downloader # ou git@gricad-gitlab.univ-grenoble-alpes.fr:info4-iihm/2022-2023/XX/2-downloader.git si vous avez posé une clé ssh dur votre compte gitlab downloader% git push -u origin --all
Le noyau fonctionnel permet de télécharger les fichiers dont les URLs sont passées sur la ligne de commande. Par exemple :
downloader% ant jar downloader% java -cp build/jar/Downloader.jar downloader.fc.Test http://iihm.imag.fr/index.htmlOu, si vous n'avez pas ant:
% cd src downloader/src% javac downloader/fc/Test.java downloader/src% java downloader.fc.Test http://iihm.imag.fr/index.htmlLisez 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 (dans un Thread
dédié) et utilise une barre de progression pour donner un feedback à la progression du téléchargement.
Spécialisez pour cela une JProgressBar
dans une nouvelle classe downloader.ui.Download
qui prend en argument de son constructeur un downloader.fc.Downloader
et s'y abonne.
Pour cela, réalisez un PropertyChangeListener
qui met à jour la valeur de la barre de progression (setValue
et setString
lorsque la propriété progress
change.
Modifiez la classe downloader.fc.Downloader
pour en faire une spécialisation de SwingWorker
(lisez bien les exemples situés au début de la documentation, ainsi que le tutoriel Worker Threads and SwingWorker pour comprendre à quoi il sert).
Adaptez le reste de votre code à ce changement, et vérifiez que cela simplifie votre code.
Ajoutez à 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.
Pour gérer la liste des téléchargement, vous pouvez utiliser le gestionnaire de géométrie downloader.ui.StackLayout
fourni.
Voilà à quoi pourra ressembler votre interface utilisateur à ce stade :
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.
Pour cela modifiez votre classe downloader.ui.Download
pour qu'elle spécialise un JPanel
qui lui même contiendra les différents éléments d'interface propres à chaque téléchargement.
Ajoutez un bouton permettant alternativement de mettre un téléchargement en pause et de le reprendre.
Pour cela, ajouter des méthodes play
et pause
à la classe downloader.fc.Downloader
(on pourra à cette fin utiliser un Lock
).
Le résultat final pourra ressembler à l'image suivante :
mise à jour : 7 nov 2022