Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Java et Eclipse
  3. Modèle MVC
Extrait - Java et Eclipse Développez une application avec Java et Eclipse (2e édition)
Extraits du livre
Java et Eclipse Développez une application avec Java et Eclipse (2e édition)
2 avis
Revenir à la page d'achat du livre

Modèle MVC

Présentation du concept

Le projet a été bâti en prenant soin de séparer les objets métier (les données) de leur représentation graphique, et ce dès la phase d’analyse.

Le modèle MVC (Modèle-Vue-Contrôleur) est un patron d’architecture qui formalise cette séparation en introduisant une couche logicielle intermédiaire, le contrôleur.

Dans un contexte MVC, les données constituent les modèles, les classes graphiques les vues. Modèle et Vue sont totalement indépendants l’un de l’autre : ils ne se connaissent pas. Comment alors les actions des utilisateurs via les vues peuvent-elles modifier les modèles et inversement comment les données attendues peuvent-elles être affichées ? Ce sont justement les contrôleurs qui vont établir ce lien.

Autre particularité importante : le modèle, s’il ne connaît pas directement les vues qui affichent ses données, a néanmoins la possibilité de notifier à celles-ci tout changement le concernant.

images/re12-01.png

Le schéma montre que l’utilisateur n’a aucune connaissance du contrôleur. C’est pourtant lui qui transmet de manière transparente pour l’utilisateur les demandes au modèle pour traitement. Les vues sont mises à jour par l’intermédiaire...

MVC et JTable

Les classes déjà présentes permettent la connexion à la base de données et l’importation de ces données dans le modèle métier de l’application.

Un composant Swing de type JTable est utilisé pour permettre la représentation graphique des données sous la forme d’un tableau à double entrée, en lignes et en colonnes.

JTable est construit sur les principes de l’architecture MVC, tout comme la plupart des composants Swing représentant des données complexes comme les JList et les JTree. Comprendre les mécanismes à l’œuvre dans une JTable facilite l’utilisation des autres types de composants.

Instancier une JTable se fait comme pour toute autre classe : il suffit d’appeler son constructeur.


        JTable table = new JTable();
 

En l’état, le tableau est vide. Il est nécessaire de lui importer des données.

Pour ce faire, plusieurs manières existent : fournir directement toutes les données des lignes et des colonnes à la construction, fournir une liste d’objets représentant chacun une ligne de données, ou utiliser un modèle de table. C’est cette dernière option qui sera choisie pour l’application.

Gestion des clients

Le paradigme MVC va être mis en œuvre en commençant par la gestion des clients. La démarche pour les articles et les commandes est similaire.

1. Modèle métier

La classe Client est une classe entité qui fait partie du M de MVC, le Modèle. Elle a été explicitée au chapitre Classes entités.

Sa classe associée ClientCrud permet d’effectuer des opérations depuis la base de données, dont en particulier la recherche de clients.

Voici la liste des méthodes disponibles dans la classe ClientCrud :

images/12-02.png

La table va pouvoir afficher les clients issus de la base de données. Pour cela, la méthode lire() de la classe ClientCrud interviendra à un certain point.

2. Modèle graphique

La classe JTable nécessite des données à afficher. Ces données lui sont fournies par le modèle de table, soit un objet qui implémente l’interface TableModel. Ce modèle de table est différent du modèle métier car il ne concerne que l’aspect graphique.

Ce modèle de table fournit au composant graphique (donc la vue) :

  • le nombre de colonnes à afficher grâce à la méthode getColumnCount().

  • le nom des colonnes à afficher avec la méthode getColumnName(int colonne), le paramètre étant l’index de la colonne (commençant par 0).

  • le nombre de lignes grâce à la méthode getRowCount().

  • la valeur de la cellule avec la méthode getValueAt(int ligne, int colonne), le premier paramètre étant l’index de la ligne, le second étant l’index de la colonne.

  • un moyen pour ajouter des écouteurs à ce modèle grâce à deux méthodes : addTableModelListener et removeTableModelListener.

Il fournit également un moyen pour éditer directement une cellule de la table depuis l’interface graphique grâce aux méthodes isCellEditable et setValueAt. Ces méthodes ne seront pas utilisées dans l’application.

Créons un modèle de table pour les clients dans le package controle.modele.

 Créez une nouvelle classe nommée ModeleClients dans le package controle.modele. Cette classe hérite de la classe AbstractTableModel qui fait partie...

Notifications non graphiques

Le concept de notifications, d’événements et d’écouteurs n’est pas réservé aux classes graphiques. Il est possible d’utiliser ce mécanisme pour toute partie d’une application en quelques lignes.

Mettons en place cette technique dans la classe ControleClient, pour notifier des objets quelconques qu’un client a été modifié.

 Ouvrez la classe ControleClient et rajoutez un attribut appelé notifications, de type java.beans.PropertyChangeSupport :


...  
import java.beans.PropertyChangeSupport; 
...  
public class ControleClient { 
 
    private final ClientCrud crud; 
    private final ModeleClients leModeleClients;  
 
    private final PropertyChangeSupport notifications =  
                    new PropertyChangeSupport(this); 
... 
 

PropertyChangeSupport est une classe utilitaire de Java qui possède déjà le code nécessaire pour y ajouter et enlever des écouteurs et générer des événements à destination de ces écouteurs.

Structure et sources

La structure générale, la classe ModeleClients, la classe ControleClient et les actions des boutons des panneaux PClients, et la classe PClient sont reportées ci-dessous. Voici la structure générale des packages :

images/9-12-2.png

1. ModeleClients

Vous trouverez dans cette section le code source de la classe ModeleClients.


package controle.modele; 
 
/* 
 *  Classe comportant le modèle de données des Clients. 
 *  Doit étendre la classe abstraite AbstractTableModel 
 */ 
 
import java.time.Instant; 
import java.util.ArrayList; 
import java.util.List; 
 
import javax.swing.table.AbstractTableModel; 
 
import entite.Client; 
 
public class ModeleClients extends AbstractTableModel { 
    private static final long serialVersionUID = 1L; 
 
    // représente les lignes du modèle 
    private final List<Client> lesDonnees; 
 
    // les en-têtes de colonnes 
    private static final String[] TITRES =  
    {"Code", "Nom", "Prénom", "Carte Fidélité", "Date Création"}; 
 
    public ModeleClients(List<Client> lesClients) { 
        lesDonnees = new ArrayList<>(lesClients); 
    } 
     
    public int getRowCount() { 
        return lesDonnees.size(); 
    } 
 
    public int getColumnCount() { 
        return TITRES.length; 
    } 
     
    public String getColumnName(int columnIndex) { 
        return TITRES[columnIndex]; 
    } 
 
    // pour accéder à la valeur d'une cellule 
    public Object getValueAt(int rowIndex, int columnIndex) { 
        Client client = getClient(rowIndex); 
        switch(columnIndex){ 
        case 0: 
            return client.getCode(); 
        case 1: 
            return...