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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
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.