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

avec Java Discussion :

Design Pattern MVC en Java


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 227
    Points : 77
    Points
    77
    Par défaut Design Pattern MVC en Java
    Bonjour. Je fais des essais sur le modèle MVC en java (je débute avec ce design pattern) et j'ai ce message d'erreur:
    IllegalStateException: Attempt to mutate in notification

    Pour simplifier, dans une vue, j'ai un JTextField dans lequel j'écris une formule qui doit se mettre à jour en temps réel à chaque ajout d'un caractère dans toutes les autres vues.
    Via un DocumentListener et avec la méthode insertUpdate, j'envoie la formule tapée au contrôleur, qui la fait passer au modèle.
    Celui-ci notifie alors toutes les vues, via un événement, du changement de la formule (j'ai fait des événements et des listeners personnalisés).
    Ce qui me paraît bizarre, c'est que finalement, la vue à l'origine du changement se modifie elle-même.
    Est-ce que l'erreur peut venir de là?
    Et si oui comment on fait pour éviter ce problème?
    Merci.

  2. #2
    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
    Oui, vous ne pouvez pas modifier votre document pendant que vous êtes notifié d'un changement dans le document, cela impliquerait un récursion infinie (la modification implique une notification qui implique une modification, etc).

    Dans votre cas (plusieurs JTextField ou document du même type synchronizés), je vous recommande de vous arranger pour que tous ces composants partagent le même Document, ainsi c'est swing qui gèrera la synchronisation

    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
    package test;
    import javax.swing.*;
    import java.awt.*;
    public class Test {
        public static void main(String[] argv){
           JFrame frame = new JFrame();
           JTextField field1 = new JTextField(20);
           JTextField field2 = new JTextField(20);
           field2.setDocument(field1.getDocument());
           frame.getContentPane().setLayout(new FlowLayout());
           frame.getContentPane().add(field1);
           frame.getContentPane().add(field2);
           frame.setVisible(true);
           frame.pack();
        }
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 227
    Points : 77
    Points
    77
    Par défaut
    OK, merci pour cette astuce.
    Mais comme j'essaie de respecter le design pattern MVC et que le but c'est d'apprendre comment il fonctionne, je pense que cette astuce ne marchera pas par exemple si la vue où je tape la formule est un JTextField, et qu'il y a une vue qui affiche la formule en même temps dans un JLabel et une autre vue qui l'affiche dans la console (exemples au hasard).

    D'autre part, ça semble être un problème inhérent au pattern MVC (une vue qui se modifie elle-même) donc j'aimerais savoir comment on règle ce problème de façon générale.
    J'ai lu de la documentation sur internet sur le pattern MVC mais je n'ai rien trouvé à ce sujet.

  4. #4
    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
    au contraire, la solution que je te propose est entièrement liée au MVC.

    Le Document est le modèle, les textfields les vue et swing le controlleur.


    Après rien ne t'empêche de créer une sous-classe de JLabel que tu lie à un Document. Pareil pour ta console.

    De toutes façons, tu ne peux pas modifier un document au sein d'un évènement lié à ce document. Tu peux modifier d'autres document mais pas le tiens.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 227
    Points : 77
    Points
    77
    Par défaut
    En fait, j'aimerais que la formule que je tape dans le JTextField passe par le contrôleur et soit envoyée au modèle avant d'être redistribuée en temps réel aux autres vues.
    Donc si je fais un seul document, tout s'affichera dans toutes les vues sans contrôle, non?
    Sinon, je pensais faire passer au contrôleur dans la méthode insertUpdate du JTextField la référence à la vue qui est à l'origine de la formule, ensuite le contrôleur passerait cette rérérence au modèle qui la transmettrait à toutes les vues via des événements: ensuite la vue qui reconnaîtrait sa propre référence ne mettrait pas à jour son JTextField.
    Je pense que ça devrait marcher mais est-ce que c'est conforme au pattern MVC?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 227
    Points : 77
    Points
    77
    Par défaut
    Bonjour.
    Je déterre ce vieux sujet car j'ai finalement trouvé comment faire pour éviter la récursivité dans le modèle MVC en java, mais j'aimerais quand même essayer ta méthode avec un seul Document pour toutes les vues:
    Pour des JTextField, pas de problème, ils sont synchronisés automatiquement.
    Mais comment ferais-tu pour synchroniser un JLabel avec le Document pour qu'il affiche en permanence le nouveau texte tapé dans un des JTextField?

  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
    Je créerais une sous-classe de JLabel, avec un méthode setDocument() qui enregistrerais le JLable comme listener du Document et dans le listener ferai un setText(document.getText()) ou un truc du genre

Discussions similaires

  1. Design pattern MVC référencement
    Par Invité dans le forum Référencement
    Réponses: 1
    Dernier message: 26/06/2013, 10h20
  2. Design pattern MVC et point d'entrée
    Par rgamor dans le forum Langage
    Réponses: 4
    Dernier message: 31/10/2012, 17h07
  3. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  4. Problème d'accessibilité avec le design patterns MVC
    Par radical_bombtracks dans le forum JSF
    Réponses: 5
    Dernier message: 24/07/2007, 13h15

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