Récupéré des données dans un JTable

Résolu
cs_Stoufy1605 Messages postés 61 Date d'inscription vendredi 7 janvier 2011 Statut Membre Dernière intervention 17 avril 2013 - 20 août 2012 à 14:12
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 29 août 2012 à 13:53
Bonjour à la communauté code source!!!!!

Voilà, je crée un projet pour mes cours, et j'ai un minuscule soucis. Pour expliqué en gros, je dois récupéré des données d'une base de donnée et les envoyé dans une JTable. J'ai donc créer une méthode qui renvoie une méthode qui renvoie un tableau, cette méthode récupère donc des données de ma base de donnée et les insèrent dans un tableau, ensuite ce tableau est renvoyé dans une classe fenêtre (qui fait partie de mon interface graphique), seulement malgré le fait que j'ai fait l'import de ma classe contenant ma méthode renvoyant mon tableau, eclipse ne l'accepte pas.

voici le code de ma méthode renvoyant un tableau :
public Object [] tableauDesDonnees()
        
       {
        	Object[][] tableauDesDonnees = null;
       try {
    	   
    	   Statement state  = this.connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
    	   String requete = "SELECT * FROM journaliste";
    	   ResultSet result = state.executeQuery(requete);
    	  ResultSetMetaData meta = result.getMetaData(); 
    	   result.last();
    	   int row = result.getRow();
    	   Object [][]data =  new Object [result.getRow()] [((ResultSetMetaData) result).getColumnCount()];
    	   result.beforeFirst();
    	   int j= 1;
    	   while (result.next())
    	   {
    		   for(int i = 1; i<= meta.getColumnCount();i++)
    		   {
    			   data [j-1][i-1] = result.getObject(i);
    			   j++;
    		   }
    	   }
    	   
       }
       catch (SQLException e)
       {
    	   e.printStackTrace();
       }
       
       return tableauDesDonnees;
       } 
        


voici le code de ma fenêtre contenant ma JTable :
fenetre.getContentPane().add(internalFrame);


Object[][] data ={{tableauDesDonnees}};

String [] nomDesColonnes = {"Nom","Prenom","Agence","EMAIL","ID"};

JTable tableau = new JTable(data, nomDesColonnes);
internalFrame.getContentPane().add(new JScrollPane(tableau));




cette ligne-ci pose problème :
Object[][] data ={{tableauDesDonnees}};


Je suis conscient du fait que l'objet "data" ne doit prendre qu'un objet (dans ce cas-ci) String(et non pas une méthode), cependant je ne vois pas trop comment je pourrais faire pour arranger le problème.
Merci d'avance à la communauté code-source!!!!!

21 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
20 août 2012 à 14:35
Salut,

Commence par remplacer : public Object [] tableauDesDonnees() par
public Object[][] tableauDesDonnees()


Tu pourras alors faire
Object[][] data = tableauDesDonnees();
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
20 août 2012 à 14:37
Mais bon, je trouve que la méthode n'est pas extra. C'est assez systématique, les gens pensent qu'il est plus pratique d'avoir un tableau avec les données de la base. La resultset est un objet plus adapté.

