> Tous les forums > Forum Autres langages
 Comment remplir un Jtable depuis la bd en Java
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
pytheas
  Posté le 24/02/2011 @ 20:41 
Aller en bas de la page 
Petit astucien

Bonsoir à tous,j'ai besoin d'aide pour remplir un JTable à partir des données d'une colone de ma bd,seulement je ne sais pas trop comment m'y prendre.J'ai parcouru presque tout les tuto que j'avais à ma disposition mais aucun d'eux n'en fait réellement cas.je suis partant pour des liens sur les tuto qui en parlent,pour une classe qui traite le cas,ou toute autre moyen me permettant d'y arriver.Merci

Publicité
Cedders
 Posté le 13/03/2011 à 14:23 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour pytheas,

Pour faire simple sans te donner la solution bêtement, chaque élément Swing comme JTable, JTree, ... utilise des modèles.

Ces modèles, doivent être défini puis appliquer à ton élément.

Intéresse toi à la classe DefaultTableModel pour créer un modèle puis insérer une colonne et des lignes.

Pour finir, tu appliques ce modèle à ton JTable.

Au début c'est assez chiant mais tu te rendra vite compte que ce procéder te permet davoir un seul est unique tableau (Jtable) pour autant de modèle.

l'API : http://download.oracle.com/javase/1.5.0/docs/api/javax/swing/table/DefaultTableModel.html

Si tu rencontres des problèmes, je te montrerais un exemple.



Modifié par Cedders le 13/03/2011 14:31
pytheas
 Posté le 14/03/2011 à 15:03 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour cedders,se serait vraiment sympa si tu pouvais me donner ton exemple afin que je m'en inspire.j'ai finalement eu un cours qui fait cas des Jtables et je m' exerce en rencontrant de petits ennuis bien sur.D'ailleur je reviens avec un autre souci de programmation toujours sur les JTAbles,j'ai un exercice que je tente de traiter afin de comprendre un peu le fonctionnement des JTables,surtout son avantage quand on utilise un model.ceci pour dire que je n'attends pas les bras croisés un code pret à porter.mon exercice consiste à créer un Jtable avec quelques colonnes,dont une est un JComboBox,puis à l'aide de boutons arriver à ajouter puis à retirer des colonnes.j'y arrive,mais comme je l'ai dis plus haut,je rencontre de petits soucis qui sont entre autres:primo,le rendu du Jcombo n'est pas ce que j'attends,ce combo concerne la colonne "Sexe" avec comme élement "Masculin"et "Feminin",je l'affiche avec Masculin par defaut,mais à l'affichage il se comporte comme un JTextfiled.secondo, mes titres de colonnes ne s'affichent pas du tout, bien que j'ai utilisé (redefini) la methode getColumName(),tertio,ma methode de retrait de ligne ne marche pas.Mon exercice doit permettre de cocher un CheckBox avant de pouvoir supprimer une ligne,je ne sait avec quelle methodes pouvoir recuperer l'Etat(True) ou (False )du CheckBox afin d'effectuer le traitement approprié.Voilà où j'en suis en ce moment,en espérant t'avoir convaincu de ce que je cherche des solutions à mon probleme,voici le code qui me donne des maux de tetes:


package exple_jtable;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

