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 :

Organisation du code


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut Organisation du code
    Bonjour à tous,

    Je reviens vers vous car j'ai des problème dans l'organisation de mon code.
    Je souhaite développer une application java + MySQL avec le pattern MVC.

    J'ai découpé mon code en 3 parties :
    Pour commencer, j'ai créé la "Frame" avec une barre de menu.
    Ensuite au nord de la Frame, j'ai construit une barre d'outil me permettant de faire une recherche avec un ou plusieurs critères.
    Enfin au centre de la Frame, j'ai mis en place différents "Panel" qui doivent s'initialiser en fonction des critères de recherche.

    Chaque élément possède son propre controller :
    - un controller principal pour la Frame
    - un controller pour le panel de recherche
    - un controller pour chaque panel au centre de la fenêtre.

    L'objectif étant que sur changement d'un critère de recherche, le panel situé au centre de la fenêtre s'actualise automatiquement.
    Le problème ici est que le controller de la Frame ne connais pas le panel affiché au centre de la fenêtre.
    Des pistes, des solutions?

  2. #2
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour,

    vous pouvez passer des reférences des autres classes aux différents constructeurs.

    Je ne sais pas si cela va vous être utilise, mais regardez du côté de ce post:http://www.developpez.net/forums/d98...s-classe-mere/
    A l'aide de ce système, j'ai réussi à donner à tous les composants des références sur des classes qui les intéressent.

    @ bientôt...
    @ bientôt...

    Salut & @+ sur 3W!

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Merci pour ce tuyau, je ne connaissais pas cette écriture.

    Mais dans mon cas, le controller de la Frame construit le controller du panel de recherche ainsi que le ou les controller panel central (panelCentral1, panelCentral2, ...) avec this en paramètre correspondant au controller de la frame.

    Lorsque l'utilisateur va modifier un critère de recherche, comment le controller de la frame peut-il informer le panel central en cours d'exécution?

    C'est un peu confus pour moi, le panel central connais la classe mère car il a sa référence en paramètre, mais la classe mère ne connais pas forcément le panel central en cours.

  4. #4
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    met ton code, on pourra surement mieux t'aider.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Mon code est assez long mais je vais essayer de le simplifier.
    voici le code du controller 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    public class Controller { 
    	private Connex connexion;
    	private Model model;
    	private View view;
     
     
    	// CONTROLLER
    	public Controller() {
    		try {
    			this.connexion = new Connex(); 
    		} 
    		catch (SQLException e) {}
    		catch (Exception e) {}
     
    		this.model = new Model();
    		this.view = new View(this);
     
    		this.view.setPanelRecherche(new ControlRecherche (this));
    	}
     
     
    	// GETTER AND SETTER
    	public Connex getConnexion() {
    		return connexion;
    	}
     
    	public Model getModel() {
    		return model;
    	}
     
     
    	// EVENEMENT
    	public void displayPanelCentral1 () {
    		ControllerCentral1 controlCentral1 = new ControllerCentral1 (this);
    		view.setPanelCentral(controlCentral1.getView());
    	}
     
            public void displayPanelCentral2 () {
    		ControllerCentral2 controlCentral2 = new ControllerCentral2 (this);
    		view.setPanelCentral(controlCentral2.getView());
    	}
     
            ...
    }
    Voici le code de mon controller frontal qui contruit la classe View qui étend de JFrame.
    Ensuite les autres controller contruisent des vues qui étendent de JPanel.

  6. #6
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    bon, c'est un peu synthétique et on ne dispose pas du détail. Mais dans l'esprit de ce que tu as fait : puisque view et en charge de setter les panels, view pourrais aussi getter les références aux panels et par là propager des notifications particulières.

    En java il existe de multiple façon de procéder pour obtenir un résultat. IL est surtout question de choix d'implémentation ce référent à une école de pensée, un choix d'outils ou plus communément d'utilisation de Design pattern.

    Désolé, en l'état difficile de te dire : tu doit faire comme ceci ou comme cela.

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Merci pour votre réponse.
    Effectivement, je me suis orienté sur le pattern observer qui me permettra d'observer le changement sur les critères de recherche.
    Voici le modèle de mon controller principal
    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
    public class Model {
    	private int idService;
    	private EventListenerList listeners;
     
     
    	// CONTRUCTEUR
    	public Model(){
    		this(0);
    	}
     
    	public Model(int idService){
    		super();
     
    		this.idService = idService;
     
    		listeners = new EventListenerList();
    	}
     
     
    	// GETTER AND SETTER
    	public int getIdService() {
    		return idService;
    	}
     
    	public void setIdService(int idService) {
    		this.idService = idService;
     
    		fireServiceChanged();
    	}
     
     
    	// OBSERVER
    	public void addServiceListener(ServiceListener listener){
    		listeners.add(ServiceListener.class, listener);
    	}
     
    	public void removeServiceListener(ServiceListener l){
    		 listeners.remove(ServiceListener.class, l);
    	}
     
    	public void fireServiceChanged(){
    		ServiceListener[] listenerList = (ServiceListener[])listeners.getListeners(ServiceListener.class);
     
    		for(ServiceListener listener : listenerList){
    			listener.serviceChanged(new ServiceChangedEvent(this, getIdService()));
    		}
    	}
    }
    Voici comment je l'ai utilisé dans mon controller principal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            public void displayPanelCentral1 () {
    	     ControllerCentral1 controlCentral1 = new ControllerCentral1 (this);
                 model.addServiceListener(controlCentral1.getView());
    	     view.setPanelCentral(controlCentral1.getView());
    	}
     
            public void displayPanelCentral2 () {
    	     ControllerCentral2 controlCentral2 = new ControllerCentral2 (this);
                 model.addServiceListener(controlCentral2.getView());
    	     view.setPanelCentral(controlCentral2.getView());
    	}
     
            ....

    Je réussi ainsi à intercepter les évènements sur le panel de recherche.

    Mais, car toujours un mais, lorsque j'ouvre par exemple le panelCentral1 puis le panelCentral2, et que je modifie le critère de recherche, le panelCentral1 et le panelCentral2 sont actualisé alors que je souhaiterai raffraichir uniquement le panelCentral en cours d'affichage

  8. #8
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Cela est, pour le moment normal, les deux panels sont abonnés au même controleur dont la mission est de propager l'événement par le fireServiceChanged() a tous les objets abonnés. Donc tu dois ajouter des éléments discriments de source et de traitements pour arriver à tes fins. Les questions sont toujours quoi, oû et comment.

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Merci pour le temps que tu consacres à me répondre.

    Je ne comprends pas ce que tu veux dire par
    Donc tu dois ajouter des éléments discriments de source et de traitements pour arriver à tes fins
    Pour arriver à mes fins, il faudrait que chaque fois que j'ouvre un panelCentral, que je remove le panel central précédent en appelant la méthode removeServiceListener?
    Le problème est que je ne peux pas remove le panel central précédent car je les construits à la volé à chaque ouverture et que je perds ainsi leur référence.

    Peut être faut il que je créé toutes les instances des panel centraux à la contruction du controller principal OU bien créer une classe abstraite commune à tous les panel centraux???
    Tous ça est assez confus dans mon esprit

  10. #10
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Citation Envoyé par RomG7 Voir le message
    Mais, car toujours un mais, lorsque j'ouvre par exemple le panelCentral1 puis le panelCentral2, et que je modifie le critère de recherche, le panelCentral1 et le panelCentral2 sont actualisé alors que je souhaiterai raffraichir uniquement le panelCentral en cours d'affichage
    Alors au finale il y a trois panels : "panelCentral1","panelCentral2" et "panelCentral"

    "panelCentral1" et "panelCentral2" sont abonnés et pas "panelCentral".

    Votre énoncé n'est pas claire....

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Non, en fait j'ai x panel central. Pour simplifier je les ai appelé PanelCentral1, PanelCentral2, ... ensuite le controller de la frame est en charge de setter ces panels dans la view avec la méthode "setPanelCentral".

    Voici cette méthode dans la classe View
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void setPanelCentral(JPanel panelCentral ) {
    		this.remove(this.panelCentral );
    		this.panelCentral = panelCentral ;
    		this.add(panelCentral , BorderLayout.CENTER);
    		this.panelCentral .revalidate();
    }

  12. #12
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    tu pourrais ajouter un boolean getActifService(id) qui test ton panel avec un isVisible() par exemple.

    et dans le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public void fireServiceChanged(){
    		ServiceListener[] listenerList = (ServiceListener[])listeners.getListeners(ServiceListener.class);
     
    		for(ServiceListener listener : listenerList){
                            if (getActifService(id)) {
    			listener.serviceChanged(new ServiceChangedEvent(this, getIdService()));
                           }
    		}
    	}

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Effectivement cela peut être une idée. Merci beaucoup pour tous ces conseils.
    Ce n'est pas facile pour moi d'exprimer mes problèmes.

    Peut être aussi en créant toutes les instances de mes panels du centre directement dans le controller principal pour mémoriser leur référence :
    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
     
    public class Controller { 
    	private Connex connexion;
    	private Model model;
    	private View view;
    	private  ControllerCentral1 controlCentral1;
            private  ControllerCentral2 controlCentral2
     
    	// CONTROLLER
    	public Controller() {
    		try {
    			this.connexion = new Connex(); 
    		} 
    		catch (SQLException e) {}
    		catch (Exception e) {}
     
    		this.model = new Model();
    		this.view = new View(this);
     
    		this.view.setPanelRecherche(new ControlRecherche (this));
     
                    // création de toutes les instances de mes panel centraux pour mémoriser leur référence
                    controlCentral1 = new ControllerCentral1 (this);
                    controlCentral2 = new ControllerCentral2 (this);
    	}
     
     
    	// GETTER AND SETTER
    	public Connex getConnexion() {
    		return connexion;
    	}
     
    	public Model getModel() {
    		return model;
    	}
     
     
    	// EVENEMENT
    	public void displayPanelCentral1 () {
                 // supprime tous les listener du modele
                 model.removeAllServiceListener();
                 model.addServiceListener(controlCentral1.getView());
    	     view.setPanelCentral(controlCentral1.getView());
    	}
     
            public void displayPanelCentral2 () {
                 // supprime tous les listener du modele
                 model.removeAllServiceListener();
                 model.addServiceListener(controlCentral2.getView());
    	     view.setPanelCentral(controlCentral2.getView());
    	}
     
            ...
    }

  14. #14
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    A force de m'interroger il me vient une autre idée, peut être directement dans la méthode setPanelCentral de la classe View en lui donnant en paramètre le modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void setPanelCentral(JPanel panelCentral, Model model) {
        model.removeServiceListener(this.panelCentral);
        model.addServiceListener(panelCentral);
     
        this.remove(this.panelCentral );
        this.panelCentral = panelCentral ;
        this.add(panelCentral , BorderLayout.CENTER);
        this.panelCentral .revalidate();
    }

  15. #15
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Il ne faut pas perdre de vue que ce pattern a pour avantage de maintenir le découplage. En basculant une référence du model vous couplé plus fortement votre application.

    Personnellement j'utilise une frame dans laquelle j'instancie des panels. Je n'utilise pas ma frame comme controleur.

  16. #16
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    En fait je suis auto-didacte et passionné par le développement en java. J'ai appris beaucoup de chose avec les nombreux tutoriels présent sur ce site.
    J'ai voulu me perfectionner en utilisant le design pattern MVC pour bien séparer les différentes couchent (le modèle, la vue et le contrôleur).

    C'est pour cette raison que j'ai associé un contrôleur pour chaque élément graphique : un contrôleur pour le composant JFrame, un contrôleur par composant JPanel ...

    Mais j'avoues que j'arrive à un stade ou je me mélange un peu les pinceaux. Je fais un pas devant et trois derrière.

    Ce petit exercice me permettrait d'avancer vers la bonne direction

  17. #17
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Il me semble que la mode depuis un moment en rapport avec le découplage c'est spring du coup un certain nombres de design patern présentés en java sont quelques peu obsolètes.

Discussions similaires

  1. Persistance et organisation du code
    Par K-Kaï dans le forum Hibernate
    Réponses: 16
    Dernier message: 06/06/2007, 17h01
  2. Organisation du code source
    Par _kal_ dans le forum C
    Réponses: 18
    Dernier message: 04/08/2006, 14h15
  3. organisation du code.
    Par poporiding dans le forum C++
    Réponses: 36
    Dernier message: 13/07/2006, 10h15
  4. organisation du code.
    Par poporiding dans le forum C++
    Réponses: 3
    Dernier message: 28/06/2006, 17h10
  5. Réponses: 4
    Dernier message: 19/09/2005, 17h56

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