Debutant avc jtable

Signaler
Messages postés
9
Date d'inscription
jeudi 17 décembre 2009
Statut
Membre
Dernière intervention
27 mars 2010
-
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
-
Bonjour tous le monde, j'ai commencé un projet avec netbeans qui est déjà connecté avec la base de données oracle.
Je veux pouvoir afficher le contenue d'une table de ma base de donnée dans une interface jtable.
j'ai commencé à ecrire cette fonction mais je ne sais pas qu'est ce qui manque ni comment appeler cette fonction dans le main

voici la fonction :
JTable remplirTable() {
Vector tabLignes=new Vector(), nomCols=new Vector();
int i;
try {
String requeteMysql = "Select * From javaEtudiant";//chaine contenant la requete a executée
ResultSet resultRequete;
Statement statement = null;
// statement = (Statement) new Configuration().connexion.createStatement();//creation du statement a partir de la chaine de connexion qui est placée dans la classe de connexion au MYsql
resultRequete = (ResultSet) statement.executeQuery(requeteMysql);//excuter la requete et la mettre dans une variabale ResulatSet
// Extraire noms des colonnes; les placer dans Vector nomCols
ResultSetMetaData md = resultRequete.getMetaData();
nomCols = new Vector();
for( i=1; i<=md.getColumnCount (); i++)
nomCols.add( md.getColumnLabel(i));
// Mémoriser le résultat dans la JTable
while( resultRequete.next()) {
//placer les valeurs dans Vector ligne
Vector ligne=new Vector();
//le 3 designe le nombre de colonnes qui doit etre connu dans la table
for(i=1; i<=3; i++)
{
String ch=resultRequete.getString(i);
ligne.add(ch);
}
tabLignes.add(ligne);
}
}
catch(Exception e) {
System.out.print("erreur1 "+e.getMessage());//récuperer le message d'erreur en cas d'erreur
}

return new JTable(tabLignes,nomCols);//type de retour qui initialise le JTable par la liste des vecteur envoyées remplis des tables
}

merci d'avance

18 réponses

Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
10
table.setModel(remplirTable().getModel());
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Salut,

Cette fonction permet de renvoyer une JTable déjà initialisée avec toutes les données.

Si tu as fais ton interface graphique par code, aucun problème : tu sais déjà comment ajouter un JTable dans une JFrame avec un layout, tu n'as plus qu'à le faire en prenant cette JTable.

Maintenant, si tu as fais ton interface graphique avec le designer de netbeans... ben tu n'as plus qu'à adapter ce code pour qu'il remplisse le jtable crée par netbeans, car netbeans refusera de lire ton code si tu modifie le code qu'il t'a généré... encore un cas où l'utilisation d'un plugin de création de GUI bride les possibilités.

Quand est-ce que tout le monde comprendra que l'utilisation d'un générateur d'interface graphique est une perte de temps ???
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Messages postés
9
Date d'inscription
jeudi 17 décembre 2009
Statut
Membre
Dernière intervention
27 mars 2010

en fait j'ai fais mon interface graphique avec le designer de netbeans et je veut donc dans le main de cette interface faire appel à ma fonction remplireTable()
mon main est le suivant :

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
jTable1.setModel(remplirTable().getModel()); //erreur dans cette ligne
new AfficherElimination().setVisible(true);
}
});
}

