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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 43
    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 confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    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.

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 43
    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 confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    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).

  5. #5
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 43
    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