Remplir un ProgressBar durant un traitement

Hssy23 Messages postés 7 Date d'inscription jeudi 16 octobre 2014 Statut Membre Dernière intervention 18 août 2015 - Modifié par KX le 5/11/2014 à 19:14
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 6 nov. 2014 à 19:37
Salut ,
J'ai un long traitement au sein de mon programme, pour cela j'ai utilisé un ProgressBar, mais le problème c'est qu'il se remplie qu'à la fin du traitement. Sachant que la durée de mon traitement n'est pas toujours stable.
Quelqu'un peut m'aider !
Voici un bout de mon code :

private void jTextArea2MouseClicked(java.awt.event.MouseEvent evt) {                                        
       final long start = System.currentTimeMillis();
      jProgressBar1.setValue(0);
        if (evt.getClickCount() == 2) 
        {
            Thread monThread= new Thread()
            {
       int n = 0;
      public void run()
     {   
                    try 
                    {
                        FileOutputStream f = new FileOutputStream("fileResult.txt");
                        System.setOut(new PrintStream(f));
                        new Searcher(jTextArea2.getSelectedText()).toString().split("\n");
                        try 
                        {
                            InputStream fichier1 = new FileInputStream("fileResult.txt"); 
                            InputStreamReader fich1 = new InputStreamReader(fichier1);
                            BufferedReader br1 = new BufferedReader(fich1);

                            String ligne;
                            while ((ligne = br1.readLine()) != null) 
                            {
                                jTextArea1.append(ligne + "\n");
                            }
                            br1.close();
                        } catch (Exception e) {}
                    } catch (Exception e) {}
                 while (n<=start)
  {    
   jProgressBar1.setValue(n);
   try {
   Thread.sleep(500);
   } catch (InterruptedException ex) {      Logger.getLogger(Inter.class.getName()).log(Level.SEVERE, null, ex);}
                        n= n+10;
                        if (jProgressBar1.getValue()< 100)
     jProgressBar1.setValue(n+(100-n));
  }
}// fin du void run
}; //fin du thread
monThread.start();
                    if (!(jTextArea3.getText().equalsIgnoreCase(null))) 
                    {
                        jTextArea3.setText("");
                    }
                    String fullText = jTextArea2.getText();
                    fullText = fullText.replaceAll("\n", " ");
                    String[] tabM = fullText.split(" ");
                    for (int j = 0; j < tabM.length; j++) 
                    {
                        if (tabM[j].equalsIgnoreCase(jTextArea2.getSelectedText()) == true) 
                        {
                            jTextArea3.append(" Context  : " + tabM[j - 3] + " " + tabM[j - 2] + " " + tabM[j - 1] + " " + tabM[j] + " " + tabM[j + 1] + " " + tabM[j + 2] + " " + tabM[j + 3] + "\n");
                        }
                    }
        }   
 }             


Merci d'avance.

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
5 nov. 2014 à 19:20
Bonjour,

Ça fonctionnerait mieux si tu mettais à jour ta progress bar au fur et à mesure de ton traitement...

while ((ligne = br1.readLine()) != null) 
{
    jTextArea1.append(ligne + "\n");
    // ici
}

Remarque : ajouter ligne par ligne les données au jTextArea est source de lenteur. Si tu as 100 lignes, la fenêtre va être rafraîchit 100 fois. Il vaut mieux construire ton String au fur et à mesure, et ne rafraîchir la fenêtre qu'une fois à la fin...
1
Hssy23 Messages postés 7 Date d'inscription jeudi 16 octobre 2014 Statut Membre Dernière intervention 18 août 2015
6 nov. 2014 à 18:36
Salut KX,
j'ai fait ce que vous m'avez proposé, mais l'exécution reste toujours lente.
Concernant le ProgressBar, parfois il fonctionne correctement parfois non, vu que le temps d'exécution est variable.

Merci pour votre conseil et votre aide.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
6 nov. 2014 à 19:37
Pour avoir une progress bar "intelligente" tu devrais compter la taille du fichier au départ puis au fur et à mesure que tu lis tes lignes compter la taille déjà traitée.
Cependant tout traitement que tu feras en plus (pour la mise à jour de la barre) sera du temps perdu sur l'exécution du programme. Il vaut parfois mieux privilégier la vitesse à la présentation.
0
Rejoignez-nous