ProgressBar ne change pas sa valeur en Java
J'ai un problème étrange. J'ai mis une JProgressBar:
private JProgressBar progressBar;
public void foo()
{
...
progressBar = new JProgressBar(0, 100);
progressBar.setValue(0);
progressBar.setStringPainted(true);
...
contentPane.add(progressBar);
...
}
Mais il change seulement quand je mets la fonction setValue dans certains endroits dans le code, pas partout:
public void foo2()
{
progressBar.setValue(100); //working
if(...)
{
System.out.println("These instructions are executing"); //working
progressBar.setValue(0); //not working
}
}
Donc, ce que je fais mal? Pourquoi la deuxième instruction ne fonctionne pas?
Après l'examen de Comment Utiliser les Barres de Progression, de poster un sscce qui montre le problème.
est-il possible que foo2() n'est pas appelé sur le thread gui, le sens n'est pas appelé à partir d'un élément à l'écoute, et au lieu d'être appelés à partir de votre thread principal? Si oui, c'est la raison. Modifications de l'interface graphique doit se passer sur le thread gui. Voir SwingUtilities.invokeLater
est-il possible que foo2() n'est pas appelé sur le thread gui, le sens n'est pas appelé à partir d'un élément à l'écoute, et au lieu d'être appelés à partir de votre thread principal? Si oui, c'est la raison. Modifications de l'interface graphique doit se passer sur le thread gui. Voir SwingUtilities.invokeLater
OriginalL'auteur Hoome | 2011-04-17
Vous devez vous connecter pour publier un commentaire.
La valeur de la barre de progression est vraiment mis à jour. Mais ce n'est pas simplement sur l'écran mais. Souvent on utilise des barres de progression dans les boucles. Mais, alors que vous êtes dans la boucle, qui vous a probablement appelé en cliquant sur un bouton il n'est pas peint. Pourquoi? Parce que vous avez appelé en cliquant sur un bouton. Lorsque vous cliquez sur un bouton, tout le code que vous avez fait pour que le bouton est en cours d'exécution par le
AWTEventThread
. C'est le même thread que garder la trace de tous les composants Swing, et vérifie qu'ils ont à être repeint. C'est le fil qui permet à votre JFrame vivante. Lorsque vous passez la souris sur un bouton et la couleur change un peu, c'est fait par leAWTEventThread
.Ainsi, alors que vous travaillez dans la boucle, le AWTEventThread ne pouvez pas mettre à jour l'écran plus.
Cela signifie qu'il y a deux solutions:
(Recommandé), Vous devez créer un thread qui exécute la boucle. Cela signifie que le AWTEventThread pouvez mettre à jour l'écran si nécessaire (lorsque vous appelez
bar.setValue(...);
)Manuellement repeindre la barre de progression. Je n'ai toujours avec
bar.repaint();
mais je me demande si cela va fonctionner. J'ai trouvé cette méthode. Si cela ne fonctionne pas, essayez:bar.update(bar.getGraphics());
.Ok, idiot moi, tout fonctionne correctement, merci!
Vous êtes les bienvenus.
OriginalL'auteur Martijn Courteaux
Même si cette question a déjà répondu, j'ai trouvé une autre solution qui fonctionne pour moi. J'ai été en utilisant le swing travailleur et à l'aide de propertyChange(null) pour mettre à jour la barre de progression a été la solution la plus simple.
Voulais juste proposer cette alternative.
OriginalL'auteur Lenymm