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

MVC Discussion :

[MVC] Vue à l'intérieur d'une autre : Comment l'instancier ?


Sujet :

MVC

  1. #1
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut [MVC] Vue à l'intérieur d'une autre : Comment l'instancier ?
    Bonjour,

    J'ai un petit problème avec l'architecture MVC. Disons que j'ai une vue SuperView qui est une fenêtre (c'est la vue principale de mon application), à l'intérieur de laquelle j'ai un tableau à onglets et les différents onglets de cette vue sont aussi des vues (appellons-les MiniView1 et MiniView2).

    Maintenant, j'ai un manager MVC qui instancie les vues et qui les associent à un controller. Le problème est que ces vues intérieures prennent en paramètres le tableau à onglets de la vue supérieure. Donc je ne peux pas les instancier directement dans le manager puisqu'il me faudrait le tableau à onglets et je ne peux pas d'abord créer la vue principale puisqu'il me faudrait les vues intérieures.

    Je ne sais pas vraiment comment faire cela de manière propre...

    La seule solution que j'ai trouvée pour l'instant serait de supprimmer le paramètre du constructeur des vues intérieures, de l'instancier dans le manager, puis dans le constructeur de la vue principale d'utiliser un setteur sur les vues (qu'on récupère depuis leurs controlleurs) pour leur indiquer le tableau à onglets. Est-ce que vous pensez que c'est une bonne idée ?

    Merci d'avance

    P.S. Je sais pas si j'ai été très clair, si jamais hésitez pas à me marteler de question pour comprendre le problème.

  2. #2
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    salut,
    je sais pas pour toi ce que c'est une définition d'une vue, mais pour moi dans le langage Java :une vue c'est une classe visuelle quelconque qui implémente l'interface Observer

    Exemple :
    j'ai la fiche vuePromotion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class VuePromotion extends JFrame implements Observer {
    JTabbedPane onglets;
    }
    et elle contient plusieurs Panels que j'appellerai vueSemestre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class VueSemestre extends JPanel implements Observer
    le manager MVC va s'occuper de la création de la fiche Promotion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class FichePromotion {
    
    private VuePromotion vue;
    private Controler cont;
    
    FichePromotion() {
    vue = new VuePromotion();
    cont = new Controler();
    vue.setControler(cont);
    }
    }
    après pour les vues internes ,la fiche principale sera selon moi elle même le manager MVC des fiches internes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class VuePromotion extends JFrame implements Observer {
    JTabbedPane onglets;
    
    public void creerVueInterne(){
    VueSemestre vue = new VueSemestre();
    ControlerSemestre cont = ControlerSemestre();
    vue.setControler(vue);
    
    onglets.addTab(vue);
    }
    
    }
    Je sais pas si ma réponse te convient ,mais bon j'ai essayé d'y répondre !
    Where is my mind

  3. #3
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Merci de tes réponses

    J'utilise le mot vue au sens MVC, c'est à dire que ça peut être n'importe quel élément affichant des informations à l'utilisateur. Chez moi, c'est des JFrame ou des JPanel, mais ça ne change rien.

    Le problème avec le code que tu donnes c'est que c'est directement la vue qui associe une autre vue à un controller et je ne pense pas que ce soit son rôle...

    Pour le moment, j'ai utilisé la solution décrite plus haut, j'initialise mes vues internes et les lie à un controller depuis le manager MVC et ensuite dans le constructeur de la vue englobante je les récupère avec leurs controllers respectifs et leur assigne le tableau à onglets, mais je ne suis pas sûr que ce soit la bonne solution.

  4. #4
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut Mvc
    Le problème avec le code que tu donnes c'est que c'est directement la vue qui associe une autre vue à un controller et je ne pense pas que ce soit son rôle...
    mais ici ,c'est une vue qui contient d'autres vues internes donc je vois pas le problème parceque après chaque vue va faire son travail indépendamment de l'autre.

    En tout cas, moi c'est comme ça que j'ai fais pour un problème similaire , et je ne vois pas une solution plus simple .

    Maintenant pour le respect du principe MVC, je ne sais pas mais l'essentiel de ce pattern est de séparer la vue du modèle.
    Where is my mind

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 84
    Points : 68
    Points
    68
    Par défaut
    Normalement c'est le controlleur qui instancie la vue qui lui est associé. Ton controlleur principal doit contenir tes conteneurs secondaires mais tes vues n'ont aucune relation entre elles.
    C'est à tes controlleurs de gérer tout ça, et à tes vues de leur proposer des méthodes qui leur permettent de faire leur boulot.

  6. #6
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par Tijee
    Normalement c'est le controlleur qui instancie la vue qui lui est associé. Ton controlleur principal doit contenir tes conteneurs secondaires mais tes vues n'ont aucune relation entre elles.
    C'est à tes controlleurs de gérer tout ça, et à tes vues de leur proposer des méthodes qui leur permettent de faire leur boulot.
    Je suis pas vraiment d'accord... Le controleur ne devrait pas connaître le type réel de la vue qu'il manipule, cela permet d'avoir un controleur complétement détaché du framework graphique utilisé.

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 84
    Points : 68
    Points
    68
    Par défaut
    Ton controlleur a un attribut qui est de type View, mais tu l'instancies quand même avec un type concret qui implémente View. Pour moi un controlleur est spécifique à une vue puisque dans ton main tu as juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Model tonModel = new ConcretModel();
    Controler tonControler = new ConcretControler();
    Donc ton controlleur affiche une vue qui lui est propre.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/03/2015, 15h55
  2. Réponses: 2
    Dernier message: 21/02/2013, 19h54
  3. Réponses: 2
    Dernier message: 27/05/2008, 16h59
  4. [PDE] Creation de vues a partir d'une autre vue
    Par indoloic dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 13/03/2006, 14h34
  5. Réponses: 2
    Dernier message: 10/12/2004, 15h43

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