[JAVA] jProgressBar qui ne s'actualise pas
Résolu
Alphaxenox
-
Alphaxenox -
Alphaxenox -
Bonjour :)
j'aimerais savoir pourquoi ma jProgressBar1 ne s'actualise pas dans le code que je vais poster ci-dessous. Enfaite, la progressBar devrait afficher "Téléchargement de SoarCraftHD" et se mettre en setIndeterminate(true) avant l'appel de la méthode UrlUtils (Qui télécharge et extrait un fichier) sauf que la ProgressBar ne s'actualise pas. Je reste toujours sur une barre vide pendant le téléchargement et l'extraction du fichier. PAR CONTRE une fois le téléchargement/extraction terminé la ProgressBar m'affiche bien le message "Done". Je ne comprend vraiment pas pourquoi.
Voici le bout de code :
Merci :)
Cordialement Alphaxenox
j'aimerais savoir pourquoi ma jProgressBar1 ne s'actualise pas dans le code que je vais poster ci-dessous. Enfaite, la progressBar devrait afficher "Téléchargement de SoarCraftHD" et se mettre en setIndeterminate(true) avant l'appel de la méthode UrlUtils (Qui télécharge et extrait un fichier) sauf que la ProgressBar ne s'actualise pas. Je reste toujours sur une barre vide pendant le téléchargement et l'extraction du fichier. PAR CONTRE une fois le téléchargement/extraction terminé la ProgressBar m'affiche bien le message "Done". Je ne comprend vraiment pas pourquoi.
Voici le bout de code :
jProgressBar1.setString("Téléchargent de SoarCraftHD"); jProgressBar1.setIndeterminate(true); 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");
Merci :)
Cordialement Alphaxenox
A voir également:
- [JAVA] jProgressBar qui ne s'actualise pas
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
3 réponses
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.
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(); }
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
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...