Progress Bar sous Java visual web

Progress Bar sous Java visual web - Java - Programmation

Marsh Posté le 15-03-2009 à 14:25:21    

Bonjour a tous,
 
j'ai une application visual web dans laquelle je voudrais introduire une progress Bar qui soit raffraichit a chaque nouvelle iteration d'un boucle for.
 
Utilisant netbeans 6.5, je drag & drop un objet Progress Bar de la palette, et dans le code Java de la page, j'inser les lignes :
 
progressBar1.setRefreshRate(100); // rafraichit toutes les 100 ms
// A l'interieur de la loop
progressBar1.setProgress( i );
 
Seulement la progress bar ne se raffraichit qu'une seule fois que le processus est termine, je n'ai donc que 2 etapes : 0% et 100%.
 
Je voudrais savoir comment faire pour rafrachir cette maudite progressBar.
J'ai lu dans des forum qu'on peut creer un "Thread" a part pour la progress bar,mais cela n'etait pas pour des application web.
 
Est ce que quelqu'un pourrait m'expliquer quelle serait la solution a mon probleme ?
 
 
Merci beaucoup.

Reply

Marsh Posté le 15-03-2009 à 14:25:21   

Reply

Marsh Posté le 15-03-2009 à 19:25:42    

Pour ma part, je te conseille d'utiliser swingworker qui permet d'effectuer une tache en background et de rafraichir dans l'EDT(le thread ou se produise les evenements swing.)
 
Crée une classe extends JFrame qui contiendra la fenetre qui affiche la barre de progression et crée à l'intérieur une classe Task extends Swingworker qui fera le travaille que tu souhaite effectuer pendant ta tache.
 
Créer les deux fichiers java suivants. Le premier gère l'affichage graphique  
 
 
JUploadProgress.java

Code :
  1. import javax.swing.Box;
  2. import javax.swing.BoxLayout;
  3. import javax.swing.JDialog;
  4. import javax.swing.JPanel;
  5. import javax.swing.JProgressBar;
  6. import javax.swing.border.BevelBorder;
  7. import java.awt.Color;
  8. import java.awt.Dimension;
  9. public class JUploadProgress extends JDialog
  10. {
  11. protected JPanel p;
  12. protected JProgressBar progress;
  13. public JUploadProgress() {
  14.  super(); // Initialisation des principaux paramètres de la JDIALOD
  15.         this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
  16.         this.setTitle("Opération en cours" );
  17.         this.setSize(300, 170);
  18.         this.setResizable(false);
  19.         this.setBackground(Color.LIGHT_GRAY);
  20.         this.setLocationRelativeTo(null);
  21.        
  22.        
  23.         p = new JPanel(); // Création du panneau principal
  24.        
  25.      
  26.        
  27.         progress = new JProgressBar(); // Création et initialisation de la progress bar
  28.         progress.setStringPainted(true);
  29.         progress.setBorder(new BevelBorder(BevelBorder.LOWERED,Color.white, Color.gray));
  30.         progress.setMinimum(0);
  31.         progress.setMaximum(100);
  32.         progress.setValue(0);
  33.         progress.setSize(250, 10);
  34.        
  35.         p.setOpaque(true);
  36.         p.setLayout(new BoxLayout(p,BoxLayout.PAGE_AXIS));//On ajoute tous les composants (un sur chaque ligne)
  37.         p.add(Box.createRigidArea(new Dimension(0,10)));// les boites servent juste à la mise en page
  38.         p.add(progress);
  39.         p.add(Box.createRigidArea(new Dimension(0,10)));// les boites servent juste à la mise en page
  40.         this.getContentPane().add(p);
  41.        
  42.         this.setVisible(true);// on affiche la JDialog
  43.        
  44. }
  45. public void setProgressMax(final int max)
  46. /* methode qui permettent de mettre à jour la barre de progression depuis le fichier TacheAEffectuer*/
  47. {
  48.             progress.setMaximum(max);
  49. }
  50. public void setProgressValue(final int value)
  51. {
  52.  progress.setValue(value);
  53. }
  54. public void setProgressMin(final int min)
  55. {
  56.  progress.setMinimum(min);
  57.        
  58. }
  59. }


 
 
TacheAEffectuer.java

Code :
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. public class TacheAEffectuer {
  5.        
  6.     private JUploadProgress JU;// Fenetre qui apparaît pendant l'upload
  7.     private int i;
  8.     class Task extends SwingWorker<Void, Void> {
  9.         /*
  10.          * Main task. Executed in background thread.
  11.          */
  12.         @Override
  13.         public Void doInBackground()
  14.         {
  15.          SwingUtilities.invokeLater(new Runnable() { public void run()
  16.              {
  17.          JU.setProgressMax(100);// on prépare la JProgressBar
  18.                JU.setVisible(true);
  19.              }});
  20.          //Vous mettez ici votre code en utilisant Swing utilies pour mettre à jour la JprogressBar
  21.          for( i =0;i<100;i++)
  22.          {
  23.        
  24.           try {   // Ici je mets le thread en pose; c'est ici que vous mettrez le code que vous souhaitez exécuter
  25.     Thread.sleep(1000);
  26.    } catch (InterruptedException e) {
  27.     // TODO Auto-generated catch block
  28.     e.printStackTrace();
  29.    }
  30.    //On met à jour la valeur de la progress bar
  31.           SwingUtilities.invokeLater(new Runnable() { public void run()
  32.                     {
  33.             JU.setProgressValue(i);// on prépare la JProgressBar
  34.                          JU.setVisible(true);
  35.                     }});
  36.          }
  37.   return null;
  38.        
  39.         }
  40.         /*
  41.          * Executed in event dispatching thread
  42.          */
  43.         @Override
  44.         public void done() {
  45.             Toolkit.getDefaultToolkit().beep();
  46.            
  47.         }
  48.     }
  49.  
  50. /*****************************************************************/
  51. /******************************CONSTRUCTEUR***********************/
  52. /*****************************************************************/
  53.    
  54.    
  55.     public TacheAEffectuer(){
  56.        JU = new JUploadProgress();
  57.        JU.setVisible(true);
  58.      
  59.        Task task=new Task();
  60.        task.execute();
  61.     }
  62.  
  63. }


 
 
Dans ton programme principal invoque une tache a effectuer

Code :
  1. public class Programme {
  2. /**
  3.  * @param args
  4.  */
  5. public static void main(String[] args) {
  6.  // TODO Auto-generated method stub
  7.  TacheAEffectuer Tache=new TacheAEffectuer();
  8. }
  9. }

Reply

Marsh Posté le 25-09-2009 à 12:30:22    

L'utilisation du SwingWorker est effectivement une bonne solution... Mais celà implique de savoir l'utiliser.
 
Dans le principe, l'exemple fourni est correct puisqu'il fait bien la distinction entre ce qui doit être effectué ou non dans le Thread EDT. Par contre cette utilisation n'apporte rien de plus à l'alternative de créer un nouveau Thread. Il est préférable d'utiliser les méthodes progress() et publish() qui se chargent d'effectuer les raffraichissement dans le Thread EDT.
 
Pour utiliser pleinement le SwingWorker, il faut dans ce cas précis :
 - le typer <Void,Integer>, car on passera des valeurs d'entiers à la progressBar
 - surcharger la méthode progress() pour raffraichir la progressBar
 - effectuer des appel à publish() pour poster les valeurs à raffraichir

Reply

Sujets relatifs:

Leave a Replay

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