uhrand j'ai essayé avec ce que tu m'as dis en remplaçant "table.setModel" par le nom de mon tableau qui est jtable1 mais ça marche pas :( comment je fais ?
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Salut,

Ok, donc il te faut modifier ta fonction : passe lui le JTable à remplir par exemple au lieu de construire une nouvelle JTable qui te servira à rien :
void remplirTable(JTable table) { 
Vector tabLignes=new Vector(), nomCols=new Vector(); 
int i; 
try { 
String requeteMysql = "Select * From javaEtudiant";//chaine contenant la requete a executée 
ResultSet resultRequete; 
Statement statement = null; 
// statement = (Statement) new Configuration().connexion.createStatement();//creation du statement a partir de la chaine de connexion qui est placée dans la classe de connexion au MYsql 
resultRequete = (ResultSet) statement.executeQuery(requeteMysql);//excuter la requete et la mettre dans une variabale ResulatSet 
// Extraire noms des colonnes; les placer dans Vector nomCols 
ResultSetMetaData md = resultRequete.getMetaData(); 
nomCols = new Vector(); 
for( i=1; i<=md.getColumnCount (); i++) 
nomCols.add( md.getColumnLabel(i)); 
// Mémoriser le résultat dans la JTable 
while( resultRequete.next()) { 
//placer les valeurs dans Vector ligne 
Vector ligne=new Vector(); 
//le 3 designe le nombre de colonnes qui doit etre connu dans la table 
for(i=1; i<=3; i++) 
{ 
String ch=resultRequete.getString(i); 
ligne.add(ch); 
} 
tabLignes.add(ligne); 
} 
} 
catch(Exception e) { 
System.out.print("erreur1 "+e.getMessage());//récuperer le message d'erreur en cas d'erreur 
} 

table.setModel(new DefaultModel(tabLignes, nomCols));
} 

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Messages postés
9
Date d'inscription
jeudi 17 décembre 2009
Statut
Membre
Dernière intervention
27 mars 2010

merci dark c'est une bonne idée mais pourquoi l'appel de cette fonction ne marche pas , puisque c'est un void j'ai écris dans le main :
remplirTable(jTable1); mais ce ne marche pas no-static methode cannot be referenced from a static context et no-static variable ...
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Salut,

Vu l'erreur, c'est parce que tu l'appelle à partir d'un nom de classe, et non à partir d'une instance :

// accès STATIC
TaClasse.remplirTable(...); // contexte statique : pas d'accès aux variables membres de la classe. Si la fonction n'est pas déclarée en tant que static, ca ne marchera pas !

// accès par instance
TaClasse instance = new TaClasse(); // création de l'instance
instance.remplirTable(...); // contexte instance : pas de problème, ca marche.

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Messages postés
9
Date d'inscription
jeudi 17 décembre 2009
Statut
Membre
Dernière intervention
27 mars 2010

en fait cette façon a redu la methode non statique , mais pour le tableau jtable1 comment le rendre non statique,
j'ai fait comme suit :
AfficherElimination instance = new AfficherElimination();
instance.remplirTable(jTable1);

il n'accepte pas la variable jTable1 .
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Salut,

Ben là, si tu nous montres pas ton code d'initialisation de ta jtable1, on va pas pouvoir faire grand chose pour toi.

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Messages postés
9
Date d'inscription
jeudi 17 décembre 2009
Statut
Membre
Dernière intervention
27 mars 2010

Dans un autre package j'ai crée une classe nommé liste_etudiant qui initialise la jtable , j'espère que je ne me suis pas trompé pour cette étape et j'aimerai connaitre l'étape suivante
merci



public class Listes_etudiant extends JFrame{
private static final long serialVersionUID = -4902442320396426081L;
JTable table;//instancition de JTable pour le remplissage des données a partir de la BD
Statement statement;//creation du statement à partir de la chaine de connexion pour commner les requetes
ResultSet resultRequete;//conteneur la resultat de la requete excutée
//constructeur de la class
@SuppressWarnings("static-access")
public Listes_etudiant()
{
JTable table1 = null;
// Le composant JTable
AfficherElimination instance = new AfficherElimination(); // création de l'instance
instance.remplirTable(table1); // contexte instance : pas de problème, ca marche.
table1.setPreferredScrollableViewportSize(new Dimension(500,120));//prendre la dimension de la table
// Un panneau, placé dans la fenêtre
JScrollPane panneau = new JScrollPane(table1);//mettre la table dans ascenceur
getContentPane().add(panneau, BorderLayout.CENTER);//centraliser le panneau dans la fenetre
this.pack();
this.setLocation(100, 100);
this.setVisible(true);
}
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Salut,

Il y a un problème dans le nom de tes variables (quelle idée de les appelé table1, table, etc. donne leur des données VRAIMENT explicite, du style : tableauDesEmployes) :

public class Listes_etudiant extends JFrame{
private static final long serialVersionUID = -4902442320396426081L;
JTable table;//instancition de JTable pour le remplissage des données a partir de la BD
Statement statement;//creation du statement à partir de la chaine de connexion pour commner les requetes
ResultSet resultRequete;//conteneur la resultat de la requete excutée
//constructeur de la class
@SuppressWarnings("static-access")
public Listes_etudiant()
{
JTable table[del]1 = null;/del
// Le composant JTable
AfficherElimination instance = new AfficherElimination(); // création de l'instance
instance.remplirTable(table 1 ); // contexte instance : pas de problème, ca marche.
table1.setPreferredScrollableViewportSize(new Dimension(500,120));//prendre la dimension de la table
// Un panneau, placé dans la fenêtre
JScrollPane panneau = new JScrollPane(table1);//mettre la table dans ascenceur
getContentPane().add(panneau, BorderLayout.CENTER);//centraliser le panneau dans la fenetre
this.pack();
this.setLocation(100, 100);
this.setVisible(true);
}
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Messages postés
9
Date d'inscription
jeudi 17 décembre 2009
Statut
Membre
Dernière intervention
27 mars 2010

merci dark pour tout tu m'as aidé énormément
Il reste maintenant l'appel de ces méthodes(l'initialisation puis le remplissage je suppose ) dans le main

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
AfficherElimination instance = new AfficherElimination();
instance.remplirTable(jTable1); //cette ligne est erroné
new AfficherElimination().setVisible(true);
}
});
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Salut,

