Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3100 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Problème de raffraichissement d'élement swing

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de raffraichissement d'élement swing

n°1939195
Siron
Posté le 09-11-2009 à 22:20:45  profilanswer
 

Bonjour, je suis en train de coder un interface swing et je suis confronté à un problème de rafraichissement, voici le code concerné :
 
Un bouton swing avec une méthode associée :

Code :
  1. validateButton.addActionListener(new java.awt.event.ActionListener() {
  2.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  3.  validateButtonPA();
  4.             }
  5.         });


 
Ce que fait la méthode :

Code :
  1. private void validateButtonPA(){
  2. SwingUtilities.invokeLater(new Runnable() {
  3.           public void run() {
  4.             informationArea.setText("Recherche du Naming Service en cours." );
  5.           }
  6.         });
  7. ..................(reste du code de traitement) ..........................
  8. }


 
Le problème est que avec ou sans le invokeLater, le setText ne prend effet que après le code de traitement qui suit.  J'ai beau avoir essayé de rajouter des repaint, revalidate, .... rien n'y fait.
 
Je ne comprends pas ce qui ne va pas, j'ai essayé de suivre le tuto se trouvant à cette adresse http://gfx.developpez.com/tutoriel [...] threading/, mais ça ne semble pas fonctionner comme indiqué.
 
Si quelqu'un voit ce qui ne va pas, merci de ma le signaler  :jap: .
 

mood
Publicité
Posté le 09-11-2009 à 22:20:45  profilanswer
 

n°1939240
cbeyls
Hail to the King, Baby
Posté le 09-11-2009 à 23:53:57  profilanswer
 

Apparemment tu n'as jamais entendu parler du thread graphique et tu ne sais pas à quoi sert InvokeLater.
 
Donc c'est simple, quand tu cliques sur le bouton, le thread de Swing qui s'occupe de dessiner les fenêtres et réagir aux événements appelle ta méthode validateButtonPA().
Dans cette méthode, tu peux modifier le GUI et lancer des traitements. Donc pas besoin d'InvokeLater ici puisqu'on est déjà dans le thread de Swing.
Ensuite tu as un gros code de traitement. Le traitement en lui-même, tu ne peux pas le faire dans le thread de Swing sinon ton interface graphique freeze puisqu'au lieu de dessiner tes fenêtres, Swing sera occupé à faire tes calculs (c'est le problème que tu observes). Tu dois donc lancer le traitement dans un nouveau thread, et à la fin de celui-ci, tu appelles une fonction au moyen de InvokeLater afin de mettre à jour ton GUI via thread de Swing.
 
Au niveau du code ça donne un truc comme ça:
 
 

Code :
  1. private void validateButtonPA(){
  2.   informationArea.setText("Recherche du Naming Service en cours." );
  3.   new Thread() {
  4.      public void run() {
  5.         // Traitement lourd
  6.         // ...
  7.         SwingUtilities.invokeLater(new Runnable() {
  8.            public void run() {
  9.               informationArea.setText("Recherche du Naming Service terminée." );
  10.            }
  11.         });
  12.      }
  13.   }.start();
  14. }


Message édité par cbeyls le 09-11-2009 à 23:55:50
n°1939300
Siron
Posté le 10-11-2009 à 10:09:26  profilanswer
 

En fait je connais ce qu'est l'EDT, mais une méprise de ma part sur une explication du tutoriel ma fait penser que le actionPerformed s'exécutait dans un thread dédier à l'écoute.
 
J'ai utilisé la classe SwingWorker finalement, et ça fonctionne, mais il y a un truc que je ne comprends pas vis-à-vis de ma situation précédente :
 
Si je fais dans l'EDT :
 

Code :
  1. informationArea.setText("Recherche du Naming Service terminée." );
  2. informationArea.repaint()
  3. //Traitement lourd //


 
Le traitement lourd se situe après la demande de mise à jour de l'interface, pourquoi dès lors l'EDT ne met-il pas à jour l'interface avant de travailler sur le traitement lourd ?
 
Merci pour l'aide  :jap: .

n°1939403
jogrey
Posté le 10-11-2009 à 14:32:35  profilanswer
 

A cause de l'ordre des évènements ?

n°1939457
cbeyls
Hail to the King, Baby
Posté le 10-11-2009 à 17:46:30  profilanswer
 

Parce que l'EDT fait le travail de redessin de la fenêtre à la fin de l'exécution de ton bloc de traitement des événements. Par souci d'optimisation, il ne lance pas de procédure de redessin à chaque fois qu'on change une propriété du GUI, comme dans ce cas-ci le texte d'un Label. Quand tu changes le texte du Label ou même quand tu appelles repaint(), tu ne fais que demander un redessin ultérieur. Swing fonctionne comme une file d'attente, il attend donc la fin de ton code pour lancer l'opération de dessin suivante, c'est d'ailleurs pour cela que invokeLater() s'appelle invokeLater() et pas invokeNow() :)
C'est pour cela aussi qu'il ne faut jamais bloquer le thread de l'EDT, il doit tourner en permanence pour que l'interface graphique réponde correctement.


Message édité par cbeyls le 10-11-2009 à 17:51:31
n°1939515
Siron
Posté le 10-11-2009 à 22:14:10  profilanswer
 

Merci pour les précisions  :) .


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Problème de raffraichissement d'élement swing

 

Sujets relatifs
Probleme de superposition JLabel sur JFrame-avec-BackgroundSelect lié en JS+PHP : problème avec IE
Problème de librairies dynamiquesEclipse, SVN, EJB (probleme)
Problème rapidité de mise en pauseProblème fichier de configuration hibernate
Probleme d'écriture pour un client (JAVA)probléme d'insertion de caractères accentués dans un xml via php
probléme d'insertion de caractères accentués dans un xml via phpProblème placement JButton
Plus de sujets relatifs à : Problème de raffraichissement d'élement swing


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR