Tutoriel pour la création d'une petite application « Annuaire » en Java.

Tutoriel pour la création d'une petite application « Annuaire » en Java.

Ce tutoriel vous permet d'être capable de réaliser une application en Java qui connecte à une base de données (dans ce tuto : MS Access) et de faire des mises à jour sur la base....

Les premières étapes pour la création du projet

Créer un nouveau Java Project
File -> new -> Java Project.

Sous le répertoire de travail « src », créer un nouveau « package ».
Click sur le bouton droit de la souris -> new -> package

Dans ce cas en va le nommer « Interface Principale »

Dans le package « Interface Principale » on va créer une interface qu'on va la nommer « Annuaire ».

Création de l'application

Création du menu

On commence par la déclaration du « Menu Bar » dans la partie de déclaration et puis on crée son instance dans la procédure initGUI.
Création des menus : « Fichier, Recherche, Liste des contacts » et on va les donner les noms suivants : « Fichier : MnFichier » « Recherche : MnRecherche » « Liste des contacts : MnListContact » on commence toujours par la déclaration des variables de type : « JMenu » puis la création de leurs instances comme l'indique le schéma si dessus.
Création des sous menu « Ajouter, Modifier, Supprimer » .... : comme d'habitude on doit déclarer les variables « Ajouter : MnItemAjouter, Modifier : MnItemModifier, Supprimer : MnItemSupprimer » de type « JMenuItem » puis la création de leurs instance et les ajouter dans le menu « Fichier ».

{
    MnItemAjouter = new JMenuItem();
    MnFichier.add(MnItemAjouter);
    MnItemAjouter.setText("Ajouter");
}
{
    MnItemModifier = new JMenuItem();
    MnFichier.add(MnItemModifier);
    MnItemModifier.setText("Modifier");
}
{
    MnItemSupprimer = new JMenuItem();
    MnFichier.add(MnItemSupprimer);
    MnItemSupprimer.setText("Supprimer");
}

De même pour les autres sous menus.
On créer un « Panel » qui va contenir tout les éléments du projet, on va utiliser « Border Layout » qui va décomposer le panel en 4 partie : North, South, East, West, et Center, nommé « panTrav ».

{
    panTrav = new JPanel();
    panTrav.setLayout(new BorderLayout());
    setContentPane(panTrav);
}

Création des boutons

Pour la création des boutons on doit tout d'abord créer un conteneur « Panel » qui contenir les boutons « Ajouter, Modifier, Supprimer », nommé « panBouton ».
Ajouter le conteneur des boutons dans le panel « panTrav » on lui donnant l'emplacement « South ».

{
    panBouton = new JPanel();
    panTrav.add(panBouton,BorderLayout.SOUTH);
}

Dans cette étape on declare les boutons dans la partie déclarative, puis comme d'habitude on créer leurs instance et en les ajoutant dans le panel des boutons.

{
    {
        btnAjouter = new JButton("Ajouter");
        panBouton.add(btnAjouter);
    }
    {
        btnModifier = new JButton("Modifier");
        panBouton.add(btnModifier);
    }
    {
        btnSupprimer = new JButton("Supprimer");
        panBouton.add(btnSupprimer);
    }
}

Création de la table

Création d'un panel nommé « panTable » on lui ajoutant dans le panel de travail et lui mettant au milieu.
Après la création du panel du la table il faut suivre les étapes suivantes pour qu'on puisse lire et mettre des données de la base de donnée dans la table :
Créer un package nommé « Structure » ou on va créer une classe qui contient la structure de notre table.
Créer une classe « StructureContact » on déclarant les éléments de la table : « Nom, Prénom, Numéro » comme l'indique le code suivant.

public class StructureContact {

    String nom,prenom;
    int num;
   
    //Constructeur de la classe
    public StructureContact(String nom,String prenom,int num) {
        this.nom=nom;
        this.prenom=prenom;
        this.num=num;
    }
}

