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

EDT/SwingWorker Java Discussion :

[SwingWorker] JProgressBar mise à jour une seule fois


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Administrateur réseau
    Inscrit en
    Mai 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur réseau

    Informations forums :
    Inscription : Mai 2009
    Messages : 58
    Par défaut [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 : 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.

  2. #2
    Membre confirmé
    Profil pro
    Administrateur réseau
    Inscrit en
    Mai 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur réseau

    Informations forums :
    Inscription : Mai 2009
    Messages : 58
    Par défaut
    J'ai trouvé d'où venait le problème.

    Lors de l'appel de la méthode setProgress pour mettre à jour la progressBar, j'avais passé en paramètre la valeur de progression qu'était affectée à chaque fragment constitué (valeur de 25 pour un découpage en 4 fragments par exemple), et non la valeur de départ incrémentée par celle-ci.


    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
    int valStartProgress = 0;
    
    ....
    
    valBarreProgression = (100 - valStartProgress) / nbFragmentsDecoupe;
    
    ...
    
    valStartProgress += valBarreProgression;
    
    ...
    
    // MAJ de la barre de progression
    setProgress(valStartProgress);

    Souvent les petites maladresses comme celle-ci qui font perdre le plus de temps

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/10/2013, 00h09
  2. lu tous les jours mais exécuté une seule fois par mois
    Par sianto dans le forum Scripts/Batch
    Réponses: 13
    Dernier message: 17/11/2008, 10h08
  3. [MySQL] N'afficher la page que une seul fois par jour par ip
    Par Nutaak dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/12/2007, 18h38
  4. Réponses: 2
    Dernier message: 04/07/2006, 03h32
  5. Réponses: 2
    Dernier message: 30/11/2004, 12h48

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