[JAVA] jProgressBar qui ne s'actualise pas
Résolu/Fermé
A voir également:
- [JAVA] jProgressBar qui ne s'actualise pas
- Jeux java itel ✓ - Forum Jeux vidéo
- Java runtime - Télécharger - Langages
- Java apk - Télécharger - Langages
- Scanf en java ✓ - Forum Java
- Java heap space ✓ - Forum Java
3 réponses
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
26 sept. 2011 à 21:12
26 sept. 2011 à 21:12
Il faut informer explicitement la barre de la progression !
Evidemment, il faut pouvoir déterminer cette valeur au fur et à mesure.
Si par exemple tu as 137 fichiers à charger, que tu les charges avec un indice n de 0 à 136 tu devras avoir setMinimum(0), setMaximum(137) et à chaque fichier chargé tu incrémentes la valeur avec setValue(n), puis une fois le 137è fichier terminé, un setValue(137).
Ce que tu fais avec setIndeterminate(true) c'est dire que tu n'en sais rien. Remarque : dans la documentation on peut lire "Some look and feels might not support indeterminate progress bars; they will ignore this property." alors rien d'étonnant si l'indétermination se résume à laisser une barre vide.
Evidemment, il faut pouvoir déterminer cette valeur au fur et à mesure.
Si par exemple tu as 137 fichiers à charger, que tu les charges avec un indice n de 0 à 136 tu devras avoir setMinimum(0), setMaximum(137) et à chaque fichier chargé tu incrémentes la valeur avec setValue(n), puis une fois le 137è fichier terminé, un setValue(137).
Ce que tu fais avec setIndeterminate(true) c'est dire que tu n'en sais rien. Remarque : dans la documentation on peut lire "Some look and feels might not support indeterminate progress bars; they will ignore this property." alors rien d'étonnant si l'indétermination se résume à laisser une barre vide.
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
26 sept. 2011 à 23:22
26 sept. 2011 à 23:22
Je viens de faire un petit code de test, chez moi rien ne s'affichait, en revanche j'avais bien la barre indeterminate qui se déroulait (le LnF sans aucun doute) bref pour que tout marche, il a fallu que j'utilise setStringPainted(true), peut-être l'as-tu oublié...
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
public class TestBarre extends JFrame
{
private static final long serialVersionUID = 1;
private final JProgressBar barre;
public TestBarre()
{
setMinimumSize(new Dimension(200,200));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
barre = new JProgressBar();
barre.setString("En attente");
barre.setStringPainted(true);
add(barre);
setVisible(true);
}
public void test() throws InterruptedException
{
barre.setIndeterminate(true);
barre.setString("Téléchargement");
Thread.sleep(5000);
barre.setIndeterminate(false);
barre.setString("Terminé");
}
public static void main(String...args) throws InterruptedException
{
TestBarre tb = new TestBarre();
Thread.sleep(5000);
tb.test();
}
}
Ouai j'ai aussi testé sans l'appel de la fonction pour télécharger , et ça marche. J'ai donc l'impression que la fonction télécharger fait freeze le programme ce qui ne permet pas de l'actualiser.
Voici le code de UrlUtils au cas ou ça soit dedans :
Voici le code de UrlUtils au cas ou ça soit dedans :
public static void UrlUtils (String HOST, File file) {
try {
URL racine = new URL(HOST);
getFile(racine, file);
} catch (MalformedURLException e) {
System.err.println(HOST + " : URL non comprise.");
} catch (IOException e) {
System.err.println(e);
}
}
public static void getFile(URL u, File file) throws IOException {
URLConnection uc = u.openConnection();
String FileType = uc.getContentType();
int FileLenght = uc.getContentLength();
if (FileLenght == -1) {
throw new IOException("Fichier non valide.");
}
InputStream in = uc.getInputStream();
String FileName = u.getFile();
FileName = FileName.substring(FileName.lastIndexOf('/') + 1);
FileOutputStream WritenFile = new FileOutputStream(file+ "\\" +FileName);
byte[]buff = new byte[1024];
int l = in.read(buff);
while(l>0)
{
WritenFile.write(buff, 0, l);
l = in.read(buff);
}
jProgressBar1.setValue(100);
jProgressBar1.setString("Done");
WritenFile.flush();
WritenFile.close();
}
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
Modifié par KX le 26/09/2011 à 23:44
Modifié par KX le 26/09/2011 à 23:44
Maintenant que tu le dis...
Il est possible que ton calcul prenne l'ensemble du processeur et que l'affichage de la fenêtre ne soit pas réactualisé avant que la méthode ait rendue la main !
Voici une piste, je pense que c'est incomplet, mais ça ne vaudra le coup de compléter que si ça marche ^^
Il est possible que ton calcul prenne l'ensemble du processeur et que l'affichage de la fenêtre ne soit pas réactualisé avant que la méthode ait rendue la main !
Voici une piste, je pense que c'est incomplet, mais ça ne vaudra le coup de compléter que si ça marche ^^
jProgressBar1.setIndeterminate(true);
jProgressBar1.setString("Téléchargement de SoarCraftHD");
new Thread()
{
@Override
public void run()
{
String url = "http://xx.xxx.xxx.xx/SoarCraftHD.zip";
File appdata = new File (System.getProperty("user.home"), "\\appdata\\Roaming\\.minecraft\\texturepacks");
UrlUtils(url, appdata);
jProgressBar1.setIndeterminate(false);
jProgressBar1.setString("Done");
}
}.start();La confiance n'exclut pas le contrôle
26 sept. 2011 à 21:25
jProgressBar1.setString("Téléchargent de SoarCraftHD");26 sept. 2011 à 21:28
Mais essaie de permuter les deux premières lignes, c'est à dire de faire en premier le setIndeterminate(true); et en second le setString("blablabla"); c'est dans ce sens là que tu l'as fait pour le "Done" que tu dis s'afficher...
26 sept. 2011 à 21:42
26 sept. 2011 à 22:27
jProgressBar1.setIndeterminate(false); jProgressBar1.setString("Done");Et ça m'affiche "Téléchargement ..." Mais après que le programme est fini de télécharger... Comme je disais on dirait qu'il va trop vite. Comment faire pour attendre que la barre ce mette a jour et passer ensuite a la suite ?