Créer un nouveau package « Table Model » où on va mettre la table model de la table « JTable ».

public class ModelTableauContac extends AbstractTableModel{

    Vector<StructureContact> donnee=new Vector<StructureContact>();
    Vector<String> entete=new Vector<String>();
    public ModelTableauContac(Vector<StructureContact> v){
        donnee=v;
        definirEntete();
    }

    //pour afficher l'entete de la table
    public void definirEntete(){
        entete.add( " Nom ");
        entete.add( " Prenom ");
        entete.add( " Numéro ");
    }

    @Override
    public int getColumnCount() {
        // TODO Auto-generated method stub
        return (entete.size());
    }

    @Override
    public int getRowCount() {
        return (donnee.size());
    }

    @Override
    public Object getValueAt(int row, int col) {
        switch (col){
            case 0: return ((StructureContact)(donnee.elementAt(row))).nom;
            case 1: return ((StructureContact)(donnee.elementAt(row))).prenom;
            case 2: return ((StructureContact)(donnee.elementAt(row))).num;
        }
        return null;
    }

     @SuppressWarnings("unchecked")
     public Class getColumnClass(int c){
         return getValueAt(0,c).getClass();
     }

    public String getColumnName(int numCol){
        return (String) (entete.elementAt(numCol));
    }
}

Créer un package « Data_Base » qui va contenir une classe qui permet la manipulation de la base de données.
Créer une classe « Manip_Data_Base » pour la connexion et la manipulation de la base de données.

public class Manip_Data_Base {

    //emplacement de la base
    final String NOM_BDD ="bd/annuaire.mdb";

    //nom d'utilisateur
    final String NOM_USER="root";

    //mot de passe
    final String MP_USER="";

    //chaine de connexion
    String DBurl="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+NOM_BDD;

    Connection con;

    public Manip_Data_Base() {
        Connection();
    }

    //permet d'ffectuer une connection à la base
    public boolean Connection() {
        try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            con = (Connection) DriverManager.getConnection(DBurl);
            return true;
        }catch(Exception e){
            JOptionPane.showMessageDialog(null,"Impossible de charger le pilote");
        }
        return false;
    }
}

Dans cette étape on va créer une fonction qui va nous permettre de récupérer les lignes de la base de données. Cette fonction va nous retourner un Vecteur de « StructureContact ».

