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

Agents de placement/Fenêtres Java Discussion :

Problème JDialog et Thread


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 36
    Par défaut Problème JDialog et Thread
    hello,

    encore moi
    cette fois ci mon probleme est la fabrication d'une fenetre attente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    private void mettreAJourAccord(){
            final JDialog parent = this;
            if(fen == null)
                fen = new FenetreAttente(parent,false);
            fen.definirMessage("En attente");
     
     
            encours = true;
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    fen.afficher();
                    fen.repaint();
                    try{
                        System.out.println("depart pause");
                        Thread.sleep(5000);
                        System.out.println("pause finie");
                    }catch(InterruptedException iexc){
                        System.out.println("erreur:"+iexc.getLocalizedMessage());
                    }
     
     
                    encours = false;
                }
     
            });
     
     
            //fen.definirMessage("Importation terminée.Merci.\nVous pouvez fermer.");
            //fen.afficher();
     
     
        }
    quand je lance ce code
    ma FenetreAttente s affiche mais pas le texte a l interieur
    il n apparait une fois que mon run est termine

    je comprends
    comme d habitude toutes les pistes sont permises
    j ai essaye enormement de chose mais la je bloque

  2. #2
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 36
    Par défaut
    j ai resolu mon probleme
    en creant une interface EcouteurFenetreAttente
    comme ca j appelle ma JDialog en modale
    et c est elle qui appel le traitement de ma fenetre principale et j ai plus de probleme via l ecouteur

  3. #3
    Membre émérite Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Par défaut
    Tu ne dois pas appeller la méthode run, mais la méthode start, qui va lancer un thread séparé

  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
    Il ne faut EN AUCUN CAS faire d'action longue dans l'EDT.

    Or en faisant un invokeLater tu exécutes le code présent dans la méthode run dans l'EDT.

    Et que contient ce run dans ton cas?

    Un bon vieux Thread.sleep() des familles qui bloque l'EDT de la plus belle des manières.

    D'où ton problème.

    Donc je te conseille de façon impérative de lire le tutoriel suivant qui explique les tenants et aboutissants de la gestion de l'EDT et des Threads.

    http://gfx.developpez.com/tutoriel/j...ing-threading/

    De fait le invokeLater doit être utilisé depuis un Thread externes et ne doit contenir que les actions modifiant les composants Swing, et surtout pas le reste qui doit être exécuté dans le thread englobant.

    Dans ton cas voici la marche à suivre:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    private void mettreAJourAccord(){
        final JDialog parent = this;
        if(fen == null) {
            fen = new FenetreAttente(parent,false);
        }
        fen.definirMessage("En attente");
        encours = true;
        new Thread( new Runnable() {
            public void run() {
                SwingUtilities.invokeLater( new Runnable() {
                    public void run() {
                        fen.afficher();
                        fen.repaint();
                    }
                });
                try{
                    System.out.println("depart pause");
                    Thread.sleep(5000);
                    System.out.println("pause finie");
                }catch(InterruptedException iexc){
                    System.out.println("erreur:"+iexc.getLocalizedMessage());
                }
                encours = false;
     
                SwingUtilities.invokeLater( new Runnable() {
                    public void run() {
                        fen.definirMessage("Importation terminée.Merci.\nVous pouvez fermer.");
                    }
                });
                //);    
            }            
        }).start();    
    }

  5. #5
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 36
    Par défaut
    mon thread.sleep
    c est pour simuler une action
    s je fais un ivokelater
    c est que je veux que mon edt gere cela
    c est une fenetre qui s affiche
    mais effectivement un start optimesera mon thread puisque que je le sors su pool
    de thread de l edt

    mais bon je suis passe par un systeme de threadgroup
    different plus propre

    merci pour vos reponses constructive

  6. #6
    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
    Dans l'absolu, la façon la plus propre serait de passer par un SwingWorker.

    En effet ton ThreadGroup pose problème, puisque qu'il faut éviter à tout prix de modifier des composants Swing en dehors de l'EDT (Swing n'étant pas un API threadsafe, comme la majorité des toolkits graphiques)

    http://rom.developpez.com/java-swingworker/

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

Discussions similaires

  1. [Jdialog] Problème JDialog modale et Thread
    Par Oreste dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 12/06/2008, 11h55
  2. problème sur les threads et les sémaphores
    Par ramislebob dans le forum Windows
    Réponses: 1
    Dernier message: 29/06/2006, 12h52
  3. [C#] Problème sur un Thread
    Par bisounux dans le forum Windows Forms
    Réponses: 7
    Dernier message: 27/04/2006, 21h43
  4. Problème dans un thread
    Par BNS dans le forum MFC
    Réponses: 3
    Dernier message: 23/03/2006, 15h21
  5. Réponses: 5
    Dernier message: 10/05/2005, 11h22

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