Se connecter / S'enregistrer
Votre question

[JAVA] Problème de rafraichissement d'une vue sur un applet

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
24 Avril 2009 13:49:57

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 :
  1. public void goCameraView(){
  2. view_.goCameraView(url_);
  3. view_.setSize(view_.getSize());
  4. thread_ = new MyThread(view_.getCameraView().getCameraPicture());
  5. thread_.start();
  6. view_.revalidate();
  7. }


  1. public void goHomeView(){
  2. //If the refreshing thread is running, we stop it.
  3. if(thread_.isAlive()){
  4. System.out.println("[Modele] Fin du thread");
  5. thread_.interrupt();
  6. }
  7. //Then, we display the home menu.
  8. view_.goHomeView();
  9. view_.revalidate();
  10. }


Cela fait 2 jours que je suis à la recherche d'une solution et pour le moment je suis bloqué...

Merci d'avance.

Autres pages sur : java probleme rafraichissement vue applet

a b L Programmation
24 Avril 2009 20:02:12

Si tu surcharges la méthode paint, lorsque tu fais un repaint, est-elle appelée?
27 Avril 2009 08:57:07

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.
Contenus similaires
27 Avril 2009 09:46:35

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.
27 Avril 2009 16:56:17

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.
a b L Programmation
27 Avril 2009 20:42:42

J'ai pas compris comment tu rafraichis l'image.
28 Avril 2009 11:47:09

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).
a b L Programmation
28 Avril 2009 21:55:49

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.
29 Avril 2009 09:41:58

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" ?
a b L Programmation
29 Avril 2009 20:40:25

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.
30 Avril 2009 10:53:50

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.
a b L Programmation
30 Avril 2009 20:28:15

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.
4 Mai 2009 12:02:57

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 :

  1. Exception in thread "Thread-12" java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.***.***:**** connect,resolve)
  2. at java.security.AccessControlContext.checkPermission(Unknown Source)
  3. at java.security.AccessController.checkPermission(Unknown Source)
  4. at java.lang.SecurityManager.checkPermission(Unknown Source)
  5. at java.lang.SecurityManager.checkConnect(Unknown Source)
  6. at sun.plugin2.applet.Applet2SecurityManager.checkConnect(Unknown Source)
  7. at sun.net.<a href="http://www.http.HttpClient.openServer" rel="nofollow" target="_blank">www.http.HttpClient.openServer</a>(Unknown Source)
  8. at sun.net.<a href="http://www.http.HttpClient.&lt" rel="nofollow" target="_blank">www.http.HttpClient.&lt</a>;init>(Unknown Source)
  9. at sun.net.<a href="http://www.http.HttpClient.New" rel="nofollow" target="_blank">www.http.HttpClient.New</a>(Unknown Source)
  10. at sun.net.<a href="http://www.http.HttpClient.New" rel="nofollow" target="_blank">www.http.HttpClient.New</a>(Unknown Source)
  11. at sun.net.<a href="http://www.protocol.http.HttpURLConnection.getNewHttpClient" rel="nofollow" target="_blank">www.protocol.http.HttpURLConnection.getNewHttpClient</a>(Unknown Source)
  12. at sun.net.<a href="http://www.protocol.http.HttpURLConnection.plainConnect" rel="nofollow" target="_blank">www.protocol.http.HttpURLConnection.plainConnect</a>(Unknown Source)
  13. at sun.net.<a href="http://www.protocol.http.HttpURLConnection.connect" rel="nofollow" target="_blank">www.protocol.http.HttpURLConnection.connect</a>(Unknown Source)
  14. at sun.net.<a href="http://www.protocol.http.HttpURLConnection.getInputStream" rel="nofollow" target="_blank">www.protocol.http.HttpURLConnection.getInputStream</a>(Unknown Source)
  15. at java.net.URL.openStream(Unknown Source)
  16. at javax.imageio.ImageIO.read(Unknown Source)
  17. at view.View.loadImage(View.java:73)
  18. at model.MyThread.run(MyThread.java:34)


C'est embêtant puisque je dois faire une présentation demain...

Merci d'avance.

a b L Programmation
5 Mai 2009 21:02:02

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 ?
6 Mai 2009 10:08:12

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
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS