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 :

Structure programme MVC


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Par défaut Structure programme MVC
    Bonjour à tous,

    Je souhaite faire une application selon la convention MVC (Model View Controller). Je rencontre plusieurs problèmes dans la structure de mon programme. Ci-joints vous trouverez une explication en image de l'application que je souhaite développer.
    Nom : appli.jpg
Affichages : 122
Taille : 20,7 Ko

    1 - Barre menu : permet d'afficher le panel de votre choix
    2 - Liste service : liste déroulante commune à tous les panels
    3 - Panel vue : les différentes vues prenant en compte le service sélectionné

    Voici l'architecture de mon programme qui doit respecter en gros la norme MVC :

    View.java : vue principale permettant de gérer la fenêtre :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    public class View extends JFrame {
        private static final long serialVersionUID = 1L;
        private JMenuItem itemView1 = new JMenuItem("Vue 1");
        private JMenuItem itemView2 = new JMenuItem("Vue 2");
        private JMenuItem itemView3 = new JMenuItem("Vue 3");
        private JComboBox cmbService = new JComboBox();
        private Control control;
     
     
        public View(Control control) {
        	this.control = control;
        	createGUI();
        }
     
        private void createGUI() {
        	JMenuBar menuBarre = new JMenuBar();
        	JMenu menu1 = new JMenu("File");
        	menu1.add(itemView1);
        	menu1.add(itemView2);
        	menu1.add(itemView3);
     
            itemView1.addActionListener(control);
    	itemView2.addActionListener(control);
            itemView3.addActionListener(control);
    	menuBarre.add(menu1);
     
    	JPanel panAction = new JPanel();
    	cmbService.addItem("Service 1");
    	cmbService.addItem("Service 2");
    	panAction.add(cmbService);
    	panAction.setBackground(Color.DARK_GRAY);
     
    	JPanel panVue = new JPanel();
    	panVue.setBackground(Color.LIGHT_GRAY);
     
    	getContentPane().add(panAction, BorderLayout.NORTH);
    	getContentPane().add(panVue, BorderLayout.CENTER);
     
        	setJMenuBar(menuBarre);
        	setTitle("Fenetre test");
        	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        	setPreferredSize(new Dimension(600, 400));
        	JFrame.setDefaultLookAndFeelDecorated(true);
     
    	pack();
    	//this.setExtendedState(MAXIMIZED_BOTH);
    	setLocationRelativeTo(null);
        }
     
        public JMenuItem getItemView1() {
    	return itemView1;
        }
     
        public JMenuItem getItemView2() {
    		return itemView2;
        }
    control.java : controller principal de la fenêtre
    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
     
    public class Control implements ActionListener {
        private Model model;
        private View view;
     
        public Control(Model model) {
            this.model = model;
    	this.view = new View(this);
        }
     
        public void displayView() {
    	this.view.setVisible(true);
        }
     
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == view.getItemView1()) {
    	    ModelView1 model1 = new ModelView1();
                ControlView1 control1 = new ControlView1(model1);
                control1.displayView()
    	}
            else if (e.getSource() == view.getItemView2()) {
    	    ModelView2 model2 = new ModelView2();
                ControlView2 control2 = new ControlView2(model2);
                control2.displayView()
    	}
            ...........				
        }
    }
    Pour commencer mon controller implémente ActionListener pour écouter les évènements de la vue (barre menu), le problème est que si je souhaite ajouter un menu contextuel il faudra que je réécrive une nouvelle méthode (difficile à maintenir).
    J'ai pensé écrire une classe controller de la barre de menu étendant de AbstractListener mais il serait alors difficile de connaitre la vue ouverte et le service sélectionné.

    Voila, tout cela est basique, mais il n'est pas si facile de créer une structure propre et maintenable. Pouvez vous me donner quelques idées, quelques pistes pour réaliser ce genre de petit programme. Je reste à votre disposition pour des renseignements complémentaires.

    Meci

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 81
    Par défaut
    Bonjour,

    Je ne maîtrise pas forcement super bien le MCV mais normalement le contrôleur est une sorte de relais. Il ne doit pas hériter de Listener.
    Les listeners doivent rester du coté de ta vue car c'est la manière dont tu affiche tes données (via les menus) que les listeners réagissent. Or le contrôleur interprète "seulement" celles-ci pour les faire corréler avec le modèle.

    Pour ma part, je mettrait ton listener sur ton menu, et les fonctions de ton listener font appel à des fonctions de ton contrôleur dans le but de modifier des données. Si la seule action de ton menu est de passer dans une autre vue, cette action ne doit pas passer par le controleur, elle doit resté dans la vue.

    J'espère t'avoir aider et ne pas avoir répondu trop tard.


    Xpmich

  3. #3
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765

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

Discussions similaires

  1. [débutant]Pb de structure du programme
    Par Tymk dans le forum C++
    Réponses: 7
    Dernier message: 03/07/2008, 08h56
  2. Conseils sur structure de programme
    Par RR instinct dans le forum Langage
    Réponses: 6
    Dernier message: 21/09/2006, 14h44
  3. [debutant] structure d'un programme
    Par poukill dans le forum Débuter
    Réponses: 17
    Dernier message: 19/05/2006, 15h33
  4. Font , Xml & structure de programme .
    Par Clad3 dans le forum XML
    Réponses: 11
    Dernier message: 30/03/2005, 22h45
  5. Méta-Programmation - [ structures de données ]
    Par Dam)rpgheaven dans le forum C++
    Réponses: 3
    Dernier message: 03/12/2004, 19h38

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