JProgressBar dans une boucle While

peoplehard Messages postés 26 Date d'inscription samedi 26 avril 2003 Statut Membre Dernière intervention 26 novembre 2008 - 15 juil. 2008 à 20:44
tlaloctzin Messages postés 136 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 12 septembre 2013 - 18 juil. 2008 à 13:23
Bonjour,
Mon ProgressBar reste statique alors que mon textarea varie correctement.

        int l = in.read(buff);
        while(l>0)
        {
        WritenFile.write(buff, 0, l);
        downloaded += l;
        progress.setValue(downloaded);
        addTextField.setText("Téléchargement en cours de " + FileName + " (" + downloaded + "/"+ max + ")");
        l = in.read(buff);
        }

Merci d'avance

8 réponses

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
16 juil. 2008 à 09:24
Bonjour.
Quand tu utilises une progressbar, il faut utiliser un thread qui va faire ton traitement "long", le thread principal doit rester disponible car c'est lui qui met à jour les composants graphiques (notamment ta progressbar).

Cdt
0
peoplehard Messages postés 26 Date d'inscription samedi 26 avril 2003 Statut Membre Dernière intervention 26 novembre 2008
16 juil. 2008 à 10:32
Merci pour l'info.
J'ai réussi à faire vivre la JProgressBar. Mais le problème c'est que ça marche bien quand je n'envoie qu'un lien.

Mais quand je demande au programme de récupérer plusieurs liens dans un textarea via:
                StringTokenizer tokenizer = new StringTokenizer(addTextField.getText(), "\n");
                while (tokenizer.hasMoreTokens()){
                URL verifiedUrl = verifyUrl(tokenizer.nextToken());
                if (verifiedUrl != null) {
                Download(verifiedUrl, reg.getText());

Avec le Thread, ça n'exécute que le dernier lien, alors que sans le Thread, chaque lien est exécuté un par un.
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
16 juil. 2008 à 11:40
Quel action fait tu dans ton thread ?
0
tlaloctzin Messages postés 136 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 12 septembre 2013 3
16 juil. 2008 à 12:43
Perso (je sait pas si c'est le top ) j'aurais fais une nouvelle classe

class Progress extends Thread implements Runnable{

JProgressBar prog ;

public Progress( JProgressBar bar){

this.prog = bar ;
}

public void run(){
   synchronized( this ) {
      //ici ton while
      bar.setValue(....);
      bar.setString(...);

}
}
}

Et tu l'instancie a partir de ton autre classe ( celle avec l'interface graphique )

Thread traitemetURL = new Progress(jProgressBar1);
traitementURL.start();

Voila , ou un truc du genre

Il vaut mieu être riche et en bonne santé que pauvre et malade .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
peoplehard Messages postés 26 Date d'inscription samedi 26 avril 2003 Statut Membre Dernière intervention 26 novembre 2008
16 juil. 2008 à 13:57
Merci pour vos réponses voila le thread:

    public class threadTest extends Thread
    {
    public void run() {
        try {
        downloaded = 0;
        progress.setMinimum(0);
        int max = 100;
        URLConnection uc = url.openConnection();
        String FileType = uc.getContentType();
        int FileLenght = uc.getContentLength();
        if (FileLenght == -1) {
            throw new IOException("Fichier non valide.");
        } else {
            max = FileLenght;
        }
        progress.setMaximum(max);
        progress.setValue(0);
        progress.setStringPainted(true);
        InputStream in = uc.getInputStream();
        String FileName = url.getFile();
        FileName = FileName.substring(FileName.lastIndexOf('/') + 1);
        FileOutputStream WritenFile = new FileOutputStream(saveDir + File.separator + FileName);//new FileOutputStream("C:/test.pdf");
        addTextField.setText("Téléchargement en cours de " + FileName);
        running = true;
        byte[]buff = new byte[1024];
        int l = in.read(buff);
        while(l>0)
        {
        WritenFile.write(buff, 0, l);
        downloaded += l;
        progress.setValue(downloaded);
        addTextField.setText("Téléchargement en cours de " + FileName + " (" + downloaded + "/"+ max + ")");
        l = in.read(buff);
        }
        running = false;
        progress.setValue(max);
        WritenFile.flush();
        WritenFile.close();
        addTextField.setText("Téléchargement de " + FileName + " exécuté avec succès");
        } catch (Exception e) {
           
        }
    }
}

Le thread est exécuté par (qui est lui-même exécuté par une boucle [ while (tokenizer.hasMoreTokens()){ ]):
    public void Download(URL url, String saveDir) throws IOException, InterruptedException {
    this.url = url;
    this.saveDir = saveDir;
    size = -1;
    downloaded = 0;
    status = DOWNLOADING;
    //download();
    Thread thread = new threadTest();
    thread.start();
    //addTextField.setText("" + url);
    }
0
tlaloctzin Messages postés 136 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 12 septembre 2013 3
16 juil. 2008 à 14:53
Et ca fonctionne ou po ?

Il vaut mieu être riche et en bonne santé que pauvre et malade .
0
peoplehard Messages postés 26 Date d'inscription samedi 26 avril 2003 Statut Membre Dernière intervention 26 novembre 2008
16 juil. 2008 à 15:17
Quand je met plusieurs liens, ça ne fonctionne pas, il télécharge juste le dernier lien sur le disque dur.
Par contre si je rentre mes liens exprès pour que ça déclare une erreur comme:
http://..
Espace vide
http://

Tout suite après que le premier lien est lancé, j'ai une popup (grâce à JOptionPane.showMessageDialog(this, "URL invalide", "Erreur", JOptionPane.ERROR_MESSAGE); en raison de l'espace vide).
Si j'attends tranquillement que le premier téléchargement est fini, puis que je ferme cette popup, le deuxième démarre sans problème.

                StringTokenizer tokenizer = new StringTokenizer(addTextField.getText(), "\n");
                while (tokenizer.hasMoreTokens()){
                URL verifiedUrl = verifyUrl(tokenizer.nextToken());
                if (verifiedUrl != null) {
                Download(verifiedUrl, reg.getText());

Peut être qu'en demandant à boucle d'attendre la fin de l'exécution de Download(verifiedUrl, reg.getText()), ça pourrait marcher mais je ne sais pas comment faire :(
0
tlaloctzin Messages postés 136 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 12 septembre 2013 3
18 juil. 2008 à 13:23
Si tu réinitioalise le thread a chaque lien c est normal  , tu as mal imbriqué tes threads , en plus tu risque de charger ta mémoire a gogo
Il vaut mieu être riche et en bonne santé que pauvre et malade .
0
Rejoignez-nous