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

Concurrence et multi-thread Java Discussion :

Accéder à une interface swing à partir d'un thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 259
    Points : 97
    Points
    97
    Par défaut Accéder à une interface swing à partir d'un thread
    Bonjour,

    Pour ne pas geler une interface pendant un long traitement, je me sers d'un thread (méthode run).
    Pendant le traitement, je voudrais intéragir sur l'interface (désactiver des boutons, afficher un état, etc ...).

    Pour pouvoir y accéder, je suis obligé de déclarer tous les composants de l'interface comme étant public static. Est-ce normal (public oui mais static ?), est-ce de cette manière qu'il faut procéder ?

    Je voudrais faire quelque chose de propre.

    Merci !

  2. #2
    Membre confirmé Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Points : 510
    Points
    510
    Par défaut
    Il faut accéder à swing avec les méthodes javax.swing.SwingUtilities.invokeAndWait(...) ou invokeLater (plutot invokeLater). Tu trouveras plein d'infos partout là dessus à partir de ces mots clefs. Sinon, reparles-en nous.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 259
    Points : 97
    Points
    97
    Par défaut
    Merci, je cherche !
    A bientôt.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 259
    Points : 97
    Points
    97
    Par défaut
    J'ai essayé ce que tu m'as dit. Voilà comment j'ai procédé en suivant cette doc :
    http://gfx.developpez.com/tutoriel/j...ing-threading/

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
        private void jBSendActionPerformed(java.awt.event.ActionEvent evt) {    
            //Contrôles sur le formulaire
            ...
     
             new Thread(new Runnable() {
                public void run() {
     
                    try{
                        SwingUtilities.invokeAndWait(new Runnable() {
     
                            public void run() {
                                envoie();
                            }
                        });
                    }catch(InterruptedException ex){
                         Logger log = Logger.getLogger();
                         log.write("InterruptedException : " + ex.getMessage());
                    }catch(java.lang.reflect.InvocationTargetException ex){
                         Logger log = Logger.getLogger();
                         log.write("InvocationTargetException : " + ex.getMessage());
     
                    }
                }
            }).start();
        }
     
        private void envoie() {
            CBBU.setEnabled(false);
            jBSend.setEnabled(false);
            jBSearch.setEnabled(false);
     
            if ( traitement() ){
                jLabelEtat.setText("Terminé");
            }else{
                jLabelEtat.setText("Transfert échoué");
            }
     
            CBBU.setEnabled(true);
            jBSend.setEnabled(true);
            jBSearch.setEnabled(true);
        }
     
     
         private boolean traitement() {
            //traitement long
            ...
         }
    Je n'ai effectivement plus besoin de déclarer les composants swing public static. Ils sont déclarés dans la même classe.

    Mais ma fenêtre gèle à nouveau.

    En mettant les méthodes traitement() et envoie() dans la classe du thread, c'est la même chose : ça gèle. En utilisant InvokeLater à la place de InvokeAndWait, j'ai le même problème.

    Peux-tu svp me dire ce que j'ai loupé ?

    Merci !!

  5. #5
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Essaie comme ceci :
    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
     
        private void jBSendActionPerformed(java.awt.event.ActionEvent evt) {    
            //Contrôles sur le formulaire
            ...
     
            enableAll(false);
     
             new Thread(new Runnable() {
                public void run() {
                    final boolean succes = traitement();
     
                    SwingUtilities.invokeAndWait(new Runnable() {
                            public void run() {
                               LabelEtat.setText(succes ? "Terminé" : "Transfert échoué");
                               enableAll(true);
                            }
                    });
                }
            }).start();
        }
     
        private void enableAll(boolean enable) {
           CBBU.setEnabled(enable);
            jBSend.setEnabled(enable);
            jBSearch.setEnabled(enable);
        }

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 259
    Points : 97
    Points
    97
    Par défaut
    Ca fonctionne comme je le veux avec cette méthode, et c'est propre.
    Mais comment le programme comprend qu'on attend la fin de traitement() ?

    Est-ce que le programme attend toutes les méthodes appelées avant invokeAndWait ?

    Mon problème est résolu. Merci beaucoup !

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

Discussions similaires

  1. Genérer un rapport à partir d'une interface Swing
    Par kamikazw2 dans le forum Documents
    Réponses: 0
    Dernier message: 11/05/2012, 19h04
  2. Réponses: 0
    Dernier message: 05/04/2011, 01h09
  3. accéder à une BD SqlServer à partir d'une page web
    Par bilouchka dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 23/01/2008, 11h59
  4. Affichage d'une form a partir d'un thread
    Par spy1 dans le forum C#
    Réponses: 1
    Dernier message: 26/05/2007, 23h06
  5. générer une interface graphique à partir d'un fichier XML
    Par chaval dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 15/03/2006, 10h32

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