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 :

Traitement bloquant mon interface


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    244
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 244
    Par défaut Traitement bloquant mon interface
    Voila, à un momoent dans mon programme, l'utilisateur clique sur un bouton qui déclenche un traitement. Le problème est que ce traitement bloque totalement mon interface: lors du clic sur le bouton, j'ai une fenetre de configuration qui apparai, et lors de la valisation de la configuration, le traitement se lance. Mais voila, ma fenêtre de config se ferme bien, mon traitement se lance bien mais je me retrouve avec un gros carré gris le temps de mon traitement?!
    Pourtant j'utilise le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      public void actionPerformed(ActionEvent actionEvent)
      {
    	    String actioncommand = actionEvent.getActionCommand();
    	    if (actioncommand == "Generer matrice")
    	    {
    	    	SwingUtilities.invokeLater(new Runnable() {
                                    public void run() {genereMatrice();}
                                                                                      });
    	    }
      }
    Pourquoi ca bloque?

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Justement tu ne doit pas utiliser invokeLater() !!!
    invokeLater() permet d'exécuter un traitement dans l'EDT, c'est à dire le thread qui gère l'affichage des composant Swing. Tu ne doit donc l'utiliser que pour des tâches courtes pour la mise à jours de l'affichage...
    A noter que la méthode actionPerformed() est également appellé par l'EDT...


    Si tu fais un traitement lourd ou bloquant dans ce thread, tu retardes d'autant la gestion de l'affichage, et donc ton application parait bloqué et buggé...

    Plus d'info : Threads et performance avec Swing par Gfx

    Il faut donc utiliser un Thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void actionPerformed(ActionEvent actionEvent)
    {
        String actioncommand = actionEvent.getActionCommand();
        if (actioncommand == "Generer matrice")
        {
            new Thread() {
                public void run() {genereMatrice();}
            }.start();
        }
    }
    Et si ta méthode genereMatrice() modifie l'interface graphique, tu devras alors utiliser invokeLater()...
    Tu peux aussi te renseigner sur la classe SwingWorker (qui sera en standard dans Java 6) qui permet de simplifier cette gestion des threads...

    a++

    PS : Attention à l'opérateur == entre les chaines qui ne compare pas les valeurs mais les références...

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    244
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 244
    Par défaut
    a ok, j'avais mal compris. Tes conseil sont toujours utils Merci adiGuba je vais changer mon code.

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    244
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 244
    Par défaut
    C'est bon, ca fonctionne. Merci beaucoup!

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

Discussions similaires

  1. énorme problème avec mon interface MFC
    Par cenedra dans le forum MFC
    Réponses: 23
    Dernier message: 17/07/2006, 09h36
  2. demmarer mon interface
    Par kanzarih dans le forum Qt
    Réponses: 2
    Dernier message: 15/07/2006, 14h18
  3. énorme problème avec mon interface MFC
    Par cenedra dans le forum C++
    Réponses: 2
    Dernier message: 12/07/2006, 09h54
  4. Le JPanel est trop reduit pour mon interface !
    Par LeNeutrino dans le forum JBuilder
    Réponses: 4
    Dernier message: 25/07/2005, 18h58
  5. quel langage choisir pour mon interface graphique
    Par mrom34 dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 09/03/2004, 19h12

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