peoplehard
Messages postés26Date d'inscriptionsamedi 26 avril 2003StatutMembreDernière intervention26 novembre 2008
-
15 juil. 2008 à 20:44
tlaloctzin
Messages postés136Date d'inscriptionmercredi 21 juin 2006StatutMembreDernière intervention12 septembre 2013
-
18 juil. 2008 à 13:23
Bonjour,
Mon ProgressBar reste statique alors que mon textarea varie correctement.
int l = in.read(buff);
while(l>0)
{
WritenFile.write(buff, 0, l);
downloaded += l;
progress.setValue(downloaded);
addTextField.setText("Téléchargement en cours de " + FileName + " (" + downloaded + "/"+ max + ")");
l = in.read(buff);
}
cs_laurent1024
Messages postés987Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention30 août 201225 16 juil. 2008 à 09:24
Bonjour.
Quand tu utilises une progressbar, il faut utiliser un thread qui va faire ton traitement "long", le thread principal doit rester disponible car c'est lui qui met à jour les composants graphiques (notamment ta progressbar).
peoplehard
Messages postés26Date d'inscriptionsamedi 26 avril 2003StatutMembreDernière intervention26 novembre 2008 16 juil. 2008 à 10:32
Merci pour l'info.
J'ai réussi à faire vivre la JProgressBar. Mais le problème c'est que ça marche bien quand je n'envoie qu'un lien.
Mais quand je demande au programme de récupérer plusieurs liens dans un textarea via:
StringTokenizer tokenizer = new StringTokenizer(addTextField.getText(), "\n");
while (tokenizer.hasMoreTokens()){
URL verifiedUrl = verifyUrl(tokenizer.nextToken());
if (verifiedUrl != null) {
Download(verifiedUrl, reg.getText());
Avec le Thread, ça n'exécute que le dernier lien, alors que sans le Thread, chaque lien est exécuté un par un.
peoplehard
Messages postés26Date d'inscriptionsamedi 26 avril 2003StatutMembreDernière intervention26 novembre 2008 16 juil. 2008 à 13:57
Merci pour vos réponses voila le thread:
public class threadTest extends Thread
{
public void run() {
try {
downloaded = 0;
progress.setMinimum(0);
int max = 100;
URLConnection uc = url.openConnection();
String FileType = uc.getContentType();
int FileLenght = uc.getContentLength();
if (FileLenght == -1) {
throw new IOException("Fichier non valide.");
} else {
max = FileLenght;
}
progress.setMaximum(max);
progress.setValue(0);
progress.setStringPainted(true);
InputStream in = uc.getInputStream();
String FileName = url.getFile();
FileName = FileName.substring(FileName.lastIndexOf('/') + 1);
FileOutputStream WritenFile = new FileOutputStream(saveDir + File.separator + FileName);//new FileOutputStream("C:/test.pdf");
addTextField.setText("Téléchargement en cours de " + FileName);
running = true;
byte[]buff = new byte[1024];
int l = in.read(buff);
while(l>0)
{
WritenFile.write(buff, 0, l);
downloaded += l;
progress.setValue(downloaded);
addTextField.setText("Téléchargement en cours de " + FileName + " (" + downloaded + "/"+ max + ")");
l = in.read(buff);
}
running = false;
progress.setValue(max);
WritenFile.flush();
WritenFile.close();
addTextField.setText("Téléchargement de " + FileName + " exécuté avec succès");
} catch (Exception e) {
}
}
}
Le thread est exécuté par (qui est lui-même exécuté par une boucle [ while (tokenizer.hasMoreTokens()){ ]):
public void Download(URL url, String saveDir) throws IOException, InterruptedException {
this.url = url;
this.saveDir = saveDir;
size = -1;
downloaded = 0;
status = DOWNLOADING;
//download();
Thread thread = new threadTest();
thread.start();
//addTextField.setText("" + url);
}
peoplehard
Messages postés26Date d'inscriptionsamedi 26 avril 2003StatutMembreDernière intervention26 novembre 2008 16 juil. 2008 à 15:17
Quand je met plusieurs liens, ça ne fonctionne pas, il télécharge juste le dernier lien sur le disque dur.
Par contre si je rentre mes liens exprès pour que ça déclare une erreur comme:
http://.. Espace vide
http://
Tout suite après que le premier lien est lancé, j'ai une popup (grâce à JOptionPane.showMessageDialog(this, "URL invalide", "Erreur", JOptionPane.ERROR_MESSAGE); en raison de l'espace vide).
Si j'attends tranquillement que le premier téléchargement est fini, puis que je ferme cette popup, le deuxième démarre sans problème.
StringTokenizer tokenizer = new StringTokenizer(addTextField.getText(), "\n");
while (tokenizer.hasMoreTokens()){
URL verifiedUrl = verifyUrl(tokenizer.nextToken());
if (verifiedUrl != null) {
Download(verifiedUrl, reg.getText());
Peut être qu'en demandant à boucle d'attendre la fin de l'exécution de Download(verifiedUrl, reg.getText()), ça pourrait marcher mais je ne sais pas comment faire :(
tlaloctzin
Messages postés136Date d'inscriptionmercredi 21 juin 2006StatutMembreDernière intervention12 septembre 20133 18 juil. 2008 à 13:23
Si tu réinitioalise le thread a chaque lien c est normal , tu as mal imbriqué tes threads , en plus tu risque de charger ta mémoire a gogo
Il vaut mieu être riche et en bonne santé que pauvre et malade .