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

AWT/Swing Java Discussion :

Modifier un modèle dans L'EDT ?


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 281
    Points : 321
    Points
    321
    Par défaut Modifier un modèle dans L'EDT ?
    Boujour à tous

    Ma question est assez simple, mais impossible de trouver une réponse sur google.
    Est-ce que je doit exécuter les modification sur des modèles dans l'EDT(Je parle de modèle comme DefaultListModel par exemple) ou seulement ce qui est graphique (JFrame.setVisible(true) par exemple).

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Une modification sur un modèle n'a rien à voir avec l'EDT, donc dans l'absolu : à faire en dehors.
    Mais comme toute règle, il faut savoir pourquoi on l'applique. Si c'est une simple affectation de variable, inutile de démarrer un thread pour sortir de l'EDT puisque le démarrage d'un thread va provoquer des affectations et créations d'objets.
    Un point important : un traitement ultra-rapide pour une première utilisation d'un logiciel peut devenir rapidement très lent au fur et à mesure des usages. Mais sans plus d'infos, pas possible d'être plus précis.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 281
    Points : 321
    Points
    321
    Par défaut
    Ma question portait sur le fait que modifier un modele en utilisant un modifier va déclencher un évènement et la vue changera. Mais du coup est-ce le fait que la vue change se fait dans l'EDT ou je dois y penser en changeant le modèle.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Voici le principe dans les grandes lignes : en dehors du thread de l'EDT, tu modifies le modèle. Toujours en dehors de l'EDT, tu appelles la méthode de mise à jour de la vue (généralement une méthode "fire...()") et c'est tout.
    C'est la méthode de mise à jour qui se débrouille. Une modification graphique se fait toujours dans l'EDT.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je ne suis pas d'accord. Le modèle fait partie du composant swing. Et à moins qu'il soit marqué dessus qu'il est thread safe (ça doit être indiqué explicitement), il doit être considéré comme unsafe et modifié exclusivement depuis l'EDT.

    Et non, on n'appelle pas sois même les méthode fireXXX, d'ailleurs elles sont protégée, c'est le modèle qui s'en charge
    Et non, les listeners qui sont enregistrés par les composant swing dans les modèle ne sont pas indiqué, à ma connaissance, comme faisant le travail de transférer cet évènement vers l'EDT. Donc au final on a bien un composant qui se retrouve modifé par une action sur le modèle.

    Et swingworker est bien concu autour de ce principe, puisqu'il faut "publier" les changement dans le swingworker, pour que, dans l'EDT, on reprenne ces changement et les appliquent au modèle.

    Donc on ne modifie un composant swing, et donc a forciori son modèle, que depuis l'event dispatch thread.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 281
    Points : 321
    Points
    321
    Par défaut
    Ma question n'est donc pas si évidente que ça. alors je dois suivre les conseils de qui ?

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Le message me semble clair sur la doc de Oracle:

    Some Swing component methods are labelled "thread safe" in the API specification; these can be safely invoked from any thread. All other Swing component methods must be invoked from the event dispatch thread. Programs that ignore this rule may function correctly most of the time, but are subject to unpredictable errors that are difficult to reproduce.
    Elle dit bien "toutes les méthodes de composants swing" et non pas comme le dit dinobogan "toutes les modification graphiques". Et un modèle, pas le biais des listener, ça appelle des méthodes sur les composant swing asociés.

    Tu ne peux pas être sur, même en modifiant juste une valeur dans ton modèle, que le composant graphique n'est pas occupé de la lire en même temps et pourrais donc lire un état corrompu. Le deux principaus moyens d'être sûr

    Si tu es certains que l'EDT fait autre chose, en l'occurence, si il est occupé d'exécuter ton code, donc si tu fais ta modification dans l'EDT
    Si le modèle que tu modifie n'est pas relié à un composant graphique. C'est sur que si le modèle est en cours de construction et que c'est juste à la fin que tu fais "combobox.setModel(monNouveauModel), c'est juste l'appel à setModel qui devra se faire dans l'EDT.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 281
    Points : 321
    Points
    321
    Par défaut
    Voilà qui m'avance. Merci à tous

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/07/2012, 16h50
  2. Comment faire pour modifier une ligne dans une DBGrid?
    Par Nico62 dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2005, 12h24
  3. Modifier l'utilisateur dans une PS ?
    Par Sitting Bull dans le forum SQL
    Réponses: 7
    Dernier message: 28/02/2005, 18h01
  4. modifier les texte dans un <span>
    Par Flobel dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/12/2004, 13h58
  5. Modifier un événement dans le code
    Par HT dans le forum Langage
    Réponses: 6
    Dernier message: 20/06/2003, 09h46

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