|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Inscription : janvier 2004 Messages : 250 ![]() |
Bonjour,
J'ai lu attentivement le tutoriel sur le SwingWorker http://rom.developpez.com/java-swingworker/ et en compilant l'exemple sous eclipse j'ai une erreur à la fin du programme. La voici java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: the value should be from 0 to 100 et elle semble se trouver dans la méthode done() Code :
Je comprends qu'il veut que la valeur renvoyé à la fin de doInBackground() soit entre 0 et 100 alors que j'ai plus de 100 fichiers dans le répertoire scanné. Mais la valeur renvoyée par doInBackground() doit-elle toujours être entre 0 et 100 (ça me parait bizarre) et sinon quelle méthode permet de donner des limite à ce que renvoie doInBackground().
__________________
C'est en respectant les autres que l'on se fait respecter. |
||
|
|
00
|
|
|
#2 |
|
Membre du Club
![]() Inscription : janvier 2004 Messages : 250 ![]() |
En fait l'erreur se situe au niveau de setProgress((int) progressStart); dans doInBackground().
En effet setProgress indique où l'on en est dans le processus et doit avoir donc une valeur entre 0 et 100 %
__________________
C'est en respectant les autres que l'on se fait respecter. |
|
|
00
|
|
|
#3 |
![]() ![]() |
Quelle erreur ?
Ca doit renvoyer 0 a 100 c'est tout Un simple calcul devrait régler ca... Si tu as 15356 fichiers alors le progress vaut ou quelque chose du même accabit. |
|
|
00
|
|
|
#4 |
|
Membre du Club
![]() Inscription : janvier 2004 Messages : 250 ![]() |
En fait il semble que le problème se situe dans la récursivité au moment où on ajoute step à progressStart. A un moment progressStart dépasse 100, je ne sais pas pourquoi ?
En fait, comme l'indiquait l'auteur du tutoriel, ce calcul n'était pas l'objectif donc j'ai simplifié en supprimant la récursivité en ne gardant que le premier niveau de répertoire et il n'y a plus de problèmes.
__________________
C'est en respectant les autres que l'on se fait respecter. |
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() Inscription : janvier 2004 Messages : 250 ![]() |
J'ai essayé d'adapter le programme proposé dans le tutoriel http://rom.developpez.com/java-swingworker/
Je rappelle le principe de ce programme : on remplit un JTextArea au fur et à mesure que l'on lit un répertoire. J'ai voulu faire la même chose mais avec un composant personnel et cela ne marche pas. Pour simplifier j'ai préféré faire deux classes : une pour la JFrame et une pour le SwingWorker (plus bien sûr les classes pour les composants personnels). Malheureusement cela ne marche pas : au lieu de se remplir au fur et à mesure, il ne se remplit qu'à la fin et encore à la condition que j'oblige la fenêtre à se redessiner. Il y a sûrement quelque chose que j'ai oublié.
__________________
C'est en respectant les autres que l'on se fait respecter. |
|
|
00
|
|
|
#6 |
![]() ![]() Inscription : août 2004 Messages : 8 633 ![]() |
On ne pourra certainement pas te dire quoi sans que tu nous montre le code associé.
__________________
Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something. |
|
|
00
|
|
|
#7 | ||||||||||
|
Membre du Club
![]() Inscription : janvier 2004 Messages : 250 ![]() |
OK. Donc voilà.
La classe Galerie qui contient la méthode main() équivalente à la classe SwingWorkerDemo Code :
Code :
Le flowLayout personnalisé Code :
Code :
Code :
Je rappelle le problème : dans le JTextArea on voit apparaître au fur et à mesure les noms des fichiers et le JScrollPane se met à jour, dans mon programme il n'y a pas de mise à jour de l'affichage. C'est sans doute tout con mais j'y arrive pas.
__________________
C'est en respectant les autres que l'on se fait respecter. |
||||||||||
|
|
00
|
|
|
#8 |
![]() ![]() Inscription : août 2004 Messages : 8 633 ![]() |
Tu as mal saisi les règles de l'EDT.
Les composants Swing doivent être créés et manipulés dans l'EDT, et non dans le doInBackround. Or, c'est exactement ce que tu fais ton Code :
Images images = new Images(nom,listeImages); De plus, le scale de ton image ne devrait pas être fait dans le constructeur de ta classe image. En effet, c'est une opération lourde, et, de fait, elle bloque l'EDT. Donc l'idée est de charger les images dans le doInBackround, de les redimensionner puis de les publier. Afin que l'opération du process soit la moins couteuse possible.
__________________
Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something. |
|
|
00
|
|
|
#9 | |
|
Membre du Club
![]() Inscription : janvier 2004 Messages : 250 ![]() |
Citation:
__________________
C'est en respectant les autres que l'on se fait respecter. |
|
|
|
00
|
|
|
#10 | ||||||
|
Membre du Club
![]() Inscription : janvier 2004 Messages : 250 ![]() |
J'ai essayé de modifier mon code comme me l'a indiqué Sinok. Malheureusement ça ne marche toujours pas. D'après ce qu'il dit je pense que le problème vient du temps nécessaire pour créer mes images. Voici mes modifications. Pour les classes non modifiées se reporter à mon
message du 7 février 19h15 SwingWorkerGalerie est modifié, Images est remplacé par ListeImages et Cartouche. La nouvelle classe SwingWorker Code :
La classe ListeImages qui se contente de charger les images et de les mettre à l'échelle. Code :
Code :
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at fr.oiseaux.Cartouche.<init>(Cartouche.java:27) at fr.oiseaux.SwingWorkerGalerie.process(SwingWorkerGalerie.java:152) at javax.swing.SwingWorker$3.run(Unknown Source) Je pense comprendre qu'on fait appel aux objets ListeImages avant qu'ils aient fini de se construire. Le problème est je pense basique et qu'il faut interdire l'accès à un objet ListeImages tant que la construction n'est pas finie mais je crois avoir suffisamment prouvé que je n'y connaissais rien pour ce qui concerne les thread. Peut-être une histoire de synchronized ... mais sur quoi ?
__________________
C'est en respectant les autres que l'on se fait respecter. |
||||||
|
|
00
|
|
|
#11 | ||
|
Membre du Club
![]() Inscription : janvier 2004 Messages : 250 ![]() |
Dans la classe ListeImages il faut remplacer la dernière ligne du constructeur par listeImages.add (imageIcon) au lieu de images.add (imageIcon); Code :
__________________
C'est en respectant les autres que l'on se fait respecter. |
||
|
|
00
|
|
|
#12 |
|
Membre du Club
![]() Inscription : janvier 2004 Messages : 250 ![]() |
Le résultat est identique à ce que j'avais avant : les images n'apparaissent toujours pas au fur et à mesure du chargement. La seule chose que j'ai réussi à améliorer c'est qu'à la fin de tous les chargements la fenêtre affiche toutes les images une fois que j'ai ajouté un repaint de la JFrame dans la méthode done().
__________________
C'est en respectant les autres que l'on se fait respecter. |
|
|
00
|
|
|
#13 | ||
![]() ![]() Inscription : août 2004 Messages : 8 633 ![]() |
Dans ta méthode process, après le add au panel, ajoute un appel à revalidate pour notifier au panel que son agencement a changé.
Code :
__________________
Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something. |
||
|
|
00
|
|
|
#14 |
|
Membre du Club
![]() Inscription : janvier 2004 Messages : 250 ![]() |
Impeccable.
Merci beaucoup Sinok, sans ton aide j'y serai jamais arrivé. Je vais abuser en core un peu. Pour lemoement les images apparaissent bien mais le JScrollPane ne descend pas ua fur et à mesure comme dans l'exemple avec un JTextArea. Il faut peut-être lui notifier de se positionner vers le bas ? En tout cas encore merci.
__________________
C'est en respectant les autres que l'on se fait respecter. |
|
|
00
|
|
|
#15 | ||
![]() ![]() Inscription : août 2004 Messages : 8 633 ![]() |
Code :
__________________
Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something. |
||
|
|
00
|
|
|
#16 | |||
|
Membre du Club
![]() Inscription : janvier 2004 Messages : 250 ![]() |
Citation:
__________________
C'est en respectant les autres que l'on se fait respecter. |
|||
|
|
00
|
|
|
#17 | ||
|
Membre du Club
![]() Inscription : janvier 2004 Messages : 250 ![]() |
J'ai fini par trouver. Il suffisait d'un peu de réflexions et de bien comprendre ce que fait this.galerie.scrollRectToVisible(rectangle);
Cela déplace les ScrollBars pour que le rectangle soit visible, au moins son coin en haut à gauche. Je rappelle l'enjeu : il s'agissait de remplir une JFrame avec des images dans un JScrollBar et que celui adapte son comportement pour que la dernière image placée soit toujours visible. Il suffisait donc de créer un rectangle dont le coin bas à droite soit celui du panneau et le coin haut gauche soit nécessairement visible dans le JScrollPane. Donc pour ceux que cela intéresse voici le code : (les cartouches sont des panneaux sur lesquels des images sont regroupées par thème.) Code :
__________________
C'est en respectant les autres que l'on se fait respecter. |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com