2010-07-06 5 views
0

i ont un programme qui prend un certain temps la création de fichiers PDF je voudrais montrer les progrès à l'utilisateurJProgressbar ne pas montrer (sans fils)

quand je fini de faire un fichier pdf que je tente d'appeler la barre de progression de mettre à jour son statut:

ProgressDialog progress = new ProgressDialog(instance, numberOfInvoices); 
progress.setVisible(true); 
progress.setAlwaysOnTop(true); 

for(int i = 0 ; i<numOfPdfs ; i++){ 
    progress.change(i + 1); 
} 

le ProgressDialog ressemble à ceci:

public class ProgressDialog extends JDialog { 

    private JProgressBar progressBar; 

    public ProgressDialog(Window parent, int aantal) { 
     super(parent); 

     this.setPreferredSize(new Dimension(300, 150)); 

     progressBar = new JProgressBar(0, aantal); 
     progressBar.setValue(0); 
     progressBar.setSize(new Dimension(280, 130)); 
     this.add(progressBar, BorderLayout.CENTER); 

     this.pack(); 
     this.setLocationRelativeTo(parent); 
    } 

    public void change(int aantal) { 
     if (aantal < progressBar.getMaximum() && aantal >= 0) { 
      progressBar.setValue(aantal); 
     } 
    } 
} 

tout ce que je reçois est une fenêtre vide (blanc)

j'ai regardé autour sur ce forum, mais la solution semble soo marches complexe

entre le calcul de 2 fichiers pdf que je devrais être en mesure de mettre à jour l'interface utilisateur graphique, droit?

ok colin

i essayé ceci: (classe complète)

public class ProgressDialog extends JDialog { 

    private JProgressBar progressBar; 
    private String message; 
    private static int number; 

    public ProgressDialog(Window parent, int max, String message) { 
    super(parent); 

    this.message = message; 
    this.setPreferredSize(new Dimension(300, 150)); 

    progressBar = new JProgressBar(0, max); 
    progressBar.setValue(0); 
    progressBar.setSize(new Dimension(280, 130)); 
    progressBar.setString(message + " 0/" + progressBar.getMaximum()); 
    progressBar.setStringPainted(true); 
    this.add(progressBar, BorderLayout.CENTER); 

    this.pack(); 
    this.setLocationRelativeTo(parent); 

    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 


    } 

    public void change(int number) { 
    ProgressDialog.number = number; 
    SwingUtilities.invokeLater(new Runnable() { 

     public void run() { 
     int number = ProgressDialog.getAantal(); 
     if (number < progressBar.getMaximum() && number >= 0) { 
      progressBar.getModel().setValue(number); 
      progressBar.setString(message + " " + progressBar.getValue() + "/" + progressBar.getMaximum()); 
      System.out.println("progressbar update: " + number + "/" + progressBar.getMaximum()); 
     } else { 
      setCursor(null); 
      System.out.println("progressbar terminated"); 
     } 
     } 
    }); 
    } 

    public static int getAantal(){ 
    return number; 
    } 
} 

maintenant il montre encore la fenêtre vide mais quand tous les PDF sont prêts il montre la barre de progression avec 0% complété puis il se ferme (comme il devrait le faire)

aucune idée pourquoi il reste vide pendant le processus?

Répondre

4

Vous devez le faire avec des threads. Mieux vaut l'apprendre que d'échapper, car c'est une conception de cadre GUI commun.

Il peut être aussi simple que:

public void change(int aantal) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      if (aantal < progressBar.getMaximum() && aantal >= 0) { 
       progressBar.setValue(aantal); 
      } 
     } 
    }); 
} 

Ou remplacer invokeLater() avec invokeAndWait().

0

Lisez la section du tutoriel Swing sur Concurrency pour comprendre pourquoi les threads sont nécessaires pour ce problème. Lisez aussi la section "Comment utiliser les barres de progression" pour un exemple de travail.

Questions connexes