public Vector<StructureContact> Remplir(){
        Vector<StructureContact> v = new Vector<StructureContact>();
        try {
            Statement stmnt = con.createStatement();
            ResultSet res = stmnt.executeQuery("select * from contact");
            while(res.next()){
                v.add(new StructureContact(res.getString(1), res.getString(2), res.getInt(3)));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return v;
    }

Retournons maintenant à notre fenêtre principale. On doit créer un panel qui va contenir la table « JTable ».
Pour afficher la table on doit déclarer tout d'abord les variables suivantes :
La table : de type « Jtable »
Un ascenseur : de type « JScrollPane »
Un vecteur : de type « Vector <type>»
Le model tableau : la classe qu'on a déjà crée
Une instance de la classe « Manip_Data_Base »

private JPanel panTable;
private JTable tabContac;
private Vector<StructureContact> vectContact;
private ModelTableauContac MTC;
private JScrollPane jspContact;
private Manip_Data_Base mdb = new Manip_Data_Base();

Pour que la table sera affichée dans la fenêtre il faut implémenter le code suivant :

{
    {
        panTable = new JPanel();
        panTrav.add(panTable,BorderLayout.CENTER);
    }
    {
        vectContact = new Vector<StructureContact>();
        tabContac = new JTable();
        vectContact = mdb.Remplir();
        MTC = new ModelTableauContac(vectContact);
        tabContac.setModel(MTC);
    }
    jspContact = new JScrollPane(tabContac);
    panTable.add(jspContact);
    jspContact.setPreferredSize(new java.awt.Dimension(347, 194));
}

On peut ajouter quelques options pour la table comme : hauteur de ligne, couleur d'arrière plan de la ligne, couleur du fond....

tabContac.setRowHeight(25);
tabContac.setSelectionBackground(Color.orange);

L' étape suivante consiste à créer les interfaces dont on va avoir besoin.
Interface pour l'ajout d'un nouveau contact
Interface pour la modification du contact
L'avantage de POO nous permet de créer une seule interface pour l'ajout et la modification si on utilise deux constructeurs dans la même interface, un avec paramètres, et l'autre sans paramètres.
Création de l'interface :
Créer un package « Interfaces »
Créer un « JDialog » en suivant les étapes suivantes :
Bouton droit de la souris su le package
New -> other -> JDialog
On crée un panel pour y mettre les éléments
On déclare 3 labels, 3 zones de texte, et 2 boutons
On associe le « Grid Layout » au panel (sous forme d'un tableau)
On crée les instances des objets et on les ajoutes dans le panel.
Dans le constructeur on doit ajouter cette ligne de commande « setModal(true) » pour que lorsque la boite de dialogue est activée on peut rien faire dans la fenêtre principale.
Ajout des actions au boutons « Ajouter, Modifier » et les éléments du menu
Ajouter : afficher la boite de dialogue
Modifier : afficher la boite de dialogue en utilisant le constructeur avec les paramètres pour afficher les anciennes valeurs.
Pour distinguer entre les actions qu'on doit faire dans la boite de dialogue (Ajouter ou Modifier) on peut faire un test sur le texte du bouton.

Pour exécuter des requêtes de mise à jour de la base on peut utiliser la fonction suivante, en passant la requête à exécuter comme paramètre.

public boolean LancerRequete(String req){
    try {
        Statement stmnt = con.createStatement();
        stmnt.executeUpdate(req);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

Ij suffit maintenant d'ajouter les actions convenables aux boutons :
Bouton « Modifier/Ajouter » :

if(btnOk.getText().equals("Ajouter")){

    Manip_Data_Base mdb = new Manip_Data_Base();

    mdb.LancerRequete("insert into contact values('"+txtnom.getText()+"','"+txtprenom.getText()+"',"+txtnum.getText()+")");

    txtnom.setText("");

    txtprenom.setText("");

    txtnum.setText("");

}else{

    Manip_Data_Base mdb = new Manip_Data_Base();

    mdb.LancerRequete("update contact set nom='"+txtnom.getText()+"',prenom='"+txtprenom.getText()+"',num="+txtnum.getText()+" where num="+num);

    this.btnOk.setEnabled(false);

}

Bouton « Annuler »

Dispose() ;

Dans cette étape on va ajouter les actions aux éléments du menu, il suffit de faire appel aux fonctions qui font le même travail pour les boutons « Ajouter, Modifier, et Supprimer ».
Pour la phase de recherche i suffit de créer une fonction dans la classe « Manip_data_Base » qui permet de chercher selon l'élément voulu : « nom, prénom, numéro », puis ajouter les actions aux éléments du menu « Recherche » :

MnRechNom.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        String s = JOptionPane.showInputDialog("Donner le nom du contact");
        if(s.isEmpty()){
         JOptionPane.showMessageDialog(null, "Nom est vide");
        }else{
            vectContact.removeAllElements();
            vectContact = mdb.RechercheString("where nom like '%"+s+"%' ");
            MTC = new ModelTableauContac(vectContact);
            tabContac.setModel(MTC);
            tabContac.setRowHeight(25);
        }
    }
});

Finalement pour exporter le projet en une application exécutable il suffit de suivre les étapes suivantes :
File -> export -> (sélectionner Java) -> Runnable JAR file

Choisir la classe où il y a le Main (dans notre cas la classe « Annuaire.java » qui contient le Main), puis choisir l'emplacement d'exportation du projet.

Je souhaite que vous apprécier le travail...

A voir également
Ce document intitulé « Tutoriel pour la création d'une petite application « Annuaire » en Java. » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.