Le mieux est de se servir de la resultset pour reconstruire des objets métier.
3
cs_Stoufy1605 Messages postés 61 Date d'inscription vendredi 7 janvier 2011 Statut Membre Dernière intervention 17 avril 2013 2
21 août 2012 à 02:44
Bonjour Maître!!!!(et non j'ai pas oublié!!!)

 public Object [][] tableauDesDonnees()
        
       {
        	Object[][] tableauDesDonnees = null;
       try {
    	   
    	   Statement state  = this.connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
    	   String requete = "SELECT * FROM journaliste";
    	   ResultSet result = state.executeQuery(requete);
    	  ResultSetMetaData meta = result.getMetaData(); 
    	   result.last();
    	   int row = result.getRow();
    	   Object [][]data =  new Object [result.getRow()] [((ResultSetMetaData) result).getColumnCount()];
    	   result.beforeFirst();
    	   int j= 1;
    	   while (result.next())
    	   {
    		   for(int i = 1; i<= meta.getColumnCount();i++)
    		   {
    			   data [j-1][i-1] = result.getObject(i);
    			   j++;
    		   }
    	   }
    	   
       }
       catch (SQLException e)
       {
    	   e.printStackTrace();
       }
       
       return tableauDesDonnees;
       } 
        



internalFrame.setClosable(true);
internalFrame.setMaximizable(true);
internalFrame.setIconifiable(true);
internalFrame.setBounds(50, 43, 265, 255);
fenetre.getContentPane().add(internalFrame);


Object[][] data =tableauDesDonnees();

String [] nomDesColonnes = {"Nom","Prenom","Agence","EMAIL","ID"};

JTable tableau = new JTable(data, nomDesColonnes);
internalFrame.getContentPane().add(new JScrollPane(tableau));

internalFrame.setVisible(true);
nouvelArticle.setBounds(31, 32, 305, 318);


J'ai fait les modifications demandées, effectivement de ce côté, il y avait une erreur, cependant cela renvoit toujours une erreur à la même ligne :
Object[][] data =tableauDesDonnees();


Aurais-tu une autre erreur à déceler. Je pense que l'objet data ne peut pas prendre de méthode comme composant, cependant je ne vois pas du tout comment faire.
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 août 2012 à 09:00
Ce n'est pas la méthode qui est utilisée pour créer data mais c'est le résultat de cette méthode. Tu es bien dans la même classe ?

Sinon, c'est que tu dois attacher ta méthode tableauDesDonnees() à une instance de la classe qui contient la méthode. Ou alors, utilises une méthode static.

Si ce n'est pas ça, c'est quoi le message d'erreur ?
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Stoufy1605 Messages postés 61 Date d'inscription vendredi 7 janvier 2011 Statut Membre Dernière intervention 17 avril 2013 2
21 août 2012 à 13:00
Voici l'erreur :

The method tableauDesDonnees() is undefined for the type fenetre

Donc si je comprends bien l'erreur, je voulais essayer de rajouter un argument à mon type fenêtre, mais cela ne vas pas non plus. J'ai essayer ta solution mais cela ne fonctionne pas non plus.

La méthode déclaré en static ne vas pas.

Pour répondre à ta question, je ne suis pas dans la même classe, ma classe fenêtre fait partie d'une classe qui n'instancie que la partie swing, par contre la méthode
public Object [][] tableauDesDonnees()

fait partie d'une classe appelée "DAOJournaliste", j'ai fait les import nécessaires à savoir "import DAOJournaliste;", et puis de toute façon dans ma classe fenêtre, j'utilise d'autres méthodes qui fonctionnent venant de la classe "DAOJournaliste", cela veut donc dire que l'erreur ne se situe pas là. J'avais pensé à éventuellement récupéré les résultats de ma méthode dans un tableau (encore un) mémoire déclaré dans ma classe fenetre, mais cela ne va pas non plus. Voilà en tout cas les résultats de ma réflexion, n'aboutissant pas.
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 août 2012 à 13:54
Tu as écris ce code dans une classe fenetre :
internalFrame.setClosable(true);
internalFrame.setMaximizable(true);
internalFrame.setIconifiable(true);
internalFrame.setBounds(50, 43, 265, 255);
fenetre.getContentPane().add(internalFrame);


Object[][] data =tableauDesDonnees();

String [] nomDesColonnes = {"Nom","Prenom","Agence","EMAIL","ID"};

JTable tableau = new JTable(data, nomDesColonnes);
internalFrame.getContentPane().add(new JScrollPane(tableau));

internalFrame.setVisible(true);
nouvelArticle.setBounds(31, 32, 305, 318);


La méthode que tu cherches à appeler (tableauDesDonnees) est dans la classe DAOJournaliste.

Donc, soit tu vas un
Object[][] data = new DAOJournaliste().tableauDesDonnees();


Soit tu passes la méthode tableauDesDonnees en static et tu fais
Object[][] data = DAOJournaliste.tableauDesDonnees();
3
cs_Stoufy1605 Messages postés 61 Date d'inscription vendredi 7 janvier 2011 Statut Membre Dernière intervention 17 avril 2013 2
21 août 2012 à 22:43
J'ai essayer les deux solutions, cela ne résoud pas le problème, il me renvoit un java null poniter exception
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
22 août 2012 à 09:30
NullPointerException c'est un autre problème mais on progresse,

Object[][] tableauDesDonnees = null; instancie ton objet à null.

La dernière ligne :

return tableauDesDonnees;

Donc, tu retournes null, ce qui n'est pas ce que tu souhaites... Il faut que tu retournes data en réalité :

public Object [][] tableauDesDonnees()
        
       {
        	Object[][] data = null;
       try {
    	   
    	   Statement state  = this.connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
    	   String requete = "SELECT * FROM journaliste";
    	   ResultSet result = state.executeQuery(requete);
    	  ResultSetMetaData meta = result.getMetaData(); 
    	   result.last();
    	   int row = result.getRow();
    	   data =  new Object [result.getRow()] [((ResultSetMetaData) result).getColumnCount()];
    	   result.beforeFirst();
    	   int j= 1;
    	   while (result.next())
    	   {
    		   for(int i = 1; i<= meta.getColumnCount();i++)
    		   {
    			   data [j-1][i-1] = result.getObject(i);
    			   j++;
    		   }
    	   }
    	   
       }
       catch (SQLException e)
       {
    	   e.printStackTrace();
       }
       
       return tableauDesDonnees;
       } 
3
cs_Stoufy1605 Messages postés 61 Date d'inscription vendredi 7 janvier 2011 Statut Membre Dernière intervention 17 avril 2013 2
22 août 2012 à 21:22
PREMIERE HYPOTHESE :Je suppose que tu as voulu dire dans ce cas "return data;" et non pas "return tableauDesDonnees", si jai bien compris ton explication.
Dans ce cas-ci, il me renvoie une erreur à cette ligne :

Object[][] data = new DAOJournaliste().tableauDesDonnees();


il me dit qu'il faut ajouter des arguments à la ligne DAOJournaliste, j'ai donc ajouter ces arguments :
Object[][] data = new DAOJournaliste(null, null, null, null, 0).tableauDesDonnees();


Les 4 premiers "null" sont de type String, le "0" est de type int, selon ma logique si je dois ajouter des arguments à DAOJournaliste, si il sont null, cela n'est pas très grave car j'applique la méthode renvoyant un tableau et donc l tableau n'est pas vide. Cependant, une erreur se lève alors de type "java.lang.ClassCastException: org.postgresql.jdbc4.Jdbc4ResultSet cannot be cast to java.sql.ResultSetMetaData", et la ligne qui pose probème alors est :
data =  new Object [result.getRow()] [((ResultSetMetaData) result).getColumnCount()];


DEUXIEME HYPOTHESE : J'ai laissé ce code tel quel (en reprenant le "return tableauDesDonnees();"), et dans c cas le résultat est le même : je dois rajouter des arguments à DAOJournaliste que je fais de la même manière que dans ma première hypothèse (null, null,null, null,0) et il me renvoit la même erreur à savoir :
"java.lang.ClassCastException: org.postgresql.jdbc4.Jdbc4ResultSet cannot be cast to java.sql.ResultSetMetaData"

je suis vraiment désolé(je m'en veux de ne pas trouver la solution par moi même) et je te remercie du fond du coeur pour ton aide)
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
23 août 2012 à 08:30
Oui, il fallait bien utiliser un return data.

Tu réutilises un code que tu n'as pas écrit toi même, j'ai l'impression que je le maîtrises pas du tout son architecture.

Dans le constructeur de DAOJournaliste, quel sont les attributs ? Peux tu me copier le code. Mais, je pense que null et 0 ne sont pas forcément des valeurs très adaptées. Tu peux utiliser dans ce cas une méthode static de façon à ne pas appeler le constructeur.

Effectivement, si ton but est d'utiliser la méthode, tu peux passer null et 0 mais c'est un peu brouillon.

Cette ligne ne va pas :
((ResultSetMetaData) result)


Je pense que tu ne connais pas le fonctionnement du cast, ce n'est pas une conversion, il faut que l'objet ait le bon type en mémoire.

Essayes :
result.getMetaData().getColumnCount()
3
cs_Stoufy1605 Messages postés 61 Date d'inscription vendredi 7 janvier 2011 Statut Membre Dernière intervention 17 avril 2013 2
24 août 2012 à 01:34
Oups, désolé!!! l'erreur que j'ai mis précédamment était une petite erreur de ma part (je n'avais pas mis les bons arguments) en réalité il me renvoie un java null pointer exception, avec un retour erreur à

Statement state  = connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);


Les attributs de DAOJournaliste sont :

public class DAOJournaliste extends DAO<Journaliste1>{

public DAOJournaliste(String nom, String prenom, String agence, String email, int id) {
    	if(connect==null)
    		connect = DAOConnexion.getConnexion();
}


Ma méthode de programmation a été la suivante: 4 packages = interface graphique, DAO, POJO, pogramme. Pour la méthode de renvoie des données : J'ai donc un menu qui appelle une JInternalFrame qui renvoie un JTable qui devrait contenir les données de ma base. Ces données sont envoyés par l'intermédiaire de la classe DAOJournaliste qui pour le moment est la suivante :

 public  static Object [][] tableauDesDonnees()
        
       {
        	Object[][] data = null;
       try {
    	   
    	   Statement state  = connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
    	   String requete = "SELECT * FROM journaliste";
    	   ResultSet result = state.executeQuery(requete);
    	  ResultSetMetaData meta = result.getMetaData(); 
    	   result.last();
    	   int row = result.getRow();
    	   data =  new Object [result.getRow()] [((ResultSetMetaData) result).getColumnCount()];
    	   result.beforeFirst();
    	   int j= 1;
    	   while (result.next())
    	   {
    		   for(int i = 1; i<= meta.getColumnCount();i++)
    		   {
    			   data [j-1][i-1] = result.getObject(i);
    			   j++;
    		   }
    	   }
    	   
       }
       catch (SQLException e)
       {
    	   e.printStackTrace();
       }
       
       return data;
       } 
        
    

Le code de mon interface graphique est la suivante =

internalFrame.setClosable(true);
internalFrame.setMaximizable(true);
internalFrame.setIconifiable(true);
internalFrame.setBounds(325, 283, 265, 255);
fenetre.getContentPane().add(internalFrame);


Object[][] data = DAOJournaliste.tableauDesDonnees();
String [] nomDesColonnes = {"Nom","Prenom","Agence","EMAIL","ID"};

JTable tableau = new JTable(data, nomDesColonnes);
tableau.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
internalFrame.getContentPane().add(new JScrollPane(tableau));



Dans ma base de données il y a des données(ce que je veux dire par là c'est que mes tables ne sont pas vides) !
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
24 août 2012 à 08:42
Je pense que connect est null, essayes de faire un System.out.println(connect); avant la ligne

Statement state  = connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

pour vérifier.

Si c'est le cas, c'est ta méthode DAOConnexion.getConnexion() qui ne va pas.
3
cs_Stoufy1605 Messages postés 61 Date d'inscription vendredi 7 janvier 2011 Statut Membre Dernière intervention 17 avril 2013 2
25 août 2012 à 17:44
Ma connexion s'établit parfaitement, le problème n'est donc pas là!
De toute façon, les autres requêtes de mon programme fonctionnent,j'ai utilisé la même classe DAOConnexion, dnc si il y avait une erreur à ce niveau, il aurait renvoyé également une erreur.
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
27 août 2012 à 09:03
Essayes de placer un sysout de cette manière :
Sytem.out.println("Connexion:"connect);
Statement state  = connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);


Et dis moi ce que tu obtiens...
3
cs_Stoufy1605 Messages postés 61 Date d'inscription vendredi 7 janvier 2011 Statut Membre Dernière intervention 17 avril 2013 2
28 août 2012 à 18:07
Bonjour,

Voici ce qu'il me renvoie, je suis désolé j'ai été pris par d'autres examens.


Connexion:null
java.lang.NullPointerException
at be.steve.DAO.DAOJournaliste.tableauDesDonnees(DAOJournaliste.java:134)
at interfaceGraphique.fenetre.initialize(fenetre.java:196)
at interfaceGraphique.fenetre.(fenetre.java:93)
at interfaceGraphique.fenetre$1.run(fenetre.java:78)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Merci beaucoup.
3
cs_Stoufy1605 Messages postés 61 Date d'inscription vendredi 7 janvier 2011 Statut Membre Dernière intervention 17 avril 2013 2
28 août 2012 à 18:12
Donc tu avais tout à fait raison, mon connect est null, comment faire pour arranger le problème?

Voici mon code de ma DAOConnexion =
public class DAOConnexion{

/*
 * Singleton de connexion
 * 
 * 
 * 
 */


private String url = "jdbc:postgresql://localhost:5432/GestionJournal";
private String user = "postgres";
private String passwd = "190707190707";
private static Connection connexion = null;
//Class.forName("org.postgresql.Driver");
// l'objet est static : il n'en n'existe donc qu'un seul exemplaire, quelque soit le nombre d'objet de la classe.


private DAOConnexion(){
//le constructeur fait la connexion, mais il n'est accessible qu'en interne
try {
connexion = DriverManager.getConnection(url, user, passwd);
//connexion = DriverManager.getConnection(url);
} catch (SQLException e) {
e.printStackTrace();
}
}

public static Connection getConnexion(){
//l'instanciation active le constructeur
if(connexion == null){
new DAOConnexion();
}
return connexion;	
}	
}

Et ce que je ne comprends pas non plus c'et comment cela se passe que lorsque j'exécute la méthode "create", cela fonctionne normalement.
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
29 août 2012 à 08:43
Connexion:null

J'ai vu ton erreur : a chaque fois que tu fais un new DAOConnexion, un nouvel objet est créé. Il ne suffit donc pas d'appeler le constructeur pour instancier la connexion sur une autre instance de ta classe.

if(connexion == null){
new DAOConnexion();//Créé une nouvelle instance de la classe qui ne sert à rien
}


Je te conseil de créer une classe :

public class ConnexionPostgresql {

   private static final ConnexionPostgresql instance = new ConnexionPostgresql();

   private final String URL = "jdbc:postgresql://localhost:5432/GestionJournal";
   private final String USER = "postgres";
   private final String PASSWD = "190707190707";
   
   private Connexion connexion;
   
   private ConnexionPostgresql(){
      connexion = DriverManager.getConnection(URL, USER, PASSWD);
   }

   public void getConnexion(){
      return connexion;
   }

   public static ConnexionPostgresql getInstance(){
      return instance;
   }


}


De cette manière, tu initialises une fois pour toute ta connexion, et quand tu en as besoin, tu fais :
ConnexionPostgresql.getInstance().getConnexion()
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
29 août 2012 à 08:44
Pardon, j'ai commis une petite erreur dans le code que je t'ai donné, utilises celui ci :

public class ConnexionPostgresql {

   private static final ConnexionPostgresql instance = new ConnexionPostgresql();

   private final String URL = "jdbc:postgresql://localhost:5432/GestionJournal";
   private final String USER = "postgres";
   private final String PASSWD = "190707190707";
   
   private Connexion connexion;
   
   private ConnexionPostgresql(){
      connexion = DriverManager.getConnection(URL, USER, PASSWD);
   }

   public Connexion getConnexion(){
      return connexion;
   }

   public static ConnexionPostgresql getInstance(){
      return instance;
   }


}
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
29 août 2012 à 08:45
Si tu veux traiter proprement l'exception, il faudra la réencapsuler dans un autre type d'exception et la propager, mais si tu ne sais pas comment faire, tu peux te contenter d'un printStackTrace.
3
cs_Stoufy1605 Messages postés 61 Date d'inscription vendredi 7 janvier 2011 Statut Membre Dernière intervention 17 avril 2013 2
29 août 2012 à 12:38
Merci maître!!!!

cela a fonctionné parfaitement!!!! Tu a sauvé mon projet, cela fonctionne maintenant!!! Merci baucoup du fond du coeur pour ton aide!!!
3
Rejoignez-nous