C'est exactement le même problème non ? Le nom de la variable : table et non jTable1
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Messages postés
9
Date d'inscription
jeudi 17 décembre 2009
Statut
Membre
Dernière intervention
27 mars 2010

Dans ce cas comment le compilateur va comprendre qu'il s'agit bien du tableau qui se trouve dans l'interface ?!
en fait quand j'ai graphiquement insérer ce tableau dans l'interface avec deux bouton , il lui ai associer le non "Jtable1" par défaut
voila ce que j'ai dans mon interface :
private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
private javax.swing.JToggleButton jToggleButton1;
// End of variables declaration

Maintenant que j'ai fait les méthodes initialisation et remplissage , j'aimerai que mon tableau lors de l'exécution se remplisse dans valeur de la table de ma BD .
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Salut,

C'est quoi la variable table de ton code précédent alors ???

Il ne te faut qu'une seule JTable, pas besoin d'en avoir 15 000 : non seulement ca sert à rien, mais en plus ca t'induit en erreur.

Et par pitié, renomme tes variables, c'est illisible jTable1, jButton1 : comment veux-tu t'y retrouver ? Déjà que le code produit par netbeans est lamentable, alors si en plus tu ne renommes pas les variables, tu vas vite t'arracher les cheveux.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Messages postés
9
Date d'inscription
jeudi 17 décembre 2009
Statut
Membre
Dernière intervention
27 mars 2010

J'ai deux classes : chacune dans un package :
La premiére est de type java classe qui est nommée : Liste_etudiant :
la voici :

public class Listes_etudiant extends JFrame{
private static final long serialVersionUID = -4902442320396426081L;
JTable table;//instancition de JTable pour le remplissage des données a partir de la BD
Statement statement;//creation du statement à partir de la chaine de connexion pour commner les requetes
ResultSet resultRequete;//conteneur la resultat de la requete excutée
//constructeur de la class
@SuppressWarnings("static-access")
public Listes_etudiant()
{
// Le composant JTable
AfficherElimination instance = new AfficherElimination(); // création de l'instance
instance.remplirTable(table); // contexte instance : pas de problème, ca marche.
table.setPreferredScrollableViewportSize(new Dimension(500,120));//prendre la dimension de la table
// Un panneau, placé dans la fenêtre
JScrollPane panneau = new JScrollPane(table);//mettre la table dans ascenceur
getContentPane().add(panneau, BorderLayout.CENTER);//centraliser le panneau dans la fenetre
this.pack();
this.setLocation(100, 100);
this.setVisible(true);
}
}



