IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDT/SwingWorker Java Discussion :

actionPerformed(ActionEvent e) --> revalidate() et repaint() ne fonctionnent pas ?


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 36
    Points : 24
    Points
    24
    Par défaut actionPerformed(ActionEvent e) --> revalidate() et repaint() ne fonctionnent pas ?
    Bonjour à tous,

    Voilà quelques jours que je cherche ce qui coince dans ce code.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Bouton2Listener implements ActionListener {
        	
    		public void actionPerformed(ActionEvent e){
    
    instruction1; // cela affiche un texte du style "traitement en cours..."
    instruction2;
    panel.revalidate();
    panel.repaint();
    
    fonction();
    
    }

    Tout fonctionne à merveille, sauf que l'affichage ne se met à jour qu'après l'exécution de la méthode "fonction" !

    Je suppose qu'en utilisant les threads, je vais pouvoir résoudre mon problème, mais je cherche une solution plus simple...

    C'est d'autant plus énervant que "System.out.println" me renvoie le texte au bon moment...

  2. #2
    Membre du Club
    Profil pro
    Architecte logiciel
    Inscrit en
    Janvier 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 28
    Points : 48
    Points
    48
    Par défaut
    si ton action listener s'execute dans la thread de swing, ce qui est normal.
    si ta fonction "fonction()" est lente.
    alors c'est qu'elle n'a rien a faire la et qu'elle fige ton interface.
    - eventuellement appelle la avec un SwingUtility.invokeLater(), mais c'est pas forcement terrible ( sauf si elle meme joue avec l'interface, mais tu va continuer a figer l'interface au cycle d'apres (mais tu auras eut ton rafraichissement).
    - envois la s'executer via un ExecutorService ou autre moyen de rendre cet appel asynchrone comme creer un thread directement. mais dans tout les cas attention au probleme de reentrance dans ta fonction si tu ne dois l'executer qu'une seul fois a la fois (suis je clair?) .

  3. #3
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    C'est normal que ta méthode fonction() soit exécuté avant.
    Le repaint() n'est pas exécute immédiatement. Il signale juste à la JVM qu'il veut être rafraichi en "levant la main".
    Ce n'est que lorsque le "truc"(me rappel plus du nom ) passera devant et qu'il verra la main levé qu'il rafraichira ton écran. (toutes les 15ms me semble en moyenne).

    Il n'y a pas de solution miracle. Détails ce que tu souhaites faire pour que l'on puisse de donner la bonne architecture à adopter
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Ca ne se résoudra pas sans utiliser de Thread pour ton instruction longue. En effet ton instruction longue, si elle est appelées dans le Thread Swing (aka EDT), va bloquer toute opération de rendu de l'interface. Les opération de rendu en Swing ne sont pas effectuée dès l'appel de la méthode du composant, mais mise dans une File qui le Thread de rendu déroule au fur et à mesure.

    En appelant sauvagement une instruction Longue dans ce Thread, tu empêches celui ci de dérouler tout ce que contient la file, donc ton instruction1 qui se trouvait dans la file ne s'exécute pas.
    Donc ton texte ne s'affiche pas, CQFD.

    Pour comprendre les tenants et aboutissants de l'intégration Swing/Threads, la lecture du tuto suivant est impérative.
    http://gfx.developpez.com/tutoriel/j...ing-threading/
    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.

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Salut,

    Super !
    sinok, le tuto est intéressant et tes explications claires.
    Ivelios, si tu te rappelles du nom du "truc", cela m'intéresse.
    fallo, ta solution est celle donnée par sinok, ta réponse était hyper rapide.

    Merci à tous les trois ; cela a fonctionné parfaitement.

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Le truc dont parle Ivelios est l'EDT (via le RepaintManager), en fait l'appel repaint poste une demain de rafraîchissement au RepaintManager, donc forcément, si tu exécutes une action bloquante au préalable, c'est foutu, vu que l'EDT ne pourra faire appel au RepaintManager.
    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.

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    sinok.


    Je suppose qu'en utilisant les threads, je vais pouvoir résoudre mon problème, mais je cherche une solution plus simple...
    Je devais donc utiliser les threads.
    C'est génial les forums quand on sait ce qu'on cherche, où demander et que la communauté est réactive.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/04/2014, 11h16
  2. JFrame repaint ne fonctionne pas
    Par Asli Bilal dans le forum Agents de placement/Fenêtres
    Réponses: 0
    Dernier message: 04/05/2013, 22h40
  3. ne pas dupliquer des actionPerformed(ActionEvent e)
    Par oc_alex86 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 30/05/2007, 15h10
  4. probleme avec actionPerformed(ActionEvent e)
    Par Asmod_D dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 24/03/2007, 10h12
  5. repaint qui marche pas
    Par burhud dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 12/11/2006, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo