[JAVA] Progress bar pour un téléchargement

Résolu
Knux14 -  
Knux14 Messages postés 19 Statut Membre -
Bonjour,

Je cherche quelqu'un qui pourrait m'expliquer comment ajouter une barre de progression au téléchargement de fichier dans mon logiciel. Le problème est que le logiciel attend que le téléchargement soit fini pour continuer donc je ne peut pas changer comme cela. Si quelqu'un aurait du temps à m'accorder, voici les sources du logiciel https://dl.dropbox.com/u/7560728/mvd/src.zip. J'ai cherché sur google, mais aucun n'explique correctement :s Le logiciel est fait grâce à Matisse (Netbeans)

Merci d'avance.

1 réponse

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Pour la documentation voir : How to Use Progress Bars

    En supposant que ta méthode Download.dl était correct, en voici une modification possible, le composant JProgressBar devant bien sûr être préalablement initialisé et ajouté quelque part dans ton interface graphique :

    public static void dl(String adresse, File dest, final JProgressBar bar)
    {    
        FileOutputStream fos = null;
        BufferedReader reader = null;
        
        bar.setValue(0);
        bar.setIndeterminate(false);
        
        try
        {
            // Création de la connexion
            
            URL url = new URL(adresse);
            
            URLConnection conn = url.openConnection();
            System.out.println(adresse);
            
            String FileType = conn.getContentType();
            System.out.println("FileType : " + FileType);
            
            int fileLength = conn.getContentLength();
     
            if (fileLength == -1)
                throw new IOException("Fichier non valide.");
            else
                bar.setMaximum(fileLength);
            
            // Lecture de la réponse
            
            InputStream in = conn.getInputStream();
            reader= new BufferedReader(new InputStreamReader(in));
            
            if (dest == null)
            {
                String fileName = url.getFile();
                fileName = fileName.substring(fileName.lastIndexOf('/') + 1);
                dest = new File(fileName);
            }
            
            fos  = new FileOutputStream(dest);
            
            byte[] buff = new byte[1024];
            
            int n;
            while ((n=in.read(buff)) !=-1)
            {
                fos.write(buff, 0, n);
                bar.setValue(bar.getValue()+n);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally 
        {
            try
            {
                fos.flush();
                fos.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            
            try
            {
                reader.close();
            } 
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    2
    1. Knux14 Messages postés 19 Statut Membre 1
       
      Merci mais sa ne marche pas,
      J'ai essayé de faire un thread, sa reviens au même que sans...
      Quand je lance le téléchargement, cela "bloque" tout le programme pour télécharger, rien d'autre ne se passe. une fois fini tout est de nouveau fonctionnel, et la progressbar s'est remplie :s

      EDIT: J'ai déjà regardé la doc mais j'ai rien compris :s
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      Je n'avais visiblement pas bien compris ton problème, qui est plus sur le fait que ça bloque, que sur la barre de progression. En fait je pense que le temps de connexion est trop long, et il y a tout une partie où la barre de progression reste à 0, alors qu'une fois le téléchargement commencé la barre passe rapidement à 100% si la taille du fichier téléchargé n'est pas très importante.

      Pour le thread c'est une tout autre affaire, mais en le plaçant correctement ça devrait aller, par contre il te faudra autant de barre de progression que de threads conccurents ce qui est un peu plus compliqué à gérer...

      Exemple :

      public static void dl(final String adresse, final File dest, final JProgressBar bar)
      {
          bar.setIndeterminate(true);
          
          new Thread()
          {
              @Override
              public void run()
              {
                  FileOutputStream fos = null;
                  BufferedReader reader = null;
                  
                  try
                  {
                      // Création de la connexion
                      URL url = new URL(adresse);
                      
                      URLConnection conn = url.openConnection();
                      System.out.println(adresse);
                      
                      String FileType = conn.getContentType();
                      System.out.println("FileType : " + FileType);
                      
                      int fileLength = conn.getContentLength();
               
                      if (fileLength == -1)
                          throw new IOException("Fichier non valide.");
                      else
                          bar.setMaximum(fileLength);
                      
                      // Lecture de la réponse
                      
                      InputStream in = conn.getInputStream();
                      reader= new BufferedReader(new InputStreamReader(in));
                      
                      if (dest == null)
                      {
                          String fileName = url.getFile();
                          fileName = fileName.substring(fileName.lastIndexOf('/') + 1);
                          fos = new FileOutputStream(new File(fileName));
                      }
                      else
                          fos  = new FileOutputStream(dest);
                      
                      byte[] buff = new byte[1024];
      
                      bar.setValue(0);
                      bar.setIndeterminate(false);
                      
                      int n;
                      while ((n=in.read(buff)) !=-1)
                      {
                          fos.write(buff, 0, n);
                          bar.setValue(bar.getValue()+n);
                      }
                  }
                  catch (Exception e)
                  {
                      e.printStackTrace();
                  }
                  finally
                  {
                      try
                      {
                          fos.flush();
                          fos.close();
                      }
                      catch (IOException e)
                      {
                          e.printStackTrace();
                      }
                      
                      try
                      {
                          reader.close();
                      }
                      catch (Exception e)
                      {
                          e.printStackTrace();
                      }
                  }
              }
          }.start();
      }
      0
    3. Knux14 Messages postés 19 Statut Membre 1
       
      OMFG Ton code marche. Je t'aime :D Je te met dans les credits, tu m'a tellement aidé :D
      0