IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Update JProgressBar pendant un téléchargement


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Par défaut Update JProgressBar pendant un téléchargement
    Bonjour,
    Cela fait maintenant plusieurs heures que je bloque sur un problème concernant la mise à jour de l'affichage de ma JProgressBar en même temps que le téléchargment d'un fichier.

    Si j'utilise "progressBar.update(progressBar.getGraphics());" cela fonctionne bien mais ça ralenti fortement le programme. De plus, l'affichage de la barre scintille.

    En bref, mon problème est fortement similaire à ce post: http://www.developpez.net/forums/d11...-reutilisable/

    Cependant, après avoir essayer SwingWorker et SwingUtility.invokeLater dans tous les sens et après avoir essayé d'utiliser les threads comme indiqué dans cet exemple (ftp://ftp-developpez.com/java/faq/gu...Progress2.java), je n'arrive toujours pas à mettre à jour l'affichage de la barre en même temps que le téléchargement.


    Quelques détails sur le code utilisé pour le téléchargement:

    Tout d'abord j'utilise HttpClient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    [...]
    HttpGet httpget = new HttpGet("url");
    try 
    {
        HttpResponse response = httpclient.execute(httpget);
     
        nbBytesToTransfer = response.getEntity().getContentLength();
        response.setEntity(new CountingHttpEntity(
    						response.getEntity(), new MyProgressListener()));
        byte[] data = EntityUtils.toByteArray(response.getEntity());
    }
    [...]
    Dans ce code, la classe "new CountingHttpEntity(HttpEntity, ProgressListener)" est une classe qui me permet de compter le nombre d'octets téléchargés progressivement.


    Ensuite "MyProgressListener" me permet d'afficher le nombre d'octets téléchargés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MyProgressListener implements CountingHttpEntity.ProgressListener 
    {
    	public void transferred(final long num) 
    	{  	
                    final int percentProgress = (int)((num*100)/nbBytesToTransfer);
                    //progressBar.setProgress(percentProgress);
    		//progressBar.update(progressBar.getGraphics());
    		System.out.println(num + " bytes transferred...");   
    	}
    }
    Jusque là tout fonctionne, la console m'affiche bien le nombre d'octets actuellement téléchargés.

    Maintenant le problème est la mise à jour de la barre de progression en même temps que le téléchargement s'effectue.

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    englobe de progressBar.setProgress (et seulement cette instruction) dans ton transferred dans un SwingUtilities.invokeLater.

    Et accessoirement pourrais tu faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.printl(SwingUtilities.isEventDispatchThread());
    dans cette même méthode, afin de s'assurer qu'elle ne se déroule pas dans l'EDT?

  3. #3
    Membre averti
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Par défaut
    Le barre reste vide durant l'opération. Il doit me manquer un ou quelques éléments clé pour faire fonctionner cette JProgressBar. Elle ne se remplie qu'une fois le téléchargement finis.

    Voici la méthode après modification:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class MyProgressListener_ implements CountingHttpEntity.ProgressListener 
    {
    	public void transferred(long num) 
    	{  	
    		System.out.println(SwingUtilities.isEventDispatchThread());	
    		final int percentProgress = (int)((num*100)/nbBytesToTransfer);
     
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run()
    			{
    				progress.setProgress(percentProgress);
    			}
    		});
    		System.out.println(num + " bytes transferred ..."); 
    	}
    }
    System.out.println(SwingUtilities.isEventDispatchThread()); me retourne "true" . Ce qui signifie que la méthode s’exécute dans l'EDT...

    Je suppose que le problème vient de là.



    Edit: Effectivement le problème venait de là. Je fais donc maintenant appel à la méthode de téléchargement dans un SwingWorker.

    Merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ajouter un processus pendant le téléchargement d'un fichier
    Par Googler dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 16/08/2011, 17h55
  2. Image d'attente pendant la téléchargement.
    Par truthlife dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/02/2011, 20h01
  3. Comment cacher le div de mon formulaire pendant le téléchargement ?
    Par Alexandrebox dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/06/2009, 15h02
  4. Réponses: 1
    Dernier message: 12/07/2007, 17h21
  5. Faire patienter pendant le téléchargement
    Par komoku dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/12/2006, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo