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

Résolu/Fermé
Knux14 - 30 juil. 2012 à 16:54
Knux14 Messages postés 16 Date d'inscription lundi 30 juillet 2012 Statut Membre Dernière intervention 1 janvier 2014 - 30 juil. 2012 à 21:41
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.

A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
30 juil. 2012 à 17:21
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
Knux14 Messages postés 16 Date d'inscription lundi 30 juillet 2012 Statut Membre Dernière intervention 1 janvier 2014 1
Modifié par Knux14 le 30/07/2012 à 21:14
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
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
30 juil. 2012 à 21:32
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
Knux14 Messages postés 16 Date d'inscription lundi 30 juillet 2012 Statut Membre Dernière intervention 1 janvier 2014 1
30 juil. 2012 à 21:41
OMFG Ton code marche. Je t'aime :D Je te met dans les credits, tu m'a tellement aidé :D
0