[Java] ProgressBar qui progresse pas

ProgressBar qui progresse pas [Java] - Java - Programmation

Marsh Posté le 06-04-2004 à 09:51:29    

J'utilise un JFrame avec dessus un JProgressBar, pour indiquer l'état d'avancement de la copie d'un fichier. Pour cela, j'ai une méthode de copie de fichier qui calcule combien d'octet ont déjà été copié, puis en fait un pourcentage avec la taille du fichier total, et hop, ce résultat, compris entre 0 et 100, dans la propriété value de la JProgressBar.
 
La copie s'effectue bien, mais la JProgressBar ne bouge jamais. Pourtant j'ai vérifié, sa valeur augmente progressivement de 0 à 100.
 
Qui a une idée ?

Reply

Marsh Posté le 06-04-2004 à 09:51:29   

Reply

Marsh Posté le 06-04-2004 à 10:38:36    

Est-ce que tu fais la copie du fichier et l'avancement de la progress bar dans le thread principal ?


---------------
Light is right
Reply

Marsh Posté le 06-04-2004 à 21:09:49    

En fait, j'ai mon application principale (je développe avec Forte), un bouton, quand je clic dessus, je lance la procédure UpdateFile() qui appelle plusieurs fois la procedure UpdateStep() qui copie un fichier en gérant la progression de la JProgressBar. Je n'ai pas géré manuellement plusieurs Thread, donc je pense que tout se passe dans le même.

Reply

Marsh Posté le 06-04-2004 à 21:49:56    

il faut que ta copie de fichier se fasse dans un Thread à part. Sinon, ça marchera pas...

Reply

Marsh Posté le 07-04-2004 à 10:03:09    

Exact, il faut que tu fasses la copie dans thread a part, sinon ta barre de progression ne se mettra jamais a jour.
Des exemples: http://java.sun.com/docs/books/tut [...] gress.html
http://java.sun.com/j2se/1.4.2/doc [...] nitor.html


---------------
Light is right
Reply

Marsh Posté le 07-04-2004 à 13:40:03    

Ok, alors j'ai modifié mon appli, en passant la copie de fichier dans une classe qui étend Thread, et effectivement, maintenant la progressBar réagi mieux. Seulement, il y a encore un problème...
 
J'ai testé la progression de ma barre avec plusieurs fichiers : un de 140 Mo et un de 23 Mo. Dans les deux cas, la progressBar ne commence à monter qu'après un certain temps de copie. Sur le fichier de 140 Mo, c'est pas très grave, puisque la copie est longue et du coup la prograssBar débute environ à 15 ou 20%. Par contre sur le fichier de 23 Mo, elle commence à plus de 50%.
 
A terme, l'application va copier des fichiers dont la taille est comprise entre 1 et 10 Mo, donc on aura même pas le temps de voir la progress monter, elle sera déjà à 100%. Comment faire pour que la barre commence à monter dès le début de la copie ?

Reply

Marsh Posté le 07-04-2004 à 14:29:52    

Bah oui c'est bizarre  :)  
Tu peut poster un bout de code ?


---------------
Light is right
Reply

Marsh Posté le 07-04-2004 à 15:04:58    

Oui oui, le voila. Merci de ne pas se moquer de moi, je suis débuttant en Java, donc il y a surement des choses qui vont vous faire bondir... Alors commençons avec ma classe principale :
 

Code :
  1. // Exécution d'une étape de mise à jour
  2.     private void UpdateStep(String Action, String SourceFile, String DestFile) {
  3.         // Suppression d'un fichier
  4.         if (Action.equals("DELETE" )) {
  5.             try {
  6.                 File deleteFile;
  7.                 deleteFile = new File(DestFile);
  8.                 deleteFile.delete();
  9.                 Thread.sleep(300);
  10.             } catch (Exception e) {
  11.                 System.out.println(e);
  12.             }
  13.         }
  14.         // Copie d'un fichier
  15.         if (Action.equals("COPY" )) {
  16.             try {
  17.                 ThreadCopy newCopy = new ThreadCopy(SourceFile, DestFile, Message, progressCurrent);
  18.                 newCopy.start();
  19.             } catch (Exception e) {
  20.                 System.out.println(e);   
  21.             }
  22.         }
  23.     }


 
Et voila ma classe complète avec mon Thread
 

Code :
  1. import java.lang.*;
  2. import javax.swing.*;
  3. import java.io.*;
  4. public class ThreadCopy extends Thread {
  5.    
  6.     protected String SourceFile;
  7.     protected String DestFile;
  8.     protected String Mes;
  9.     protected JProgressBar progress;
  10.    
  11.     /** Creates new ThreadCopy */
  12.     public ThreadCopy(final String currentFile, final String newFile, String Message, JProgressBar progressCurrent) {
  13.         SourceFile = currentFile;
  14.         DestFile = newFile;
  15.         Mes = Message;
  16.         progress = progressCurrent;
  17.     }
  18.    
  19.     public void run() {
  20.         try {
  21.             File copyFile = new File(SourceFile);
  22.             long fileSize = copyFile.length();
  23.             long lectureFichier = 0;
  24.             Long positionFichier = new Long(0);
  25.             FileInputStream in = new FileInputStream(SourceFile);
  26.             FileOutputStream out = new FileOutputStream(DestFile);
  27.             byte[] buffer = new byte[262144];
  28.             int nbRead;
  29.             try {
  30.                 while ((nbRead = in.read(buffer)) != -1) {
  31.                     lectureFichier = lectureFichier + 262144;
  32.                     positionFichier = new Long(((lectureFichier * 100) / fileSize));
  33.                     progress.setValue(positionFichier.intValue());
  34.                     System.out.println("Valeur de la progressBar : " + progress.getValue());
  35.                     out.write(buffer, 0, nbRead);
  36.                 }
  37.             } finally {
  38.                 out.close();
  39.                 in.close();
  40.             }
  41.         } catch (Exception e) {
  42.             System.out.println(e);
  43.         }
  44.     }
  45. }


 
Pour info, progressCurrent dans l'appel au constructeur de mon Thread c'est le nom de ma progressBar dans ma JFrame.

Reply

Marsh Posté le 07-04-2004 à 16:40:48    

J'ai testé chez moi et ca marche bien...
Je ne vois rien de bizarre de ton code qui pourrait provoquer ca.
Il affiche quoi ton programme ?


Message édité par nerisson le 07-04-2004 à 16:48:16

---------------
Light is right
Reply

Marsh Posté le 07-04-2004 à 16:48:03    

Ah ben mince alors...
 
Je comprend pas trop pourquoi j'ai ce temps de latence avant le début de la progression... Mon JDK est le 1.4, je tourne sur un P4 1.7 avec 256 Mo de DDR, ça devrait mouliner quand même !
 
J'arrive pas trop à comprtendre...

Reply

Marsh Posté le 07-04-2004 à 16:48:03   

Reply

Marsh Posté le 07-04-2004 à 16:49:29    

Tu as mis quoi en valeurs min et max de la progress bar ???


---------------
Light is right
Reply

Marsh Posté le 08-04-2004 à 08:19:46    

J'ai laissé les valeurs par défaut, donc elle doivent être à 0 pour le min et 100 pour le max. Je pense pas que ça viennent des valeurs limites, parce que avec un fichier volumineux, la barre commence à progresser très bas (normal, le temps de copie est plus long). Donc c'est plus un problème de 'lag' pendant une durée indéterminée (elle varie un peu) au début de la copie pendant laquelle le rafraichissement de la progress ne se fait pas.

Reply

Marsh Posté le 09-04-2004 à 08:10:10    

C'est bon, j'ai résolu le problème en modifiant mes classes. J'ai passé mes appels de copie directement dans le second thread et tout passe correctement maintenant. Merci à tous pour votre aide.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed