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 :

SwingWorker ou invokeLater ?


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre régulier
    Homme Profil pro
    Dévelopeur Cobol + Java J2SE
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dévelopeur Cobol + Java J2SE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Points : 77
    Points
    77
    Par défaut SwingWorker ou invokeLater ?
    Bonjour, je commence à avoir lu beaucoup d articles sur l'EDT, les threads, mais je reste dans le doûte. Faut il que j'utilise un swingworker ou bien swingutilities.invokeLater (comme ci dessous, code simplifié) ? Sur quels critères doit on décider ?
    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
    public class A110StdListener implements KeyListener {
       @Override
       public void keyReleased(KeyEvent e) {
          if (e.getKeyCode() == KeyEvent.VK_ENTER
              P300traitement();
       }
     
    public void P300traitement(){                          
       vue.getGlassPane().setVisible(true);
       SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            boolean isOk = lastContexte().P120cleIsOK();
            vue.getGlassPane().setVisible(false);
          }
       });
       pack(); 
       //--> attente d'un nouvel événement de l'utilisateur
    En fait j'ai surtout besoin d'un thread depuis que je veux rajouter un glasspane d'attente pour ma méthode P120cleIsOK qui dure environs 2 secondes.
    Pour mémoire, cette méthode
    • agit (modif texte, couleur etc...) sur les composants de mon panel (JComboBox, JTextField, JLabel ...)
    • fait des accès bdd (lecture, mise à jour)

    J'ai trouvé pas mal cette page Oracle SDN, clair et concise.

  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
    L'un ou l'autre, peu importe, tant que tu fais tes opérations longues dans un thread séparé et les modifications des composants dans le thread Swing.

    Le SwingWorker est un utilitaire qui vient faciliter cette tâche, mais en background il utilise plus ou moins un Thread pour la méthode doInBackground et du SwingUtilities.invokeLater qui entoure l'exécution de la méthode done.


    Dans ton exemple tu utilises de façon incorrecte le invokeLater.

    La façon de faire sans SwingWorker serait la suivante:

    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
     
    public void P300traitement(){                          
        vue.getGlassPane().setVisible(true);
        new Thread(new Runnable() {
            public void run() {
                boolean isOk = lastContexte().P120cleIsOK();
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        vue.getGlassPane().setVisible(false);
                        pack(); 
                    }
                });
            }
        }).start();
    }
    Avec un SwingWorker ça donnerait:

    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
    public void P300traitement(){                          
        vue.getGlassPane().setVisible(true);
        SwingWorker worker = new SwingWorker<Boolean, Void>() {
            @Override
            public Boolean doInBackground() {
                return lastContexte().P120cleIsOK();
            }
     
            @Override
            public void done() {
                vue.getGlassPane().setVisible(false);
                pack(); 
            }
        };
        worker.execute();
    }
    En général l'approche utilisant un SwingWorker est plus propre niveau coding, ça évite d'empiler des Runnable dans tous les sens, par exemple
    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
    Membre régulier
    Homme Profil pro
    Dévelopeur Cobol + Java J2SE
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dévelopeur Cobol + Java J2SE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Points : 77
    Points
    77
    Par défaut magnifique, merci
    c'est magnifique merci beaucoup;

    effectivement je constatais un problème (après avoir pris la méthode invokelater) d'exécution suite à mon mauvais coding.

    Je prends donc ta solution swingworker et je vais me pencher sur cette classe pour mieux comprendre.

    Est ce indispensable de mettre le pack dans la méthode done() ou bien puis je l'exécuter après le worker.execute() ? (le code que j'ai envoyé est un peu simplifié).

  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
    Tout dépend du moment auquel tu veux que le pack s'exécute.
    Si c'est avant le déroulement des opération, tu peux le mettre après le execute.
    Si c'est après le déroulement des opérations, il devra impérativement être dans le done. La méthode execute n'attendant pas la fin de l'exécution du swingworker pour rendre la main.
    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 régulier
    Homme Profil pro
    Dévelopeur Cobol + Java J2SE
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dévelopeur Cobol + Java J2SE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Points : 77
    Points
    77
    Par défaut merci
    bon merci BEAUCOUP sinok, j'ai ttes mes réponses, je clos le sujet.

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

Discussions similaires

  1. [SwingWorker] invokeLater et surchage de run()
    Par SpecialCharacter dans le forum EDT/SwingWorker
    Réponses: 4
    Dernier message: 14/02/2008, 10h26
  2. SwingWorker / dans le sens contraire?
    Par ®om dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 11/11/2006, 12h35
  3. Réponses: 9
    Dernier message: 17/08/2006, 12h20
  4. EDT invokeLater et applet
    Par biozaxx dans le forum EDT/SwingWorker
    Réponses: 8
    Dernier message: 11/07/2006, 18h09
  5. Réponses: 17
    Dernier message: 10/07/2006, 19h13

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