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 :

[MVC] Actualiser la vue en écoutant le modèle


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Points : 10
    Points
    10
    Par défaut [MVC] Actualiser la vue en écoutant le modèle
    Bonjour à tous,

    J'aurais voulu de l'aide/explication concernant dans une architecture MVC, comment établir le rafraîchissement de la vue en fonction des évènements du contrôleur.

    Mon modèle contient par exemple l'argent du joueur, ma class extends Observable, mon contrôleur implements ActionListener, et ma vue implements Observer.

    Pour concrétiser par un exemple je voudrais que lorsque mon joueur appuie sur le bouton acheter, ce qui modifie l'attribue de ma classe modèle puis que ma vue s'actualise.

    ce que j'ai lu c'est que c'est le controleur qui distribue l'info à la vue et au modèle.

    pour l'instant j'ai dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void setArgent(int argent){
    this.argent= argent;
    setChanged();   
    notifyObservers();
    }
    j'ai épluché les liens, mais j'ai bcp de mal à appliquer le processus même s'il me semble le comprendre parfaitement.

  2. #2
    Membre éprouvé
    Avatar de michel.di
    Homme Profil pro
    Freelance
    Inscrit en
    Juin 2009
    Messages
    782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 782
    Points : 1 042
    Points
    1 042
    Par défaut
    Bonsoir,
    Tu peux mettre un peu plus de code? ce sera plus simple d'y regarder
    Docteur en informatique
    Freelance R&D, Web
    Activité freelance : https://redinnov.fr
    Page perso : https://michel-dirix.com/

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    package modele

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class Etat extends Observable {
     
        private double cash;
     
     
        public Etat(){
     
            cash=10000;
     
     
     
        }
     
     
     
        /**
         * @return the cash
         */
        public String getCash() {
            return ""+cash+" ";
        }
     
        /**
         * @param cash the cash to set
         */
        public void setCash(double cash) {
            this.cash = cash;
            setChanged();
            notifyObservers();
        }
    }
    package vue

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    public class Fenetre extends JFrame implements Observer {
     
          Etat jeu;
          JButton jlcash;
          public static JButton acheter;
     
     public Fenetre(Etat jeu) {
            this.jeu = jeu;
            init(jeu);
     
     
            this.setSize(1000, 800);
            this.setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
            setResizable(false); //On interdit la redimensionnement de la fenêtre
            this.getContentPane().setLayout(null);
     
     
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     
     
            jlcash = new JButton("Cash " + jeu.getCash());
            acheter= new JButton("Acheter");
     
            this.getContentPane().add(this.jlcash);
            this.getContentPane().add(this.acheter);
     
            this.setVisible(true)
    }
     
     public void init(Etat jeu) {
            jeu.addObserver(this);
        }
     
        public void update(Observable observable, Object obt) {
            repaint();
        }
     
    }
    package controleur

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public class JeuControleur implements ActionListener{
        Etat jeu;
        Fenetre fenetre;
     
        public JeuControleur(Etat jeu, Fenetre fenetre){
            this.jeu=jeu;
            this.fenetre=fenetre;
        }
     
        public void actionPerformed(ActionEvent event){
            if(event.getSource()== fenetre.jb1) { 
                fenetre.setVisible(false); 
                Fenetre fenetre2 = new Fenetre(jeu);
     
            }
            else if(event.getSource()== fenetre.acheter){
     
                jeu.setCash(12000); // juste pour faire un test 
     
            }
     
        }
     
    public static void main(String[] args) {
     
            Etat jeu = new Etat();
            Fenetre fenetre = new Fenetre(imagePath,0);
            JeuControleur jeucontroleur = new JeuControleur(jeu, fenetre);
     
     
            fenetre.acheter.addActionListener(jeucontroleur);
     
    }

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    Ha, tu étais pourtant bien parti, il suffisait de peu pour terminer ton processus.

    Tu veux que ton interface graphique écoute ton modèle. Tu rends donc ton modèle Observable et ta vue Observer. Puis tu demandes à ton interface graphique d'écouter le modèle. Grâce à ça, à chaque changement dans le modèle (ici, setCash(int)), ton interface graphique le saura. Il faut néanmoins implémenter la méthode update(Observable, Object) dans ta vue, c'est dans celle ci que tu effectueras tes changements graphiques.

    Cependant, il faut que lors d'un click sur le bouton, l'action de modification du cash s'effectue. Il faut donc ici écouter le bouton ! C'est ce que tu as fait. Tu as créé un contrôleur qui écoute les actions sur les boutons.

    Tu fais donc actuellement une écoute du modèle et une écoute du bouton.

    Le truc dans ce cas aussi simple, c'est que dans ton contrôleur où tu fais le setCash(), tu peux aussi faire tes mises à jour graphiques (vu que le contrôleur a accès à la vue). Ce n'est même pas la peine de passer par la méthode update() de la vue <=> ce n'est pas la peine que la vue écoute le modèle. Néanmoins, si d'autres processus, autre que ce contrôleur, font appel à setCash(), alors le update() de la vue devient intéressant car il s'occupera de la mise à jour de la vue.

    Si tu es étonné de ne pas avoir eu à créer une classe Contrôleur pour ton modèle comme celle que tu as faite pour ton bouton, c'est parce que utiliser Observable et Observer est le moyen le plus simpliste d'écouter des changements sur un objet. On est dispensé de la classe contrôleur, la vue s'occupe juste de se mettre à jour après un changement du modèle. Après, si tu veux aller plus loin dans l'écoute de tes classes de ton modèle et créer tes propres listeners, je te propose de lire ce tutoriel super intéressant: http://rom.developpez.com/java-listeners/

    J'espère avoir répondu à tes questionnements (même s'il n'y a pas de questions dans ton premier post).

    PS: Evite les boutons publics static. Passe un identifiant unique pour chaque bouton à ton controleur (en paramètre du constructeur), ou crée un getter dans la vue qui permet d'accèder à ton bouton.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (e.getSource() == vue.getMonBouton())

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Merci de ta réponse,

    donc si je comprends bien il faut que dans mon contrôleur, après mon appel

    il faudrait aussi que je rajoute un appel à mon constructeur FenetreJeu() ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    Je ne comprends pas ton dernier post :s, peux-tu en dire un peu plus ?

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    ça y est!

    Je me suis un peu emmêlée les pinceaux mais le pattern MVC fonctionne!

    Merci de ton aide

    Bonne soirée

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    Tant mieux. C'est un vrai plaisir de travailler avec MVC une fois qu'on a bien compris son fonctionnement. =)

    Tu peux mettre la discussion en "Résolu".

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

Discussions similaires

  1. [PHP 5.0] MVC, inclure les vues et les modèles
    Par bob633 dans le forum Langage
    Réponses: 11
    Dernier message: 16/07/2012, 16h05
  2. Actualiser la vue
    Par Bryce de Mouriès dans le forum MFC
    Réponses: 7
    Dernier message: 23/09/2008, 21h07
  3. Une vue qui affiche mon modèle entier ?
    Par igala.net dans le forum OpenGL
    Réponses: 7
    Dernier message: 18/07/2008, 17h02
  4. [Spring MVC] Controleur sans vue?
    Par Ylias dans le forum Spring Web
    Réponses: 4
    Dernier message: 07/05/2008, 11h54
  5. actualisation des vues _TABLES
    Par lmargueritte dans le forum Administration
    Réponses: 2
    Dernier message: 03/05/2007, 16h49

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