[JAVA] Problème de rafraichissement d'une vue sur un applet
Dernière réponse : dans Programmation
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 :
Cela fait 2 jours que je suis à la recherche d'une solution et pour le moment je suis bloqué...
Merci d'avance.
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 :
public void goCameraView(){ view_.goCameraView(url_); view_.setSize(view_.getSize()); thread_ = new MyThread(view_.getCameraView().getCameraPicture()); thread_.start(); view_.revalidate(); }
public void goHomeView(){ //If the refreshing thread is running, we stop it. if(thread_.isAlive()){ System.out.println("[Modele] Fin du thread"); thread_.interrupt(); } //Then, we display the home menu. view_.goHomeView(); view_.revalidate(); }
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
Lassé par la pub ? Créez un compte
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.
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.
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.
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.
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" ?
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" ?
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.
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.
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.
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.
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 :
C'est embêtant puisque je dois faire une présentation demain...
Merci d'avance.
--------------
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 :
Exception in thread "Thread-12" java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.***.***:**** connect,resolve) at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at java.lang.SecurityManager.checkConnect(Unknown Source) at sun.plugin2.applet.Applet2SecurityManager.checkConnect(Unknown Source) at sun.net.<a href="http://www.http.HttpClient.openServer" target="_blank">www.http.HttpClient.openServer</a>(Unknown Source) at sun.net.<a href="http://www.http.HttpClient.<" target="_blank">www.http.HttpClient.<</a>;init>(Unknown Source) at sun.net.<a href="http://www.http.HttpClient.New" target="_blank">www.http.HttpClient.New</a>(Unknown Source) at sun.net.<a href="http://www.http.HttpClient.New" target="_blank">www.http.HttpClient.New</a>(Unknown Source) at sun.net.<a href="http://www.protocol.http.HttpURLConnection.getNewHttpClient" target="_blank">www.protocol.http.HttpURLConnection.getNewHttpClient</a>(Unknown Source) at sun.net.<a href="http://www.protocol.http.HttpURLConnection.plainConnect" target="_blank">www.protocol.http.HttpURLConnection.plainConnect</a>(Unknown Source) at sun.net.<a href="http://www.protocol.http.HttpURLConnection.connect" target="_blank">www.protocol.http.HttpURLConnection.connect</a>(Unknown Source) at sun.net.<a href="http://www.protocol.http.HttpURLConnection.getInputStream" target="_blank">www.protocol.http.HttpURLConnection.getInputStream</a>(Unknown Source) at java.net.URL.openStream(Unknown Source) at javax.imageio.ImageIO.read(Unknown Source) at view.View.loadImage(View.java:73) at model.MyThread.run(MyThread.java:34)
C'est embêtant puisque je dois faire une présentation demain...
Merci d'avance.
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
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
Lassé par la pub ? Créez un compte
- Contenus similaires :