Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1346 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [Java] ProgressBar qui progresse pas

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Java] ProgressBar qui progresse pas

n°693211
Titalium
Posté le 06-04-2004 à 09:51:29  profilanswer
 

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 ?

mood
Publicité
Posté le 06-04-2004 à 09:51:29  profilanswer
 

n°693267
nerisson
Pic-pic
Posté le 06-04-2004 à 10:38:36  profilanswer
 

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


---------------
Light is right
n°694155
Titalium
Posté le 06-04-2004 à 21:09:49  profilanswer
 

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.

n°694169
torpe23
Posté le 06-04-2004 à 21:49:56  profilanswer
 

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

n°694442
nerisson
Pic-pic
Posté le 07-04-2004 à 10:03:09  profilanswer
 

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
n°694602
Titalium
Posté le 07-04-2004 à 13:40:03  profilanswer
 

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 ?

n°694650
nerisson
Pic-pic
Posté le 07-04-2004 à 14:29:52  profilanswer
 

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


---------------
Light is right
n°694677
Titalium
Posté le 07-04-2004 à 15:04:58  profilanswer
 

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.

n°694809
nerisson
Pic-pic
Posté le 07-04-2004 à 16:40:48  profilanswer
 

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
n°694822
Titalium
Posté le 07-04-2004 à 16:48:03  profilanswer
 

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...

mood
Publicité
Posté le 07-04-2004 à 16:48:03  profilanswer
 

n°694824
nerisson
Pic-pic
Posté le 07-04-2004 à 16:49:29  profilanswer
 

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


---------------
Light is right
n°695424
Titalium
Posté le 08-04-2004 à 08:19:46  profilanswer
 

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.

n°696197
Titalium
Posté le 09-04-2004 à 08:10:10  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [Java] ProgressBar qui progresse pas

 

Sujets relatifs
PostgreSql et Java[JAVA 2D] Redimensionner la taille d'un composant en fonction du texte
équivalent Java List.toArray[eclispe][plugin][java] récuperer le nom de projet
comment imprimer un .TXT en JAVA ??java fonctionne et pas javaw ??
session en javadb2 et java
[java]Régler le timeout de déconnexion des sockets[Java - Forte] Je peux pas passer mes déclarations comme je veux !!!
Plus de sujets relatifs à : [Java] ProgressBar qui progresse pas


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR