[JAVA] Problème de rafraichissement d'une vue sur un applet
Forum Programmation : [JAVA] Problème de rafraichissement d'une vue sur un applet
Bonjour,
peut-être vous direz-vous que vous avez déjà vu ce post plusieurs fois mais j'ai beau avoir cherché, je n'ai trouvé aucune solution à mon problème.
J'ai un programme qui tourne en applet et que je n'arrive pas à rafraichir.
Sous eclipse, lorsque je le lance, tous fonctionne correctement mais lorsque je le lance sur un navigateur, le rafraichissement des vues ne se fait plus.
Le programme débute avec un écran de connexion, puis lorsque l'on clique sur le bouton "valider", la vue change pour arriver sur un autre menu.
Seulement sous le navigateur, cet autre menu ne s'affiche pas... Pourtant il existe bel et bien puisque en tatant je peux cliquer sur le bouton de retour.
La structure de mon programme est lal suivante :
- JApplet launcher qui contient :
- JPanel view (la vue principale) qui contient :
- d'autres JPanel
C'est ma classe Model qui met à jour la vue, j'ai déjà essayé les solutions suivantes sans succès :
- view_.setVisible(false); puis view_.setVisible(true);
- view_.setSize(view_.getSize());
- repaint();
- validate();
- revalidate();
Pour ce qui est de View, j'ai tenté plusieurs choses :
- Faire remove(menu1) puis add(menu2)
- Utiliser un cardsLayout() (solution actuelle)
voici le code de mise à jour de la vue :
Code :
|
Code :
|
Cela fait 2 jours que je suis à la recherche d'une solution et pour le moment je suis bloqué...
Merci d'avance.
Si tu surcharges la méthode paint, lorsque tu fais un repaint, est-elle appelée?
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Oui elle est appelée. Je crois que j'étais parti sur une fausse piste. Ce n'est pas le rafraichissement qui pose problème mais le fait que mon applet doit afficher une image venant d'internet via un url.
De ce que j'ai compris, il faudrai que je certifie mon applet pour que celui-ci fonctionne sur les navigateurs. Eclipse doit le faire automatiquement lorsqu'on lance le programme mais il ne nous donne pas d'exécutable.
Bon j'ai eu quelques modifications à faire sur mon applet.
Maintenant une page web demande une adresse IP et un Port pour générer un url correspondant aux images jpeg d'une caméra IP.
L'applet reçoit l'url et lance un thread qui va actualiser cette image. Avant je n'avais rien (un cadre gris) et maintenant que j'ai signé mon applet, j'ai une image mais malheureusement elle ne se rafraichie pas... Quelqu'un a-t-il une solution ?
Merci d'avance.
Personne n'a d'idée ?
Si ça peut vous intéresser, j'ai noté que même lorsque je relance l'applet sans quitter le navigateur (pour que le certificat soit toujours accepté), j'ai toujours la même image.
Cela signifie qu'une fois que j'accepte le certificat, l'image est chargée une fois et tant que je ne quitte pas le navigateur ce sera toujours la même... comme si elle était dans le cache ou quelque chose comme ça.
Je galère vraiment et je ne peux pas avancer tant que je n'ai pas réglé ce problème...
Merci d'avance.
J'ai pas compris comment tu rafraichis l'image.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Je rafraichi l'image en faisant view_.repaint() dans mon thread.
Comme la méthode paint de view charge l'image puis l'affiche, normalement elle est censée être actualisée à chaque repaint (c'est ce qui se passe lorsque je lance l'applet à partir d'eclipse).
Et donc ça fait ramer le programme quand tu bouge la fenêtre ?
Le chargement de l'image ne devrait pas se faire dans la méthode paint qui ne devrait afficher que l'image déjà chargée.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Bah je pense que si je met le ImageIO.read(...) autre part que dans le paint, l'image ne sera pas mise à jour.
En fait c'est bon mon problème est résolu. C'est tout simplement que le navigateur enregistre l'url dans un fichier temporaire donc il ne refaisais pas le traitement après, quel feignant celui-là !!!
Du coup j'ai changé mon url par : url+new Date().getTime()
Comme ça le navigateur reçoit toujours une nouvelle url et il est obligé de refaire le traitement et donc de m'envoyer une nouvelle image.
Merci quand même !
PS : Comment met-on un sujet en "résolu" ?
Message édité par Hyome le 29-04-2009 à 09:42:50
S'il fait ça c'est pour ne pas faire ramer les chose. Je le répète, il ne faut rien télécharger dans un paint. En fait, il faut faire le moins de chose possible dans un paint.
Bref, quand tu voudras corriger ton problème de la fenêtre qui rame quand on la bouge, tu devras faire un thread de rafraichissement qui s'occupe du téléchargement. Comme ça des centaines d'appels de paint pourront se faire alors que tu es en train de télécharger une image.
Message édité par CRicky le 29-04-2009 à 20:41:05
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
En effet sur certaines caméras mon programme lag méchamment, c'est du à mon téléchargement dans le paint d'après toi ?
Si c'est ça il faut que je fasse une méthode à part qui va télécharger et qui repaint après si j'ai bien compris.
------
Edit :
Cela ne change rien... Je pense que c'est le temps de chargement de l'image qui est trop grand et ça je crois que je n'y suis pour rien...
Mais bon dans tous les cas c'est quand même un meilleur code.
Message édité par Hyome le 30-04-2009 à 11:03:56
Tu as fait ça dans un autre thread au moins ?
Parce que si tu fais tout dans le main thread (le thread principal par défaut), et bien la gestion des évènements attend la fin de ta méthode. Rien n'est fait en parallèle, seul le multi-threading peut améliorer les choses.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Oui j'ai fais ça dans un autre thread. J'avais essayé sans multithread au début et je me suis vite heurté à ces soucis.
--------------
Edit :
J'ai désormais un nouveau soucis depuis que mon thread appel une autre méthode que repaint().
Au lancement mon programme créé un thread qui va donc appeller la méthode loadImage() toutes les secondes par exemple.
J'ai mis en place un bouton "stop" et un bouton "resume" sur ma page web. Ces boutons demandent au programme de tuer le thread (interrupt) ou de le relancer (new Thread(...)).
Le soucis c'est que lorsque mon thread faisait "repaint" (le chargement de l'image était alors dans la méthode paint) cela fonctionnait, maintenant que le thread appel la méthode "loadImage", au début ça fonctionne, lorsque je fais "stop" ça fonctionne mais lorsque je fais "resume" j'ai le droit à une exception :
Code :
|
C'est embêtant puisque je dois faire une présentation demain...
Merci d'avance.
Message édité par Hyome le 04-05-2009 à 14:14:24
Je pense que ton stop est un peu trop violent.
Le problème est avec ton téléchargement. Tu as une socket ouverte pour le téléchargement. Si tu coupes le thread, est-ce que tu refermes bien la connexion et est-ce qeu tu en rouvre une sur le Resume ?
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Il me semble que tout est automatisé sous Java mais je n'en suis pas sûr.
J'ai trouvé une solution :
- Mettre un boolean "isEnabled" sur chaque vueCamera
Du coup le thread ne rafraichi sa vueCamera que si "isEnabled == true" et voilà c'est réglé.
Bon au final mon applet est finie, j'ai juste tenté d'afficher avec un GirdBagLayout lorsque j'avais plusieurs caméras à afficher mais je suis vite revenu au GridLayout.
En tout cas merci !!!
à bientôt
Il y a 994 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
