[SwingWorker] JProgressBar mise à jour une seule fois
Bonjour,
Dans mon programme, j'ai implémenté une fonction de fragmentation de fichiers qui peut prendre un certain temps d'exécution en fonction de la taille du fichier à fragmenter. J'ai donc voulu ajouter une ProgressBar pour indiquer l'avancement de la fragmentation, et mise à jour à partir du SwingWorker qui se charge du traitement en arrière plan.
Le problème c'est que ma ProgressBar est actualisé une seule fois durant une fragmentation de fichiers. Par exemple, vous voulez fragmenter un fichier en 4 morceaux, la ProgressBar indiquera 25% puis 100% une fois le traitement fini.
En affichant dans la console l'état du "PropertyChangeEvent", je n'ai qu'un seul "Progress" qui est remonté les autres sont tous à l'état de "State".
Je ne comprends pas pourquoi.
J'ajoute bien un écouteur sur ma ProgressBar dans le constructeur de mon SwingWorker :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
// Ecouteur sur la barre de progression
addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent pce) {
System.out.println("proper val : " + pce.getPropertyName());
if ("progress".equals(pce.getPropertyName())) {
// Mise à jour de la valeur de la barre de progression
IHM.barre.setValue((Integer) pce.getNewValue());
}
}
}); |
J'appelle ma fonction de fragmentation pour qu'elle s'exécute en arrière plan.
Code:
1 2 3 4 5 6 7 8 9 10
|
@Override
protected Void doInBackground() throws Exception {
System.out.println("Decoupage doInBackground");
setProgress(0);
fragmentation();
return null;
} |
Enfin voici ma fonction de fragmentation dans laquelle je tente de mettre à jour ma ProgressBar à chaque fragment de créé (setProgress)
Code:
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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
// Méthode qui se charge de fragmenter les fichiers
public void fragmentation () {
long start = System.currentTimeMillis();
String cheminDestinationFragment, nomFragment;
long tailleFichier, tailleFragment, bytesLus, bytesEcrits;
File fragmentCree;
double valBarreProgression;
int valStartProgress = 0;
// Parcours des fichiers à fragmenter
for (int i = 0; i < cheminFichiersADecouper.size(); i++) {
try {
// Compteur des données lues
bytesLus = 0;
// Ouverture d'un flux de données en "Lecture" sur le fichier à fragmenter
FileInputStream fis = new FileInputStream(cheminFichiersADecouper.elementAt(i));
DataInputStream dis = new DataInputStream(fis);
// Récupération de la taille du fichier à fragmenter
tailleFichier = fis.available();
System.out.println("taille fichier : " + tailleFichier);
// Taille des fragments à créer selon la saisie utilisateur
tailleFragment = tailleFichier/nbFragmentsDecoupe;
System.out.println("Taille Fragment : " + tailleFragment);
// Récupération de l'emplacement de création du fragment (même que le fichier source)
cheminDestinationFragment = getDestinationFragment(i);
System.out.println("Chemin fichier : " + cheminDestinationFragment);
valBarreProgression = (100 - valStartProgress) / nbFragmentsDecoupe;
System.out.println("VALBarreDépart : " + valBarreProgression);
for (int j = 0; j < nbFragmentsDecoupe; j++) {
nomFragment = getNomFragment(i);
//System.out.println("Nom fragment : " + nomFragment);
valStartProgress += valBarreProgression;
// Création du fragment généré
fragmentCree = new File(cheminDestinationFragment, nomFragment);
// Ouverture d'un flux de données en "Ecriture" sur le fragment généré
FileOutputStream fos = new FileOutputStream(fragmentCree);
DataOutputStream dos = new DataOutputStream(fos);
// Compteur des données écrites
bytesEcrits = 0;
while ((bytesEcrits < tailleFragment) && (bytesLus < tailleFichier)) {
// Fragmentation du fichier source
dos.writeByte(dis.readByte());
// Mise à jour des compteurs
bytesLus++;
bytesEcrits++;
}
dos.close();
// MAJ de la barre de progression
setProgress((int)valBarreProgression);
}
dis.close();
// Suppression du fichier source
File fichierSource = new File(cheminFichiersADecouper.elementAt(i));
fichierSource.delete();
} catch (FileNotFoundException e) {
System.out.println("FileNotFoundException : " + e.getMessage());
} catch (IOException e) {
System.out.println("IOException : " + e.getMessage());
}
}
long tempsTotal = System.currentTimeMillis() - start;
System.out.println("Temps de la fragmentation : " + tempsTotal/1000);
} |
Je n'arrive pas à savoir d'où vient le problème, si quelqu'un pourrait m'aider à voir plus clair.
Merci.