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

Composants Java Discussion :

Peupler une JTable à partir de JDBC


Sujet :

Composants Java

  1. #1
    Membre averti Avatar de LhIaScZkTer
    Inscrit en
    Mai 2004
    Messages
    564
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2004
    Messages : 564
    Points : 301
    Points
    301
    Par défaut Peupler une JTable à partir de JDBC
    Bonjour à tous,

    J'ai un problème avec ma JTable j'arrive pas à mettre le résultat de ma requête à l'intérieur. Il me renvoie un NullPointerException, mais pourtant ma requête renvoie bien un résultat.

    Voici le code de ma JTable :
    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
     
    package vue;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
     
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
     
    import modele.Conclient;
     
    public class Vue_TableClient extends JPanel{
    	private String[] NomColonne;
    	public String[] getNomColonne() {
    		return NomColonne;
    	}
    	public void setNomColonne(String[] nomColonne) {
    		this.NomColonne = nomColonne;
    	}
     
     
    	private Object[] [] data;
    	public Object[][] getData() {
    		return data;
    	}
    	public void setData(Object[][] data) {
    		this.data = data;
    	}
     
     
    	public Vue_TableClient(){
    		Conclient con = new Conclient();
     
    		this.setLayout(new BorderLayout());
    		//Valeur temporaire pour éviter l'erreur NullPointerException
    		String [] nomcol={"Code","Nom","Localite"};
    		setNomColonne(nomcol);
    		//String [][]donne =  ;
    		//setData(donne);
     
    		JTable TableClient = new JTable( getData(), getNomColonne());
    	    //JScrollPane TableClientScroll = new JScrollPane(TableClient);
    	    //this.add(TableClientScroll);
    	    this.add(new JScrollPane(TableClient));
    	}
    }
    Et voici le code de ma connexion :
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    package modele;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
     
    import vue.Vue_TableClient;
     
    public class Conclient {
    	private Connection conn = null;
     
    	public Conclient(){
    		//Connection conn = null;
    	    //Statement statement = null;
    	    //ResultSet resultSet = null;
     
    		String classDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    		String driverJdbc = "";
    		String serverAdress ="LHIASCZKTER\\SQLEXPRESS";
    		String bdd ="sqlclient";
    		String user ="root";
    		String pass="";
     
    		try {
    			Class.forName(classDriver);
     
    			// Création de la connexion vers le serveur de bd
    			conn = DriverManager.getConnection(
    						"jdbc:sqlserver://" + serverAdress +
    					 	";database=" + bdd + 
    						";user=" + user + 
    						";password=" + pass
    						);
     
    		}catch (ClassNotFoundException e) {
    			System.out
    			.println("Le fichier CLASS java du Driver SQL n'a pas été trouvé");
    			System.out.println(e.getMessage());
    		}catch (SQLException e) {
    			System.out
    			.println("Probleme lors de la création d'une connexion");
    			System.out.println(e.getMessage());
    		}
    		System.out.println("La connexion à été effectué");
    	}
     
    	public void affiche(){
    		String query = "SELECT * FROM client;";
    		ResultSet results;
     
    		try {
    			Statement stmt = conn.createStatement();
     
    			results = stmt.executeQuery(query);
    			 while(results.next()){
    				 String code_client = results.getString("code_client");
    				 String nom = results.getString("nom");
    				 String localite = results.getString("localite");
     
    				 //Ici j'aimerais, je dis bien J'AIMERAIS mettre le résultat
    				 //de la requête dans la table :-)
    				 String[][]donne ={{code_client,nom,localite}};
    				 Vue_TableClient vtl = new Vue_TableClient();
    				 vtl.setData(donne);
     
    				 //Ici j'affiche le résultat de la requête dans la console
    				 System.out.println(code_client + " " + nom + " " +localite);
     
    			 }
    		}
     
    		catch(Exception e){
    			System.out.println("Une erreur subsiste dans la requête(nom de la colonne de la table)");
     
    		}
     
    	}
    }
    Quand je teste ma méthode Conclient .affiche(); il m'affiche le résultat de la requête dans la console, donc côté requête c'est tip-top.

    C'est vraiment côté JTable que je comprends pas ce qu'il se passe. Pourtant j'y croyais puisque c'est presque le même chose que les exemples fournis par java

    Une petite chose encore savez-vous aussi pourquoi quand je teste ma méthode Conclient .affiche(); via la console il me renvoie :
    La connexion à été effectué
    La connexion à été effectué
    nfa Martin Los Avanchez
    La connexion à été effectué
    nfp Von cock Saint-tropez
    J'ai l'impression que j'aurais autant de connexion que d'enregistrement c'est normal ça ?

    Merci à tous pour votre aide.
    Sun Certified Java Programmer, SE 6 et Sun Certified Web Component Developer, J2EE 5

  2. #2
    Membre averti Avatar de LhIaScZkTer
    Inscrit en
    Mai 2004
    Messages
    564
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2004
    Messages : 564
    Points : 301
    Points
    301
    Par défaut
    Re à tous

    Je cherche toujours la réponse à ma question et j'ai essayé de bidouiller( je pense que c'est le mot exact) mais sans grand succès. Je vous montre se que j'ai fait si quelqu'un à une idée...

    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 void affiche(){
    		String query = "SELECT * FROM client;";
    		ResultSet results;
    		 Vue_TableClient vtl = new Vue_TableClient();
    		try {
    			Statement stmt = conn.createStatement();
     
    			results = stmt.executeQuery(query);
    			int coltab = results.getFetchSize()+2;
    			 String[][]donne = new String [coltab][3];
     
    			 while(results.next()){
    				 String code_client = results.getString("code_client");
    				 String nom = results.getString("nom");
    				 String localite = results.getString("localite");
     
    				 //Ici j'aimerais, je dis bien J'AIMERAIS mettre le résultat
    				 //de la requête dans la table :-)
    				 donne [coltab][0] = code_client;
    				 donne [coltab][1] = nom;
    				 donne [coltab][2] = localite;
    				 vtl.setData(donne);
     
    				 //Ici j'affiche le résultat de la requête dans la console
    				 System.out.println(code_client + " " + nom + " " +localite);
     
    			 }
    		}
     
    		catch(Exception e){
    			System.out.println("Une erreur subsiste dans la requête(nom de la colonne de la table)");
     
    		}
     
    	}
    J'ai toujours cette même erreur, mais je ne sais pas pourquoi puisque là j'ai tout fais comme il faut
    En plus je dois rendre mon projet vendredi et je capte rien du tout.

    Merci à tous pour votre aide
    Sun Certified Java Programmer, SE 6 et Sun Certified Web Component Developer, J2EE 5

  3. #3
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    tu oublis visiblement d'utiliser un Modèle pour ta table :

    tu peux recuperer et adapter le code qui vient de la :
    cf : http://developpez.net/forums/showthread.php?t=264063


    le morceau qui t'interesse :
    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
    	private void update(String tablename){
     
     
    		try{
    			ResultSet rs = db.getStatement().executeQuery("select * from "+ tablename +";");
    			ResultSetMetaData metadata = rs.getMetaData();
    			col = new String[metadata.getColumnCount()] ;
     
    			for(int I=0; I< metadata.getColumnCount(); I++){
    				col[I] = metadata.getColumnName(I+1);
    				}
     
    			mtm = new TableModel(transformInArray(rs),col);
     
    			jt = new JTable(mtm);
     
    			jsp = new JScrollPane(jt);
    			this.removeAll();
    			this.add(jsp);
    			this.revalidate();
    			this.repaint();
    		}
    		catch(Exception e){
    			System.out.println(e);
    			erreur = new JPanel();
    			erreur.add(new JLabel("Connexion échoué"));
     
    			jsp = new JScrollPane(erreur);
    			this.removeAll();
    			this.add(jsp);
    			this.revalidate();
    			this.repaint();
    		}
    	}
     
     
    	private ArrayList<ArrayList<Object>> transformInArray(ResultSet rset){
     
    		ArrayList<ArrayList<Object>> retour = new ArrayList<ArrayList<Object>>();
    		int T = 0;
    		int nbcolonne = 0;
     
     
    		try{
     
    			nbcolonne = rset.getMetaData().getColumnCount();
     
    			while( rset.next() ){
    				ArrayList<Object> rec = new ArrayList<Object>();
     
    				while( T<nbcolonne ){					
    					rec.add( rset.getObject(T+1) );
    					T++;
    					}
     
    				retour.add(rec);
    				T = 0;
    				}
    			}
    		catch(Exception e){System.out.println("erreur de convertion en vecteur : " + e.toString());}
     
    		return (retour);
     
    		}

    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
     
    class TableModel extends AbstractTableModel {
     
    	private static final long serialVersionUID = 1;
            private String[] columnNames = { "Nom", "Prenom", "Montant" };
            private ArrayList<ArrayList<Object>> data = new ArrayList<ArrayList<Object>>();
     
     
            public TableModel( ArrayList<ArrayList<Object>> dat, String[] cols){
            	super();
            	columnNames = cols;
            	data = dat;
            	}
     
            public TableModel( ArrayList<ArrayList<Object>> dat){
            	super();
            	data = dat;
            	}
     
            public void misajour( ArrayList<ArrayList<Object>> dat){
            	data = dat;
            	}
     
            public int getColumnCount() {
                return columnNames.length;
            	}
     
            public int getRowCount() {
                return data.size();
            	}
     
            public void setColumn(String[] column){
            	columnNames = column;
            	}
     
            public String getColumnName(int col) {
                return columnNames[col];
            	}
     
            public Object getValueAt(int row, int col) {
            	ArrayList<Object> v = data.get(row);
                return v.get(col);
            	}
     
            public Class<?> getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            	}
     
            public boolean isCellEditable(int row, int col) {
            	return false;
            	}
     
            public void setValueAt(Object value, int row, int col) {
            	ArrayList<Object> v = data.get(row);
            	v.set(col, value);
                fireTableCellUpdated(row, col);
            	}
     
        }
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

    Pour un monde sans BigBrother IxQuick ni censure RSF et Les moutons

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 89
    Points
    89
    Par défaut
    Salut,
    Je pense que le :

    La connexion à été effectué
    La connexion à été effectué
    nfa Martin Los Avanchez
    La connexion à été effectué
    nfp Von cock Saint-tropez
    vient du fait que tu appelles le constructeur de Vue_TableClient dans ta boucle
    qui lui même appelle le construcetur de conClient...

  5. #5
    Membre averti Avatar de LhIaScZkTer
    Inscrit en
    Mai 2004
    Messages
    564
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2004
    Messages : 564
    Points : 301
    Points
    301
    Par défaut
    Quoi!!!!!!!!!!!!!!!!!!!!!!!!

    Merci Eclesia, mais ça veut dire que je suis totalement à côté de la plaque avec mon truc
    Tant de ligne de code pour si peut de chose lol j'ai que deux client à afficher... Bon apparemment la POO c'est pas encore mon truc ...

    Dire que dès demain j'aurais mon diplôme et je comprend encore rien à la programmation c'est encouragent pour mon stage...

    Merci Loïc31 ton intervention à été plus rapide à comprendre pour mon seul neurone

    Merci à vous deux pour votre aide !!!
    Sun Certified Java Programmer, SE 6 et Sun Certified Web Component Developer, J2EE 5

  6. #6
    Membre averti Avatar de LhIaScZkTer
    Inscrit en
    Mai 2004
    Messages
    564
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2004
    Messages : 564
    Points : 301
    Points
    301
    Par défaut
    Haaa j'oubliais avant de mettre comme je ne veux pas mourir bête( ou plus bête que je ne le suis déjà) et qu'il faut apprendre de ces erreurs( ou con...ries). Pour le deuxième code que j'ai pondu ne marche pas ?

    Merci
    Sun Certified Java Programmer, SE 6 et Sun Certified Web Component Developer, J2EE 5

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 89
    Points
    89
    Par défaut
    pas de probleme!

    Disons que utiliser un tableModel serait plus propre, mais je m'y suis cassé quelques dents au début donc je comprends ton désarroi :
    Quoi!!!!!!!!!!!!!!!!!!!!!!!!
    Je pense que tu peux t'en sortir sans.

    Quand tu déclares
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JTable TableClient = new JTable( getData(), getNomColonne());
    il faut que tes données data soit déja définies, et si tu modifies data par la suite, ca ne sera pas actualisé dans ta jtable.

    Je pense qu'un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Conclient con = new Conclient();	
    String [] nomcol={"Code","Nom","Localite"};
    Object[][] data = con.retourneData();
    JTable TableClient = new JTable( data, nomcol);
    en modifiant ta fonction affiche pour qu'elle te renvoie un Object[][]

    devrait marcher...

  8. #8
    Membre averti Avatar de LhIaScZkTer
    Inscrit en
    Mai 2004
    Messages
    564
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2004
    Messages : 564
    Points : 301
    Points
    301
    Par défaut
    Merci beaucoup je testerais ça plus tard

    Allez merci à tous, bonne journée et bon week-end
    Sun Certified Java Programmer, SE 6 et Sun Certified Web Component Developer, J2EE 5

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

Discussions similaires

  1. [Jena] Instancier (peupler) une ontologie à partir de MySQL
    Par houda8086 dans le forum Frameworks
    Réponses: 0
    Dernier message: 23/03/2014, 10h57
  2. Réponses: 4
    Dernier message: 23/01/2013, 10h40
  3. Remplir une JTable à partir de la base de données
    Par L'aigle de Carthage dans le forum Composants
    Réponses: 1
    Dernier message: 13/03/2012, 17h28
  4. Réponses: 4
    Dernier message: 24/05/2009, 13h06

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