La deuxiéme est de type jframe et elle contient mon tableau elle est nommée : Afficher_elimination et elle contient la methode remplireTable qui est le suivant :


public JTable remplirTable(JTable jTable1) {
Vector tabLignes=new Vector(), nomCols=new Vector();
int i;
try {
String requeteMysql = "Select * From javaEtudiant";//chaine contenant la requete a executée
ResultSet resultRequete1;
Statement statement1 = null;
//statement1 = (Statement) new Configuration() {}.connexion.createStatement();//creation du statement a partir de la chaine de connexion qui est placée dans la classe de connexion au MYsql
resultRequete1 = (ResultSet) statement1.executeQuery(requeteMysql);//excuter la requete et la mettre dans une variabale ResulatSet1
// Extraire noms des colonnes; les placer dans Vector nomCols
ResultSetMetaData md = resultRequete1.getMetaData();
nomCols = new Vector();
for( i=1; i<=md.getColumnCount (); i++)
nomCols.add( md.getColumnLabel(i));
// Mémoriser le résultat dans la JTable
while( resultRequete1.next()) {
//placer les valeurs dans Vector ligne
Vector ligne=new Vector();
//le 3 designe le nombre de colonnes qui doit etre connu dans la table
for(i=1; i<=3; i++)
{
String ch=resultRequete1.getString(i);
ligne.add(ch);
}
tabLignes.add(ligne);
}
}
catch(Exception e) {
System.out.print("erreur1 "+e.getMessage());//récuperer le message d'erreur en cas d'erreur
}

return new JTable(tabLignes,nomCols);//type de retour qui initialise le JTable par la liste des vecteur envoyées remplis des tables
}

donc j'ai deux méthode en tout , l'une pour l'initialisation se situe dans la 1ere classe et l'autre pour le remplissage dans la 2eme
j'ai nome ma fonction "public JTable remplirTable(JTable table)" pour que lorsque je l'appel dans le main je fais remplirTable(JTable1) pour qu'il fait les instruction dans la table de mon interface qui est jtable1 je peux aussi lui changer le nom mais l'essentiel qu'elle marcheraen fin de compte
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Salut,

Y'a vraiment un truc que je pige pas : quelle est ta classe d'interface graphique ??? pourquoi les deux classes étendent de JFrame ?

Pourquoi tu n'as pas modifié la fonction remplirTable selon ce que je t'ai dis précédemment en ne renvoyant rien, et en modifiant le model de la jtable que tu passes en paramètre ?
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Messages postés
9
Date d'inscription
jeudi 17 décembre 2009
Statut
Membre
Dernière intervention
27 mars 2010

en fait j'ai essayé avec ta méthode en ne renvoyant rien mais j'ai eux un petit souci lors de l'appel je l'ai laissé donc sous forme de commentaire pour mettre après .
Et puis j'ai fais deux classe parce que j'ai lu dans un forum qu'il faut deux classe pour ça , c vrai que je ne suis pas très convaincu mais j'ai seulement suivis.
Mon interface graphique c'est remplire_table
Comment dois-je procéder pour mettre tous dans une seule classe?
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Salut,

Je te dis pas qu'il faut faire qu'une seule classe : ca a du bon de découper un programme en plusieurs classe, avec chacune qui tiens un rôle bien précis.

Par contre, ce qui me choque dans ton code, c'est que tes 2 classes héritent de JFrame alors que tu n'as qu'une seule fenêtre graphique... Là j'en vois vraiment pas l'intérêt !

Enlève l'héritage de ta seconde classe vers JFrame : y'en a vraiment aucun intérêt.


j'ai eux un petit souci lors de l'appel je l'ai laissé donc sous forme de commentaire pour mettre après


C'est pas comme cà que tu arriveras à faire marcher ton code, vu que sans cà, tu risque d'avoir des soucis pour faire ce que tu cherches à faire... Il faut absolument remplacer le TableModel de ta JTable pour lui appliquer les nouvelles données. Si tu te contente à chaque fois de renvoyer une nouvelle instance de JTable, la JTable de ton interface restera toujours au même état...
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement