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 :

Swing Event Dispatching Thread


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 59
    Points : 76
    Points
    76
    Par défaut Swing Event Dispatching Thread
    hello

    Je développe en ce moment une application java desktop : Swing + Spring.

    J'ai lu quelques articles et tutoriels et il semble que toute création de composant swing, enfin tout ce qui est lié a swing doit être réalisé au sein d'un thread bien précis : l'Event Dispatching Thread. Pour faire cela, il faut créer un objet type Runnable qui dans sa méthode run() contient notre code swing (création d'une JFrame, ...).
    Ensuite donner cet objet Runnable en paramètre à la méthode invokeLater de la classe SwingUtilities. Cela place donc notre requete pour une nouvelle JFrame dans l'EventQueue.
    Tout ceci permet d'éviter des problèmes de concurrence entre Thread étant donné que les composant de Swing ne sont pas thread safe.

    Est-ce que j'ai bien compris ?

    Si oui, le projet Spring RCP, qui vient de connaitre une nouvelle release, instantie des JFrame (par exemple le SplashScreen) directement dans le container Spring et ne respecte donc pas la règle de l'EDT ?

    Quelqu'un peut-il m'éclairer ?

  2. #2
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Ce qui doit être fait dans l'EDT c'est ce qui est dessin des fenêtres, affichage, modifications.
    Tu peux très bien instancier une JFrame dans un autre thread, par contre le setVisible(true) devra être appelé dans l'EDT.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 59
    Points : 76
    Points
    76
    Par défaut
    Eh bien je n'en suis pas certain !
    Selon le livre "Filthy Rich Clients" de Chet Haase et Romain Guy, même la création d'un composant Swing doit se faire au sein de l'EDT !
    Because the JFrame is a Swing component, and because it instantiates another Swing component, it should be created on the EDT, not on the main thread.
    du livre "Filthy Rich Clients" de Chet Haase et Romain Guy

  4. #4
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par YeFFreY Voir le message
    Eh bien je n'en suis pas certain !
    Selon le livre "Filthy Rich Clients" de Chet Haase et Romain Guy, même la création d'un composant Swing doit se faire au sein de l'EDT !

    du livre "Filthy Rich Clients" de Chet Haase et Romain Guy
    Bizarre, je ne comprends pas pourquoi ils devraient être instanciés dans l'EDT, ce n'est qu'une création d'objet, il n'y a aucun événement particulier qui arrive dans le cadre d'un comportement standard tant que la fenêtre n'est pas affichée à l'écran.

    Il y a peut-être quelque chose que je n'ai pas compris.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 59
    Points : 76
    Points
    76
    Par défaut
    ou alors c'est moi qui comprend pas

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 179
    Points : 216
    Points
    216
    Par défaut
    Même si, comme natha, je ne vois pas ce que ça change tant que la frame n'est pas visible, je me suis rangé du coté des recommandations de Sun et j'ai modifié toutes mes interfaces pour qu'elles soient écrites comme il le préconise.
    Même si ça ne fait pas de bien, ça ne peut pas faire de mal

    http://java.sun.com/docs/books/tutor...y/initial.html

    Fred
    Fred

  7. #7
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Oui alors pour être plus précis, le cas décris ici est le fait de ne pas créer la première frame sur le main thread, mais sur l'EDT. Là ok, c'est clair que c'est mieux comme ça.
    Par contre rien n'empêche ensuite de créer tes frames et composants dans d'autres threads lorsque celà s'avère nécessaire car leur création prend du temps.
    J'ai des écrans qui peuvent prendre entre 4 et 16s pour leur première exécution, j'ai donc préféré les créer dans d'autres threads (worker ou pas selon les cas) et faire le setVisible dans l'EDT.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 59
    Points : 76
    Points
    76
    Par défaut
    Ce que tu dit, natha, me semble logique mais je suis rempli de confusions car les règles relatives à l'EDT ne sont expliquées clairement et précisément nulle part

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 59
    Points : 76
    Points
    76
    Par défaut
    En provenance du tutoriel Swing sur le site de Sun :
    Why does not the initial thread simply create the GUI itself? Because almost all code that creates or interacts with Swing components must run on the event dispatch thread.
    Le lien : http://java.sun.com/docs/books/tutor...y/initial.html

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 179
    Points : 216
    Points
    216
    Par défaut
    Citation Envoyé par natha Voir le message
    Par contre rien n'empêche ensuite de créer tes frames et composants dans d'autres threads lorsque celà s'avère nécessaire car leur création prend du temps.
    Comme je l'ai déjà dit je suis parfaitement d'accord avec toi.

    D'ailleurs j'ai une application dont l'interface principale est créée dans l'EDT, mais dont une partie est construite à la volée en fonction des actions de l'utilisateur et elle bien construite dans un thread séparé.

    Mais lors de la construction de cette partie j'ai du alterner des parties de code exécutées dans le thread et d'autres que je différais dans l'EDT. Si on fait tout dans le thread, certaines fonctions vont elle-mêmes poster des actions dans l'EDT (un setText() va poster un repaint() dans l'EDT). Sans ça, j'avais des parties de mon nouveau panel qui s'affichait avant que le panel soit lui-même dessiné (celles où j'avais fait le setText()).

    En espérant avoir fait avancer un peu le shmilblick

    Fred
    Fred

  11. #11
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par kwxyz Voir le message
    Mais lors de la construction de cette partie j'ai du alterner des parties de code exécutées dans le thread et d'autres que je différais dans l'EDT. Si on fait tout dans le thread, certaines fonctions vont elle-mêmes poster des actions dans l'EDT (un setText() va poster un repaint() dans l'EDT). Sans ça, j'avais des parties de mon nouveau panel qui s'affichait avant que le panel soit lui-même dessiné (celles où j'avais fait le setText()).
    C'est dans ce genre de cas où l'utilisation d'un Worker est indiquée. Ca offre ce qu'il faut pour effectuer le traitement lourd dans un thread et interragir avec l'EDT à certains moments.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 179
    Points : 216
    Points
    216
    Par défaut
    Citation Envoyé par natha Voir le message
    C'est dans ce genre de cas où l'utilisation d'un Worker est indiquée. Ca offre ce qu'il faut pour effectuer le traitement lourd dans un thread et interragir avec l'EDT à certains moments.
    A bah tiens, voilà un truc que je ne connais pas.
    J'y jetterai un œil à l'occasion, merci.

    Fred
    Fred

  13. #13
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    SwingWorker la classe, dans l'API depuis Java6, sinon c'est une classe à downloader sur le net.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  14. #14
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Quelques infos complémentaire concernant SwingWorker :




    Sinon pour moi il n'y a rien de problématique à créer/modifier une JFrame dans un autre thread tant qu'elle n'est pas visible et qu'il n'y a aucune relation avec des composants visibles...

    a++

  15. #15
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Sinon pour moi il n'y a rien de problématique à créer/modifier une JFrame dans un autre thread tant qu'elle n'est pas visible et qu'il n'y a aucune relation avec des composants visibles...
    Justement, il n'y aucun garantie que l'implémentation ne fasse pas des choses qui devraient être faites dans l'EDT, donc il faut éviter cela.
    Romain Guy
    Android - Mon livre - Mon blog

Discussions similaires

  1. Swing et les thread, pour changer..
    Par Golgotha dans le forum EDT/SwingWorker
    Réponses: 5
    Dernier message: 06/10/2008, 13h57
  2. Réponses: 2
    Dernier message: 30/04/2008, 14h40
  3. Swing et les threads
    Par mhamedbj dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 30/01/2008, 12h11
  4. [SWING] JPanel multi-threading
    Par raj dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 12/02/2007, 07h52
  5. [swing] Probleme de thread avec Timer
    Par issou dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 13/05/2006, 22h52

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