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 :

Question "idiote" : instanciation de JFrame couteuse dans doInBackground


Sujet :

EDT/SwingWorker Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 43
    Points : 28
    Points
    28
    Par défaut Question "idiote" : instanciation de JFrame couteuse dans doInBackground
    Hello,

    J'ai une Jframe assez longue à construire (disons 2 secondes).

    Lorsque j'associe sa création à une action (un bouton par ex), l'IHM freeze pendant 2 secondes, donc.

    Ma question est la suivante:

    Est ce une bonne pratique d'instancier la JFrame dans la méthode doInBackground (donc pas de freeze de 2 sec), bien que cela soit un objet graphique qui hérite de JFrame, et qui donc devrait etre dans le done() ?

    Questions subsidiaires:

    Que se passe-t-il concretement si j'instancie une JFrame dans doInBackground ? Y a t il risque de bug d'affichage vu que c'est pas dans l'EDT ? Swing est il assez "malin" pour détecter qu'il faut afficher la frame, bien que ce ne soit pas a priori dans le thread d'affichage ?

    J'aurai tendance à répondre oui à la derniere question vu que je l'ai testé et que ca s'affiche correctement, sans freeze ni bug bizarre, mais est-ce à faire ?

    Je crains que la best practive m'incite a freezer mon IHM le temps de l'instanciation. Bien sûr la creation de frame n'est peut etre pas optimale, mais je dois faire avec.

    Merci d'avance pour vos reponses

  2. #2
    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
    Oui il y a risque de problème d'affichage. En effet le doInBackground se passe en dehors de l'EDT (Event Dispatch Thread) et non dans celui ci. Or tous les composants Swing doivent être créés dans l'EDT.

    Toutefois je doute que ce soit la création même de la JFrame qui pose problème, mais plus probablement les actions non Swing que tu réalise lors de cette instanciation. Quelles sont elles.
    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.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    En fait il y a des appels de services qui conditionnent la création d'éléments graphiques, donc je suis obligé d'attendre le resultat de plusieurs appels pour construire ma frame.

    J'utilise du HMVC (Hierarchical MVC) qui fait que le parent crée pas mal d'enfants directement dans son constructeur. D'où les 2 secondes de création de la frame, pour peu que ces enfants aient des enfants qui nécessitent d'autres appels de service, etc.

    Idealement je devrais refactorer le code pour mieux utiliser les SwingWorkers, mais on est plusieurs à travailler sur cette frame et je peux pas tout vérifier.

    Je voulais voir si je pouvais passer ma frame dans le doInBackground sans trop de risques pour une meilleure reactivité de l'IHM

  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
    Ce sont les appels de services qui doivent être réalisés dans le doInBackground, et uniquement ceux ci.

    Puis il te faut instancier ta JFrame une fois l'exécution des services achevée. Ou alors créer ta JFrame, lui affecter les composants sans leurs données puis affercter les données aux composants dans la méthode done du SwingWorker ( celle ci étant appelée dans l'EDT).
    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
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    C'est bien ce que je me disais...

    Merci pour ta réponse !

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

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