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

Interfaces Graphiques en Java Discussion :

Consommation d'événement graphique


Sujet :

Interfaces Graphiques en Java

  1. #21
    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
    Il faut procéder autrement :
    la tâche "longue" doit être exécutée dans un thread séparé
    la mise à jour de l'UI doit s'effectuer dans le thread EDT

    Le code doit répondre à cette exigence. Dans ton cas, le 1er code est correct ; attention néanmoins au commentaire de la javadoc :

    This method is thread safe, although most Swing methods are not. Please see
    http://java.sun.com/products/jfc/swi...e/threads.html for more information.

  2. #22
    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
    De fait je te recommande très fortement la lecture du tuto suivant qui explique les tenants et aboutissants de l'EDT et de l'interaction Swing/Threads. http://gfx.developpez.com/tutoriel/j...ing-threading/

    Accessoirement je recommande également très fort l'utilisation du SwingWorker qui facilite l'intégration des tâches longues dans Swing.
    http://rom.developpez.com//java-swingworker/

    Vouloir consommer les évènements de façon artificielle est une très mauvaise idée. De plus ta tâche longue dans l'EDT empêche justement la file d'évènements de se vider. Donc ta tâche doit être exécutée dans un thread à part et surtout pas via un InvokeLater qui exécute un Runnable dans l'EDT, qui est le thread destiné à dépiler la file des évènements graphiques
    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. #23
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 120
    Points
    120
    Par défaut
    la mise à jour de l'UI doit s'effectuer dans le thread EDT
    Si je comprend bien dans mon exemple, je ne dois pas appler directement JLabel.setText(), mais une méthode délégué par le container qui contiens mon label.

    exemple :

    dans le thread j'appelle une fonction du genre monContainer.setAff()

    et dans mon container il y aurait un truc du genre

    public void setAff(){
    monLabel.setText()
    }

    ??


    @Sinok
    Merci pour les liens

  4. #24
    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
    Citation Envoyé par Rhadamenthys Voir le message
    Si je comprend bien dans mon exemple, je ne dois pas appler directement JLabel.setText(), mais une méthode délégué par le container qui contiens mon label.

    exemple :

    dans le thread j'appelle une fonction du genre monContainer.setAff()

    et dans mon container il y aurait un truc du genre

    public void setAff(){
    monLabel.setText()
    }

    ??
    Non, ce n'est absolument pas ça.

    Va lire le premier tuto tu comprendras ton problème.
    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. #25
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 120
    Points
    120
    Par défaut
    J'ai lus le tuto et j'en reviens à penser que le invokeAndWait fait ce que je veux faire. Car pour réaliser l'action il doit d'abord consommé tous les évènements avant l'évènement poster.

    Merci à vous.

  6. #26
    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
    Le invokeAndWait permet de faire en sorte qu'un thread (qui n'est pas l'EDT) déclenche une action bien précise dans l'EDT et attends que celle ci se termine pour continuer. Rien à voir avec les actions multiples qui pourraient se passer partout dans l'EDT.

    Si tu reprends ton second exemple, voici ce qu'il faut réaliser:

    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
      private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed 
          Thread t = new Thread(new Runnable() {             
               public void run() {                  
                   for (int i=1;i<10;i++) {
                        //MAJ GUI
                        SwingUtilities.invokeLater(new Runnable() { 
                             public void run() {
                                  jTextAff.setText("Pos :"+i);
                             }
                        });
                        try {                         
                             Thread.sleep(1000);                     
                        } catch (InterruptedException ex) {                       
                        }                 
                    }             
               }         
           });     
    }
    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.

  7. #27
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 120
    Points
    120
    Par défaut
    Je suis entierement d'accord avec toi.

    Il post l'évènement dans la file et attends qu'il se réalise. Et donc consomme tous ceux qui sont avant lui pour le consommé, car ca marche comme un fifo (enfin si j'ai bien cerné le fonctionnement de la file).

    En tous cas merci pour vos réponses

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 11
    Dernier message: 21/04/2008, 12h23
  2. [JpGraph] Ajouter des évènements au graphique
    Par Foudébois dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 07/05/2007, 18h06
  3. Créer un événement non graphique
    Par Thorna dans le forum Général Java
    Réponses: 4
    Dernier message: 23/04/2007, 12h52
  4. Objet graphique réagissant à des événements
    Par Mayhem dans le forum Graphisme
    Réponses: 5
    Dernier message: 05/06/2006, 08h36

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