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 - Initialisation de la vue


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 17
    Par défaut MVC - Initialisation de la vue
    Bonjour,

    Je me triture l'esprit sur le pattern MVC (principalement pour Swing mais peu importe) et j'ai du mal à comprendre un point précis : Comment initialise-t-on les valeurs du modèle affichés dans vue ?

    Par exemple dans ce tutoriel, l'initialisation de la vue marche ainsi :

    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
     
    ...
    public class JFrameFieldVolume extends VolumeView implements ActionListener{
    ...
    	public JFrameFieldVolume(VolumeController controller, int volume){
    		super(controller); 
     
    		buildFrame(volume);
    	}
     
    	private void buildFrame(int volume) {
    		...
    		field = new JFormattedTextField(format);
    		field.setValue(volume);
    		...
    	}
    ...
    }
    La logique est la suivante : la classe VolumeModel a un attribut qui est "int volume", donc on le passe en paramètre dans le constructeur de la vue, car passer le modèle et faire un "getVolume" serait anti-pattern.

    La question que je me pose c'est : Est-ce que cette implémentation est bonne ? En fait mon problème c'est que dans le cas où on a 54 attributs dans le modèle, il faut un constructeur avec 54+1 paramètres.

    Voilà j'aimerais bien votre éclaircissement (et éventuellement vos méthodes pour arranger ça).

    Merci

  2. #2
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Voici une implémentation possible avec un modèle disposant de plusieurs propriétés. L'idée est que le contrôleur expose des accesseurs sur les propriétés du modèle qu'on souhaite rendre disponibles aux vues (en quelque sorte le contrôleur expose l'état de tout ou partie du modèle aux vues).

    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 VolumeModel {
     
    	public enum EnumUniteVolume {
    		LITRE, GALLON
    	}
     
    	private int volume;
    	private int volumeMin;
    	private int volumeMax;
    	private EnumUniteVolume unite;
     
    	private EventListenerList listeners;
     
    	public VolumeModel() {
    		this(0, 0, 100, EnumUniteVolume.LITRE);
    	}
     
    	public VolumeModel(int volume, int volumeMin, int volumeMax,
    			   EnumUniteVolume unite) {
    		super();
     
    		this.volume = volume;
    		this.volumeMin = volumeMin;
    		this.volumeMax = volumeMax;
    		this.unite = unite;
     
    		listeners = new EventListenerList();
    	}
     
    	public int getVolume() {
    		return volume;
    	}
     
    	public void setVolume(int volume) {
    		if (volume != this.volume) {
    			this.volume = volume;
    			fireVolumeChanged();
    		}
    	}
     
    	// Les autres accesseurs et mutateurs...
     
    	...
    	public void fireVolumeChanged() {
    		VolumeChangedEvent event =
    		  new VolumeChangedEvent(this,
    			getVolume(),
    			getVolumeMin(),
    			getVolumeMax(),
    			getUnite());
     
    		VolumeListener[] listenerList = (VolumeListener[])listeners.getListeners(VolumeListener.class);
    		for(VolumeListener listener : listenerList) {
    			listener.volumeChanged(event);
    		}
    	}
    }
    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
    public class VolumeChangedEvent extends EventObject {
     
    	private int newVolume;
    	private int newVolumeMin;
    	private int newVolumeMax;
    	private EnumUniteVolume newUnite;
     
    	public VolumeChangedEvent(Object source,
    			  int newVolume, int newVolumeMin, int newVolumeMax,
    			  EnumUniteVolume newUnite) {
    		super(source);
     
    		this.newVolume = newVolume;
    		this.newVolumeMin = newVolumeMin;
    		this.newVolumeMax = newVolumeMax;
    		this.newUnite = newUnite;
    	}
     
    	public int getNewVolume() {
    		return newVolume;
    	}
     
    	// Les autres accesseurs...
    }
    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
    public class VolumeController {
    	...
    	public VolumeController (VolumeModel model) {
    		this.model = model;
     
    		fieldView = new JFrameFieldVolume(this);
    		spinnerView = new JFrameSpinnerVolume(this);
    		listView = new JFrameListVolume(this);
     
    		addListenersToModel();
    	}
    	...
    	public void notifyVolumeChanged(VolumeChangedEvent event) {
    		model.setVolume(event.getVolume());
    		model.setVolumeMin(event.getVolumeMin());
    		model.setVolumeMax(event.getVolumeMax());
    		model.setUnite(event.getUnite());
    	}
     
    	public int getVolume() {
    		return model.getVolume();
    	}
     
    	// Les accesseurs sur les autres propriétés du modèle
    	// rendues visibles aux vues
    	...
    }
    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
    public class JFrameFieldVolume extends VolumeView implements ActionListener {
    	...
    	private JLabel label = null;
     
    	public JFrameFieldVolume(VolumeController controller) {
    		super(controller); 
     
    		buildFrame();
    	}
     
    	private void buildFrame() {
    	...	
     
    		field = new JFormattedTextField(format);
    		field.setValue(getController().getVolume());
    		fieldMin = new JFormattedTextField(format);
    		fieldMin.setValue(getController().getVolumeMin());
    		fieldMax = new JFormattedTextField(format);
    		fieldMax.setValue(getController().getVolumeMax());
     
    		label = new JLabel(getController().getUnite().name());
    		contentPane.add(label);
    	...	
    	}
     
    	public void volumeChanged(VolumeChangedEvent event) {
    		field.setValue(event.getNewVolume());
    		fieldMin.setValue(event.getNewVolumeMin());
    		fieldMax.setValue(event.getNewVolumeMax());
    		label.setText(event.getNewUnite().name());
    	}
     
    	public void actionPerformed(ActionEvent arg0) { 
    		VolumeChangedEvent event =
    		  new VolumeChangedEvent(this,
    			Integer.parseInt(field.getValue().toString()),
    			Integer.parseInt(fieldMin.getValue().toString()),
    			Integer.parseInt(fieldMax.getValue().toString()),
    			getController().getUnite());
    		getController().notifyVolumeChanged(event);
    	}
    }

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/03/2010, 19h45
  2. [ASP.NET MVC] Codebehind d'une vue partielle
    Par Nadd dans le forum ASP.NET
    Réponses: 2
    Dernier message: 02/10/2009, 13h59
  3. Réponses: 6
    Dernier message: 09/04/2008, 09h57
  4. [MVC] lien entre la vue et le modèle
    Par TabrisLeFol dans le forum MVC
    Réponses: 3
    Dernier message: 18/12/2007, 21h59
  5. [Spring MVC] Renvoyer vers une vue depuis un intercepteur
    Par ChtiGeeX dans le forum Spring Web
    Réponses: 2
    Dernier message: 01/04/2007, 10h26

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