/**
*
* @author Administrateur
*/
public class Jtable extends JFrame {
private JTable tableau ;
private JButton ajouter=new JButton("Ajouter une ligne");
private JButton supprimer=new JButton("Supprimer une ligne");
private String[] combodata={"Masculin","Feminin"};

public Jtable()
{
this.setLocationRelativeTo(null);
this.setSize(600, 250);
this.setTitle("Formulaire de renseignement des enfants");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
Object[][] data ={{new Boolean(false),"","","","",combodata[0]},{new Boolean(false),"","","","",combodata[0]},{new Boolean(false),"","","","",combodata[0]}};
String title[]= {"OK ?","Nom","Prenom","Date de Naissance","Lieu de Naissance"," Sexe"};
JComboBox combo=new JComboBox(combodata);
LeModel lmd = new LeModel(data,title);
this.tableau=new JTable(lmd);
this.tableau.setRowHeight(30);
// this.tableau.getColumn("Sexe").setCellEditor(new DefaultCellEditor(combo));
DefaultTableCellRenderer drc=new DefaultTableCellRenderer();
// this.tableau.getColumn("Sexe").setCellRenderer(drc);
this.getContentPane().add(new JScrollPane(tableau),BorderLayout.CENTER);
JPanel pan = new JPanel();
ajouter.addActionListener(new MoreListener());
supprimer.addActionListener(new SupLigne());
pan.add(ajouter);
pan.add(supprimer);
this.getContentPane().add(pan,BorderLayout.SOUTH);

}
class LeModel extends AbstractTableModel{
private Object[][]data;
private String[] title;

public LeModel(Object[][] data,String[] title)
{
this.data=data;
this.title=title;
}

public String getColumName(int col)
{
return this.title[col];
}
public int getColumnCount() {
return this.title.length;
}

/**
* Retourne le nombre de lignes
*/
public int getRowCount() {
return this.data.length;
}

/**
* Retourne la valeur à l'emplacement spécifié
*/
public Object getValueAt(int row, int col) {
return this.data[row][col];
}

/**
* Défini la valeur à l'emplacement spécifié
*/
@Override
public void setValueAt(Object value, int row, int col) {
//On interdit la modification sur certaine colonne !
if(!this.getColumnName(col).equals("Sexe") )//&& !this.getColumnName(col).equals("Suppression"))
this.data[row][col] = value;

}

/**
* Retourne la classe de la donnée de la colo
* @param col
*/
public Class getColumnClass(int col){
//On retourne le type de la cellule à la colonne demandée
//On se moque de la ligne puisque les données sur chaque ligne sont les mêmes
//On choisit donc la première ligne
return this.data[0][col].getClass();
}
public void removeRow(int position){

int indice = 0, indice2 = 0, nbRow = this.getRowCount()-1, nbCol = this.getColumnCount();
Object temp[][] = new Object[nbRow][nbCol];

for(Object[] value : this.data){
if(indice != position){
temp[indice2++] = value;
}
//System.out.println("Indice = " + indice);
indice++;
}
this.data = temp;
temp = null;
//Cette méthode permet d'avertir le tableau que les données ont été modifiées
//Ce qui permet une mise à jours complète du tableau
this.fireTableDataChanged();
}

public void addRow(Object[] data){
int indice = 0, nbRow = this.getRowCount(), nbCol = this.getColumnCount();

Object temp[][] = this.data;
this.data = new Object[nbRow+1][nbCol];

for(Object[] value : temp)
this.data[indice++] = value;


this.data[indice] = data;
temp = null;
//Cette méthode permet d'avertir le tableau que les données ont été modifiées
//Ce qui permet une mise à jours complète du tableau
this.fireTableDataChanged();
}

public boolean isCellEditable(int row, int col){
return true;
}
}
class MoreListener implements ActionListener{
public void actionPerformed(ActionEvent event) {
Object[] donnee = new Object[]{new Boolean(false),"", "","","",combodata[0]};
((LeModel)tableau.getModel()).addRow(donnee);
}
}

class SupLigne implements ActionListener{

private int row,column;
private JTable table;
private JButton button;

public void setColumn(int col){this.column = col;}
public void setRow(int row){this.row = row;}
public void setTable(JTable table){this.table = table;}

public void actionPerformed(ActionEvent event) {
if(table.getRowCount() > 0){
((LeModel)table.getModel()).removeRow(this.row);
((AbstractTableModel)table.getModel()).fireTableCellUpdated(this.row, this.column - 1);
}

}
}

public static void main(String[] args){
Jtable fen = new Jtable();
fen.setVisible(true);
}

public class TableComponent extends DefaultTableCellRenderer {

@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
//Si la valeur de la cellule est un JCombo, on transtype notre valeur
if (value instanceof JComboBox){
// this.tableau.setDefaultRenderer(JComponent.class, new TableComponent());
return (JComboBox) value;
}
else
return this;

}


}

public class ComboRenderer extends JComboBox implements TableCellRenderer {

public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean isFocus, int row, int col) {

this.addItem("Masculin");
this.addItem("Feminin");
return this;
}

}
}

Cedders
 Posté le 14/03/2011 à 19:12 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour pytheas,

Je suis également en train d'étudier Swing donc pour l'histoire des combobox j'y jeterais un oeil mercredi quand j'aurais un peu plus de temps.

Sinon je te met un bout de code pour remplir ton JTable de données avec les entête de colonne selon 2 méthodes :

public class Test extends javax.swing.JFrame {

/** Creates new form Test */
public Test() {
initComponents();

// Entête de colonne
String[] entetes = {"Colonne 1", "Colonne 2"};

// Tableau de données
Object[][] data = {{"L1.1", "L1.2"}, {"L2.1", "L2.2"}};

// Créer le modèle
DefaultTableModel modele = new DefaultTableModel(data, entetes);

// Appliquer le modèle au JTable
jTable1.setModel(modele);

// Rajouter une colonne et une ligne (2eme méthode)
modele.addColumn("Colonne 3");
modele.addRow(new Object[] {"L3.1", "L3.2", "L3.3"});
}

Imagine que tu veuilles afficher une liste de clients ou de fournisseurs. Tu pourras créer un modèle "clients" puis un modèle "fournisseurs" et sur un simple clique appliquer ces modèles au même JTable. En d'autres termes, le modèle représente les données affichées dans ton JTable ce qui te permet d'avoir x modèles pour un seul JTable. Ce qui est bien plus classe que de créer un JTable par type d'informations à afficher.

pytheas
 Posté le 14/03/2011 à 19:41 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

salut cedders,si j'utilise un model pour construire mon tableau,seulement je butes sur de petits problèmes certainement d'incomprehension,quand tu auras le temps de le lire tu le constateras.et concernant ton exemple de remplissage du tableau a partir de la bd,je suis toujours partant.

Cedders
 Posté le 14/03/2011 à 22:04 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Hello,

ça marche !

Mon exemple est en dessus. La deuxieme méthode. Tu as juste à interroger ta BD puis tu boucles sur ton ResultSet (rs) où à chaque itération tu feras un :

monModele.addRow(new Object[] {rs.getString("champ1"),...});

pytheas
 Posté le 16/03/2011 à 09:46 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

merci bien cedders pour ce coup de pousse,je vais tacher de l'implémenter puis je te tiens au courant.a bientot.

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Sujets relatifs
Comment rendre les cellules de ma JTable dans mon
comment imprime-t-on à travers une appli java
comment copier des lien java
comment utiliser java?
probleme avec les JTable en java
Pb avec JTable "JAVA"
Fenêtre de confirmation avant de quitter "Java"
Plusieurs versions de Java
Java, un bouton colorié à la fois, et tous les autres sont neutres
Comment mettre un temps dans un Script
Plus de sujets relatifs à Comment remplir un Jtable depuis la bd en Java
 > Tous les forums > Forum Autres langages