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 :

Vue --> Controleur (actionListener)


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 133
    Points : 109
    Points
    109
    Par défaut Vue --> Controleur (actionListener)
    Bonjour / Bonsoir,

    J'ai un problème dans la relation entre ma vue et mon contrôleur.
    Dans ma vue (pour l'exemple) j'ai un JButton et champ texte.
    Mon contrôleur implémente "actionListener" et à donc une implémentation d'"actionPerformed", jusqu'ici rien de méchant.

    J'ai ensuite mis mon contrôleur en tant que listener de mon JButton.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monJButton.addActionListener(new Controleur());
    Donc quand je clique sur mon JButton, je catch bien l'évènement de clic, cependant j'aimerais récupérer le texte saisie dans ma vue pour pouvoir réaliser un traitement dessus.

    Cependant mon controleur ne connait pas ma vue, à l'inverse mes vues connaissent mon contrôleur car mes vues ont toutes le contrôleur dans le constructeur.

    Ai-je un problème architectural ? Je passe peut-être (sûrement) à côté de quelque chose, mais je ne vois pas quoi.
    Car pour que mon contrôleur connaissent mes vues, je devrais les passées à sa construction, mais au cours de l'exécution elles ne seront pas forcément instanciées (les règles de gestions ...).

    L'idéal serait de passer une liste de variable avec l'ActionEvent dans l'actionPerformed mais je ne sais pas si c'est réalisable.

    Merci pour votre aide !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    à mon avis, ton problème vient du fait que tu ne passes pas la même instance de controlleur à chaqu'un des composants de ta vue.

    si tu as :

    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
    public class TaVue extends JPanel {
    
    ...
          public TaVue(Controleur controleur) {
    
    
               monJButton =  new JButton();
               monJButton.addActionListener(controleur);
         ...
              monText = new JTextField();
    monText.addActionListener(controleur);
    
          }
    
    }

    Une façon plus aisée de gérer la chose est plutôt de faire un controlleur sous forme de classe interne de la vue, qui permet au controleur d'accèder à l'ensemble de composants de la vue, et au constructeur de la vue, on passe le modèle :

    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
    public class MaVue extensds JPanel {
    
       private MonModel monModel;
    
    ...
    private JButton monJButton ;
    private JTextField monText;
    ...
    
         public MaVue(MonModel model) {
    
    this.monModel=model;
                       Controleur controleur = new Controleur();
    
               monJButton =  new JButton();
               monJButton.addActionListener(controleur);
         ...
              monText = new JTextField();
    ...
    }
    
    private class Controleur implements ActionListener {
    
          	@Override
    	public void actionPerformed(ActionEvent e) {
    		if ( e.getSource()==monJButton ) {
    
                         ... ici on peut accèder à monText, à monModel, etc...
    
                    }
    	}
    
    
    }
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 133
    Points : 109
    Points
    109
    Par défaut
    Avec ta solution là j'aurais une instance de contrôleur par vue non ?
    Car là j'ai :

    J'ai pensé à une chose, dites-moi ce que vous en pensez.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 133
    Points : 109
    Points
    109
    Par défaut
    Avec ta solution là j'aurais une instance de contrôleur par vue non ?
    Car là j'ai un Main qui instancie mon contrôleur et les passe en paramètre à mes vues :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    Controleur monControleur = new Controleur();
     
    MaVue maPremièreVue = new MaVue(monControleur);
    MaVue2 maDeuxièmeVue = new MaVue2(monControleur);
    J'ai pensé à une chose, dites-moi ce que vous en pensez.

    Si je met un attribut privé de ma vue (que je ne connais pas) dans mon contrôleur, et un setter de cet attribut que j'appellerais dans ma vue.

    Comme ça au moment du catch de l'ActionEvent, mon contrôleur aura la vue ?
    Non ?

  5. #5
    Membre habitué
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 86
    Points : 174
    Points
    174
    Par défaut
    Hello Neewd,

    joel.drigo t'a proposé la bonne solution.

    Cépendant, il y a diférentes façons d'aborder le MVC. Je te propose ma façon de faire avec des "getters" sur les composants et sur les modeles de tes composants, tout en sachant que c'est le controleur qui accède en exclusivité à la vue et au modèle et facilite toutes opérations comme, pose d'écouteurs , suppression d'écouteurs, communication des composants à l'arrivée de notification... Tout cela peut être centraliser dans le controleur :

    Le modèle :
    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
     
    import javax.swing.table.DefaultTableModel;
     
    public class Model {
        public DefaultTableModel getTableModel() {
            Object nomsColonnes[] = { "Colonne 1", "Colonne 2"};
            Object datas[][] = {
                    { "100", "200"},
                    { "300", "400"} ,
                    { "500", "600"}
            };
     
            return  new DefaultTableModel(datas, nomsColonnes);
        }
    }
    La 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    import java.awt.BorderLayout;
     
    import javax.swing.Box;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
     
     
    public class View extends JFrame {
     
        private static final long serialVersionUID = 1L;
     
        private final JTable table;
        private final JButton btnOK;
        private final JTextField txtCell;
        private final Model model;
     
        public View(Model model) {
            this.model = model;
            this.btnOK = new JButton("Valider");
            this.txtCell = new JTextField(10);
            this.table = new JTable(model.getTableModel());
     
            initLayout();
     
            setSize(600,400);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
     
        private void initLayout(){
            Box box = Box.createHorizontalBox();
            box.add(txtCell);
            box.add(Box.createHorizontalStrut(5));
            box.add(btnOK);
            box.add(Box.createHorizontalGlue());
     
            add(box, BorderLayout.NORTH);
            add(new JScrollPane(table), BorderLayout.CENTER);
        }
     
        public void lancerVue(){
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    setVisible(true);
                }
            });
        }
     
        public JTextField getTxtCell() {
            return txtCell;
        }
     
        public JButton getBtnOK() {
            return btnOK;
        }
     
        public JTable getTable() {
            return table;
        }
     
        public Model getModel() {
            return model;
        }
    }
    Le 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
     
    public class Controller implements ActionListener, ListSelectionListener {
     
        private final View view;
        private final Model model;
     
     
        public Controller(View view) {
            this.view = view;
            this.model = view.getModel();
            initListener();
        }
     
        private void initListener() {
            view.getBtnOK().addActionListener(this);
            view.getTable().getSelectionModel().addListSelectionListener(this);
        }
     
        @Override
        public void actionPerformed(ActionEvent e) {
            int ligne = view.getTable().getSelectedRow();
            int colonne = view.getTable().getSelectedColumn();
            view.getTable().setValueAt(view.getTxtCell().getText(), ligne, colonne);
        }
     
        @Override
        public void valueChanged(ListSelectionEvent e) {
            int ligne = view.getTable().getSelectedRow();
            int colonne = view.getTable().getSelectedColumn();
            System.out.println("La Cellule (" + ligne + ", " + colonne +") a été séléctionnée.");
        }
     
        public View getView() {
            return view;
        }
     
     
        public Model getModel() {
            return model;
        }
     
        public static void main(String[] args) {
            Controller controller = new Controller(new View(new Model()));
            controller.getView().lancerVue();
        }
    }

    Awane
    Si mon message t'a aidé, un petit ne fera pas de mal
    Pensez aussi à

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 133
    Points : 109
    Points
    109
    Par défaut
    Je vois votre façon de faire.
    Donc je dois passer ma ou mes vues au constructeur du contrôleur, donc je dois créer mes vues avant mon contrôleur ?

    Merci pour vos réponses !

    PS : Et oui , il y a plusieurs façon d'aborder le MVC et c'est là le problème, l'année dernière au cours de l'année, on nous à donné une des façon de faire, et on nous demande de changer cette année, donc j'ai encore certain réflexe.

  7. #7
    Membre habitué
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 86
    Points : 174
    Points
    174
    Par défaut
    Oui, il a différentes façons de faire
    Il faut choisir la plus adapté à ce qu'on veut faire (Contraintes techniques, framworks imposés, taille de l'application (nombre de vues),...).

    PS: Je te met aussi un lien pour un autre petit exemple
    http://www.leepoint.net/notes-java/G...ure/40mvc.html

    Awane
    Si mon message t'a aidé, un petit ne fera pas de mal
    Pensez aussi à

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 133
    Points : 109
    Points
    109
    Par défaut
    Merci beaucoup, ton lien va m'être très utile.
    En fait je ne passais pas ma vue (ou mes vues) à mon contrôleur, et donc il ne pouvait pas connaitre les éléments de la vue, même s'il catchait les Event de celles-ci.

    Je teste dès que je peux, et je viendrais mettre le topic en résolu.
    Merci à vous deux !

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 133
    Points : 109
    Points
    109
    Par défaut
    Les solutions proposées sur ce topic m'ont été très utiles, et j'ai réussi à implémenter ce que je voulais faire

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

Discussions similaires

  1. Erreur Controleur-Vue et l'execution d'un bouton
    Par pigeonfurtif dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 24/01/2008, 09h55
  2. Modele vue controleur
    Par horkets dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 07/08/2007, 12h05
  3. [EJB3] interaction EJB avec vue/controleur
    Par ®om dans le forum Java EE
    Réponses: 7
    Dernier message: 27/02/2007, 14h20
  4. communication entre vue et controleur
    Par yanis97 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 10/11/2006, 12h16
  5. [JSP][Servlet][Javabean] Modèle Vue Controleur
    Par ay_pepito dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/02/2004, 10h05

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