La JProgressBar ne m'affiche pas de bar de progression - Java - Programmation
Marsh Posté le 24-09-2009 à 01:24:22
Oui oui j'ai remis ton code (je suis assez maniaque la-dessus comme l'indentation d'ailleurs )
Mais ça ne résoud pas ma question, normalement (peut être que je me trompe), on indique à la JProgressBar la nouvelle valeur et hop la barre avance non ? la il n'y a que le texte (19%) qui change
Marsh Posté le 24-09-2009 à 02:11:41
Oui, il suffit d'appeler setValue() dans le thread graphique (et ne pas le bloquer avec une autre opération).
Mais il faudrait voir le code pour savoir ce que tu fabriques. Et vérifier si la valeur que tu passes à setValue est valide aussi.
Marsh Posté le 24-09-2009 à 02:15:59
Code :
|
Marsh Posté le 24-09-2009 à 02:38:48
Que fait la méthode informUser ? Mon petit doigt me dit qu'elle appelle une fonction graphique alors que tu es dans le thread de download! Bref, ta méthode informUser, si elle affiche des infos ou autres, devrait être appelée dans un invokeLater() aussi.
Sinon, à part la forme un peu exotique du code, le reste me semble correct.
Petite précision quand même: quand connection.getContentLength() renvoie -1, ce qui peut arriver avec de nombreux serveurs web, ça ne veut pas dire que le fichier est vide mais simplement que la taille du fichier final n'est pas connue. Tu auras déjà remarqué que quand tu télécharges certains fichiers sur le net, firefox t'indique le nombre de bytes actuellement téléchargés avec une taille totale de fichier inconnue.
Marsh Posté le 24-09-2009 à 02:44:53
Encore une chose: ton bloc finally est mal écrit, car si le thread est interrompu tu ne fermes pas les fichiers.
Marsh Posté le 24-09-2009 à 02:55:11
Alors concernant informUser c'est juste une popup ou non avertissant la fin du download
Code :
|
Concernant connection.getContentLength() == -1 tu m'apprends un truc concernant la taille du fichier inconnue.
Et pour le bloc finally, oui j'ai juste a mettre la fermeture du fichier avec le return ret
Donc toujours rien pour ma JProgressBar
Marsh Posté le 24-09-2009 à 03:15:15
Non je ne sais pas pourquoi la progressbar ne s'affiche pas.
Et pour informUser, on dirait que tu n'as toujours pas compris: on ne peut pas appeler des méthodes qui modifient l'interface graphique dans un thread autre que le thread graphique de SwinG!
Ta méthode informUser contient du code qui modifie le text d'un label et ajoute un listener -> ce code doit être exécuté dans un Runnable appelé par SwingUtilities.invokeLater(). Il faudrait peut-être regrouper un peu le code au lieu de l'éclater dans de nombreuses méthodes appelées par différents threads pour y voir plus clair. Ou alors utilise SwingWorker.
Marsh Posté le 24-09-2009 à 03:38:53
Ok, tout ce qui touche à l'interface graphique doit passer par le thread SwingUtilities. Ce que je ne comprend pas bien c'est que ce thread est situé dans le thread de traitement. Cela m'embrouille, concretement, je n'arrive pas à voir comment cela se passe. Un thread dans un thread.
Par contre, mon appli lors de l'appel à main, je fais appel a mon constructeur de classe ou j'initialise le jpanel, je jmenu, jmenuitem avec bien sur la gestion des evenements. Tout cela aussi je dois le passer dans un SwingUtilities ? (aïe aïe aïe je crains que oui pourtant tous les exemples du net ne m'en parle pas de ca )
Marsh Posté le 24-09-2009 à 14:44:58
Je pense que c'est permis d'initialiser le GUI dans le main() puisque tu construis le GUI, tu ne l'affiche pas encore. Ensuite tu affiches la fenêtre principale en faisant setVisible(true) et là techniquement, tout ce qui suit et qui modifie le GUI doit être fait avec un invokeLater() sinon il risque de ne pas s'afficher correctement.
Un thread n'est pas exécuté "dans" un thread. Les threads sont autonomes. Le thread graphique de Swing existe déjà avant que tu crées ton thread de téléchargement. Quand tu appelles invokeLater, tu ne crées pas de nouveau thread, tu demandes à java de postposer l'exécution du Runnable dans la file de traitement du thread graphique de Swing qui est toujours en cours d'exécution tant qu'il y a une fenêtre ouverte.
Marsh Posté le 24-09-2009 à 20:17:30
Merci pour ces informations c'est très gentil. Tu parles de la file de traitement du thread graphique de Swing c'est pas ce qu'on appelle l'EDT ?
Marsh Posté le 23-09-2009 à 22:19:22
Bonjour,
Comme vous pouvez le voir ci-dessous, la JProgressBar malgré que le texte à l'intérieur s'incrémente bien, ne se lance pas
Savez vous d'ou cela vient ? ou c'est normal ?
Message édité par Yop69 le 23-09-2009 à 22:20:02