Barre de progression avec Fil (Java Swing)
Ici est un peu un exemple:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
int x = 0;
while (jProgressBar1.getValue() < 100) {
try {
Thread.sleep(50);
x++;
jProgressBar1.setValue(x);
jProgressBar1.repaint();
} catch (InterruptedException ex) {
Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(jProgressBar1.getValue());
}
}
System.out.println(jProgressBar1.getValue());
retourne chiffres à l'IDE de sortie, mais jProgressBar1 ne dessine pas cette valeur. Quel est le problème avec ce code? S'il vous plaît aider.
- essayez de regarder dans l'aide de
SwingWorker
- docs.oracle.com/javase/tutorial/uiswing/components/...
- J'ai donné un exemple, comment il devrait être mis en œuvre.
Vous devez vous connecter pour publier un commentaire.
N'utilisez jamais de Fil.sleep() dans Swing fil. Utilisation javax.swing.Minuterie à la place.
Exemple:
t.stop();
est mauvais paramètre "variable t n'aurait pas été initialisé"...Le problème, c'est que vous êtes d'appel
.repaint()
dans le même thread que vous faites de votre "travail" (Fil.le sommeil). "repaint() de ne pas se prévaloir de la peinture() directement. Il planifie un appel à un intermédiaire de la méthode de mise à jour(). Enfin, la mise à jour() appelle la peinture (le)...". Cela signifie que vous êtes la planification d'un tas derepaint()
des appels, mais ils ne sont pas en cours de traitement. Je voudrais également le pari qu'une fois que la valeur n'atteint 100 la barre de progression sauts d'être pleine, ce qui est parce que le thread principal est terminé, et tous lesrepaint()
les appels sont enfin en cours de traitement.Afin de rendre jProgressBars de travail, vous devez avoir leurs repeindre se produire dans un thread différent de celui dans lequel vous effectuez un travail (qui, notamment, devrait également être dans un autre thread, C'est également vrai pour la plupart des Swing de mise à jour). Essayer de lancer cet Exécutable dans un nouveau thread avant d'appeler votre code:
Exemple fonctionnement code ci-dessus:
int values[] = {1,5,9,20,22,25,45,50,55,70,80,90,99,100};
for (int valeur : valeurs) { try { Thread.sleep(50); } catch (InterruptedException ex) { Logger.getLogger(MainWindow.classe.getName()).... }` jProgressBar1.setValue(valeur); } }Thread.sleep()
comme il va geler votre application Swing. Au lieu de cela, vous devez utiliser unjavax.swing.Timer
.