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 :

[JProgressBar] Suivre l'avancement d'une copie


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 64
    Points
    64
    Par défaut [JProgressBar] Suivre l'avancement d'une copie
    Hey,
    j'ai une classe qui doit copier des gros répertoires. Je dev une autre classe afin de suivre cette copie justement, pour que l'user soit au courant de ce qu'il se passe.

    La classe qui copie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Thread toto = new Thread(new FrameAvancementCopie(repSrc,repDest));
    toto.start();
    FileUtils.copyDirectory(repSrc, repDest);
    La classe qui regarde cette copie (FrameAvancementCopie) :
    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
    17
    18
    19
    20
     
        public void run() {
            while(isActif()) {
                // taille du rep source
                long tailleRepSrc = FileUtils.sizeOfDirectory(repSrc);
                // taille du rep dest
                long tailleRepDest = FileUtils.sizeOfDirectory(repDest);
                // pourcentage de copie
                float percent = tailleRepDest / tailleRepSrc * 100;
                // on affiche les infos
                System.out.println("Toto : "+percent);
                System.out.println("Src : "+tailleRepSrc);
                System.out.println("Dest : "+tailleRepDest);
                System.out.println("******************************");
                // si la copie est terminé, on arrête
                if(percent == 100.0) {
                    setActif(false);
                }
            }
        }
    Mon problème est que malgré que tailleRepDest se mette bien à jour, percent ne change pas. Il passe de 0 à 100 d'un coup et je ne comprends pas pourquoi :/

    La trace de copie (je ne met que la fin) :
    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
    17
    18
    19
    20
    21
    22
    23
     
    Toto : 0.0
    Src : 40596576
    Dest : 40377895
    ******************************
    Toto : 0.0
    Src : 40596576
    Dest : 40377895
    ******************************
    Toto : 0.0
    Src : 40596576
    Dest : 40377895
    ******************************
    Toto : 0.0
    Src : 40596576
    Dest : 40377895
    ******************************
    Toto : 100.0
    Src : 40596576
    Dest : 40596576
    ******************************
    40596576
    BUILD SUCCESSFUL (total time: 8 seconds)
    Qqun aurait une idée du pourquoi ?
    De même si une meilleure idée pour suivre l'avancement de la copie !

    Merci

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu fais une division entre deux types long :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float percent = tailleRepDest / tailleRepSrc * 100;
    Et logiquement tailleRepDest est inférieur à tailleRepSrc pendant tout le traitement. Et comme le résultat de la division entre deux nombres entiers est un nombres entier, tu obtiens forcément zéro !


    Il faut que tu cast en float pour conserver les décimales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float percent = (float)tailleRepDest / (float)tailleRepSrc * 100.0f;
    a++

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 89
    Points
    89
    Par défaut
    salut

    avec des parenthèses peut-etre?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float percent = (tailleRepDest / tailleRepSrc) * 100;

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par adiGuba
    Salut,


    Tu fais une division entre deux types long :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float percent = tailleRepDest / tailleRepSrc * 100;
    Et logiquement tailleRepDest est inférieur à tailleRepSrc pendant tout le traitement. Et comme le résultat de la division entre deux nombres entiers est un nombres entier, tu obtiens forcément zéro !


    Il faut que tu cast en float pour conserver les décimales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float percent = (float)tailleRepDest / (float)tailleRepSrc * 100.0f;
    a++
    Ptain je suis con, evidement

    Merci

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    Nouveau problème en fait
    Maintenant je cherche à afficher ce résultat dans un JProgressBar.
    Je rajoute donc dans le while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jProgressBar1.setValue((int)percent);
    Mais ça me lève une exception...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Exception in thread "Thread-2" java.lang.NullPointerException
            at jpaq.FrameAvancementCopie.run(FrameAvancementCopie.java:76)
            at java.lang.Thread.run(Thread.java:595)
    qui surligne cette ligne !

    Une idée ?

  6. #6
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    Cela veut dire que soit percent, soit jprogressbar1 est égal à null. Vérifie que tu as bien construit explicitement ta ProgressBar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    progressbar1 = new JProgressBar();
    "Et tu comprendras pourquoi mon nom est l'Eternel, quand sur toi s'abattra la colère du Tout-puissant."

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    JProgessBar est bien instancié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jProgressBar1 = new javax.swing.JProgressBar();
    Et percent de même.
    Si je teste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jProgressBar1.setValue(12);
    ça fait pareil.

  8. #8
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    Donne-moi le code complet avec JProgressBar.
    "Et tu comprendras pourquoi mon nom est l'Eternel, quand sur toi s'abattra la colère du Tout-puissant."

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    Voilà la classe qui s'occupe de ça :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    import java.io.File;
    import org.apache.commons.io.FileUtils;
     
    public class FrameAvancementCopie extends javax.swing.JFrame implements Runnable {
     
        private File repSrc;
        private File repDest;
        float percent = 0;
        private boolean actif = true;
     
        /** Creates new form FrameAvancementCopie */
        public FrameAvancementCopie(File repSrc, File repDest) {
            this.setVisible(true);
            this.repSrc = repSrc;
            this.repDest = repDest;
            initComponents();
        }
     
        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
        private void initComponents() {
            jProgressBar1 = new javax.swing.JProgressBar();
     
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setTitle("Poueeeet");
            setAlwaysOnTop(true);
            setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR));
            setForeground(java.awt.Color.white);
            jProgressBar1.setBackground(new java.awt.Color(255, 255, 255));
            jProgressBar1.setValue(12);
     
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(jProgressBar1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(jProgressBar1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
            pack();
        }// </editor-fold>                        
     
        public boolean isActif() {
            return actif;
        }
     
        public void setActif(boolean actif) {
            this.actif = actif;
        }
     
        public void run() {
            while(isActif()) {
                // taille du rep source
                long tailleRepSrc = FileUtils.sizeOfDirectory(repSrc);
                // taille du rep dest
                long tailleRepDest = FileUtils.sizeOfDirectory(repDest);
                // pourcentage de copie
                percent = (float)tailleRepDest / (float)tailleRepSrc * 100;
                // on affiche les infos
                System.out.println("Toto : "+percent);
                System.out.println("Src : "+tailleRepSrc);
                System.out.println("Dest : "+tailleRepDest);
                System.out.println("******************************");
                jProgressBar1.setValue((int)percent);
                // si la copie est terminé, on arrête
                if(percent == 100) {
                    setActif(false);
                }
            }
        }
     
        // Variables declaration - do not modify                     
        private javax.swing.JProgressBar jProgressBar1;
        // End of variables declaration                   
    }
    qui est lancé à partir de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Thread toto = new Thread(new FrameAvancementCopie(repSrc,repDest));
    toto.start();
    FileUtils.copyDirectory(repSrc, repDest);
    Voilà

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    Je me suis remi sur ce problème ce matin et cela n'avance toujours pas (pour une jProgressBar, c'est quand même le combe ! )
    Donc je n'ai plus d'exception de levé mais je ne vois pas la jProgressBar se modifier : elle apparaît juste quand la copie est terminé :/

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    package test;
     
    import java.io.File;
    import org.apache.commons.io.FileUtils;
     
    public class FrameAvancementCopie extends javax.swing.JFrame implements Runnable {
     
        private File repSrc;
        private File repDest;
        float percent = 0;
        public boolean actif = true;
     
        /** Creates new form FrameAvancementCopie */
        public FrameAvancementCopie(File repSrc, File repDest) {
            this.repSrc = repSrc;
            this.repDest = repDest;
            initComponents();
        }
     
        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
        private void initComponents() {
            jProgressBar1 = new javax.swing.JProgressBar();
     
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setTitle("Poueeeet");
            setAlwaysOnTop(true);
            setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR));
            setForeground(java.awt.Color.white);
            jProgressBar1.setBackground(new java.awt.Color(255, 255, 255));
            jProgressBar1.setValue(12);
     
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(jProgressBar1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(jProgressBar1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
            pack();
        }// </editor-fold>                        
     
        public boolean isActif() {
            return actif;
        }
     
        public void setActif(boolean actif) {
            this.actif = actif;
        }
     
        public void run() {
            this.setVisible(true);
            while(isActif()) {
                long tailleRepSrc = FileUtils.sizeOfDirectory(repSrc);
                long tailleRepDest = FileUtils.sizeOfDirectory(repDest);
                percent = (float)tailleRepDest / (float)tailleRepSrc * 100;
                System.out.println((int)percent+"%");
                jProgressBar1.setValue((int)percent);
                jProgressBar1.repaint();
                if(percent == 100) {
                    setActif(false);
                }
            }
        }
     
        // Variables declaration - do not modify                     
        private javax.swing.JProgressBar jProgressBar1;
        // End of variables declaration                   
    }
    appelé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    File src = new File(textSrc.getText());
            File dest = new File(textDest.getText());
            FrameAvancementCopie p = new FrameAvancementCopie(src, dest);
            Thread t = new Thread(p);
            t.start();
            try {
                FileUtils.copyDirectory(src,dest);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
    Help

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 79
    Points : 96
    Points
    96
    Par défaut
    ben la ne sais pas trop pourquoi cela ne marche pas mais peut etre que tu peux utiliser un ProgressMonitorInputStream ca peut peut etre te faciliter les choses.

    Ensuite question de curiosité : je vois partout dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.jdesktop.layout.GroupLayout
    tu n'aimes pas les import ?

  12. #12
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    C'est du code généré par NetBeans

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/03/2012, 13h13
  2. Etat d'avancement d'une copie
    Par Xavstarblues dans le forum Scripts/Batch
    Réponses: 52
    Dernier message: 15/07/2008, 14h55
  3. JProgressbar qui avance depuis une autre classe....
    Par Baptiste Wicht dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 02/02/2006, 20h04
  4. Copier et afficher une copie d'ecran
    Par Bobx dans le forum Langage
    Réponses: 6
    Dernier message: 02/08/2002, 22h20
  5. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

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