[JAVA] jProgressBar qui ne s'actualise pas

Résolu
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 :

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:

3 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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.
0
Alphaxenox
 
Oui mais justement , je ne fais pas de setValue. Je veux juste que le texte s'écrive dans la jProgress
jProgressBar1.setString("Téléchargent de SoarCraftHD");
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
J'avoue que j'ai la flemme de faire un code complet pour tester ^^
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...
0
Alphaxenox
 
Nop ça ne marche pas. C'est comme si le programme passé trop vite sur l'affichage du texte et que comme la méthode de téléchargement est juste après elle freeze le programme et passe tous de suite a l'affichage de Done après.
0
Alphaxenox
 
Je viens de tester en enlevant
 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 ?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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();
	}
}
0
Alphaxenox
 
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 :

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();

	}
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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 ^^

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
0
Alphaxenox
 
GG à toi , ça marche :D

Un gros Merci a toi :)
0