Mise à jour automatique de jtable à partir de BD

Signaler
Messages postés
5
Date d'inscription
mardi 24 juin 2008
Statut
Membre
Dernière intervention
26 septembre 2008
-
unaware
Messages postés
5
Date d'inscription
mardi 24 juin 2008
Statut
Membre
Dernière intervention
26 septembre 2008
-
Bonjour à tous,
Je suis nouveau dans ce forum. Je fais appel à vos compétence car j'ai un petit souci.

Je suis en train de développez une petite appli avec swing et mysql et j'a un problème que j'arrive pas à régler.

J'ai une classe "Gestion_Stock" qui contient des jtable, c'est le point d'entrée de l'application.
<!-- BEGIN TEMPLATE: bbcode_code -->

Code :
public class Gestion_Stock extends JFrame {
....
....
public JTable getJTableClient() {

if (jTableClient == null){

jTableClient = new JTable(new BdSelection());
jTableClient.setAutoCreateRowSorter(true);
}
return jTableClient;
}
....
....
}//fin classe Gestion_stock

<!-- END TEMPLATE: bbcode_code -->Au démarrage, l'appli va chercher les
donnée dans la classe "BdSelection" et les afficher dans la table.
Voici le code de cette classe
<!-- BEGIN TEMPLATE: bbcode_code -->

Code :
 
publicclass BdSelection extends AbstractTableModel
{
privatestaticfinallong serialVersionUID = 1L;
privatestatic String url;
private Vector data = new Vector();
private Vector columnNames = new Vector <String> ();

public BdSelection ()
{
 
try
{
try
{
Class.forName("com.mysql.jdbc.Driver");
}
catch(ClassNotFoundException ex)
{
//....
}
url ="jdbc:mysql://localhost:3306/gestion_stock";
System.out.println("connection à la BdSelection");
 
Connection connection = DriverManager.getConnection(url, "root", "");
Statement stmt = connection.createStatement();

String sql = "select * FROM client";
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
 
for(int i = 1; i <= columns; i++){
columnNames.addElement(md.getColumnName(i));
}
 
while(rs.next()){
Vector row = new Vector(columns);
 
for(int i = 1; i <= columns; i++){
row.addElement(rs.getObject(i));
}
 
data.add(row);
}//fin while
rs.close();
stmt.close();
}
catch(SQLException e)
{
System.out.println(e.getMessage());
System.out.println(e.getStackTrace());
}
}//fin constructeur

@Override
publicint getColumnCount(){
return columnNames.size();
}
 
@Override
publicint getRowCount(){
return data.size();
}
 
@Override
public Object getValueAt(int row, int column){
Vector rowData = (Vector) data.elementAt(row);
return rowData.elementAt(column);
}
 
@Override
publicboolean isCellEditable(int arg0, int arg1){
returntrue;
}
@SuppressWarnings("unchecked")
@Override
publicvoid setValueAt(Object value, int row, int col){

Vector dataRow = (Vector)data.elementAt(row);
dataRow.setElementAt(value, col);
fireTableCellUpdated(row, col);
}
}
 

<!-- END TEMPLATE: bbcode_code -->Jusqu'à là, pas de souci. Mais mon
mon appli contient aussi une classe qui permet d'insérer des données
"AjouterNouveauClient". L'insertion se fait en cliquant sur un bouton.
<!-- BEGIN TEMPLATE: bbcode_code -->

Code :
 
publicclass AjouterNouveauClient extends JDialog {
....
public JButton getJButton(){
if(jButton == null){
jButton = new JButton();
jButton.setText("Valider");
jButton.addActionListener(new java.awt.event.ActionListener(){
publicvoid actionPerformed(java.awt.event.ActionEvent e){

NouveauClient nc = new NouveauClient();//instanciation d'une classe contenant les champs et les getters/setter
nc.setIdClient(jTextFieldIdClient.getText().trim());
nc.setNom(jTextFieldNom.getText().trim());
nc.setPrenom(jTextFieldPrenom.getText().trim());
nc.setAdresse(jTextFieldAdresse.getText().trim());
nc.setCodePostal(jTextFieldCp.getText().trim());
nc.setCivilite((String)jComboBoxCivilite.getSelectedItem());
nc.setVille(jTextFieldVille.getText().trim());
nc.setTel(jTextFieldTel.getText().trim());
nc.setFax(jTextFieldFax.getText().trim());
nc.setMail(jTextFieldMail.getText().trim());

new BaseDonnees(nc);
}
});
}
return jButton;
}
....
}
 

<!-- END TEMPLATE: bbcode_code -->L'insertion de ces données se fait via une autre classe "BaseDonnees"
<!-- BEGIN TEMPLATE: bbcode_code -->

Code :
 
publicclass BaseDonnees {
.....
public BaseDonnees (NouveauClient nClient){
String sql = "INSERT INTO client (Id, Civilité, Nom, Prénom, Adresse, Code_postal, Ville, Téléphone, Fax, Mail) " +
"VALUES ("+
"'"+nClient.getIdClient()+"',"
+"'"+nClient.getCivilite()+"',"
+"'"+nClient.getNom()+"',"
+"'"+nClient.getPrenom() +"',"
+"'"+nClient.getAdresse()+ "',"
+"'"+nClient.getCodePostal() + "',"
+"'"+nClient.getVille()+ "',"
+"'"+nClient.getTel()+"',"
+"'"+nClient.getFax()+"',"
+"'"+nClient.getMail()+"'"+")";

System.out.println("Insertion dans la base ++++++++++++++");
.......
}
}
 

<!-- END TEMPLATE: bbcode_code -->L'insertion dans la base se fait
aussi. Mais ce que je voudrais, c'est que dès que j'inère ces donnéés
dans la base, elles soient également affichées dynamiquement dans la
table. J'ai essayé plein de choses préconisées dans des forums et tutos
mais en vain. Jusqu'à maintenant, pour mettre ces nouvelles données
dans la table, je suis obligé de redémarrer l'application.


Comment faire de sorte que les données soient intégrées dans la table dynamiquement.


Merci d'avance de votre aide.

9 réponses

Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
34
Salut:

J'ai une petite question à te poser. Veux tu que le composant JTable soit mis à jour lorsque tu inséres des nouvelles données à partir de ton application ou bien lorsque tu opéres sur la base de données depuis une console d'administration par exemple?
Messages postés
5
Date d'inscription
mardi 24 juin 2008
Statut
Membre
Dernière intervention
26 septembre 2008

bonjour et merci d'avoir réagi à mon post. Je voudrais que jtable soit mise à jour dès que je clique sur le bouton dans "AjouterNouveauClient" est cliqué. donc la mise à jour doit se faire à partir de l'application.
Messages postés
750
Date d'inscription
mardi 9 mars 2004
Statut
Membre
Dernière intervention
23 décembre 2008
18
Bonjour,
En ce cas, il faut mettre en place un bon petit Observer / Observable. Tu pourras trouver une petite explication ici: http://www.toutenligne.com/index.php?contenu=mvc&menu=pattern

Voili voilà

le monde a des idées : la preuve, c'est qu'il y en a de mauvaises
ne comprends pas tout, mais je parle de tout : c'est ce qui compte
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
34
Salut:

Excellente idée.
Messages postés
5
Date d'inscription
mardi 24 juin 2008
Statut
Membre
Dernière intervention
26 septembre 2008

Merci de vos messages. Indiana_jules, je suis allé sur le lien que tu m'as indiqué. J'ai compris le principe. Cette solution a l'air adapté à mon problème mais je ne sais pas où et comment les implémenter. Pouvez-vous me donner des pistes?
Merci d'avance!
Messages postés
750
Date d'inscription
mardi 9 mars 2004
Statut
Membre
Dernière intervention
23 décembre 2008
18
Salut,
dans l'api standard Java, les deux classes Observer / Observable existent déjà (pas besoin de les recréer, sauf dans certains cas d'utilisations, comme en RMI). L'interface Observer devra s'implémenter du côté de ta JTable. En effet, c'est elle qui recevra la notification comme quoi il y a eu une insertion (et vu qu'elle peut recevoir des arguments, elle pourrait même recevoir les valeurs de ta nouvelle ligne, sans aller chercher dans la base de données !!!).

Une fois implémenter, il faut que l'observer "s'inscrit" à une observable. Il faut le considérer comme un noeud central. Il référence tous les observer, et offre des mécanismes de notifications. Quand ces derniers seront appelés (
[file:///C:/Java_API_Javadocs/j2sdk-1_4_2-doc/docs/api/java/util/Observable.html#notifyObservers%28%29 notifyObservers]()


,
[file:///C:/Java_API_Javadocs/j2sdk-1_4_2-doc/docs/api/java/util/Observable.html#notifyObservers%28java.lang.Object%29 notifyObservers]([file:///C:/Java_API_Javadocs/j2sdk-1_4_2-doc/docs/api/java/lang/Object.html Object] arg)
), un message sera envoyé à tous les observer (attention, bien penser à
[file:///C:/Java_API_Javadocs/j2sdk-1_4_2-doc/docs/api/java/util/Observable.html#setChanged%28%29 setChanged]()


appeler AVANT un notifyObserver).

Cet observable, tu peux la mettre "où tu veux" (réfléchis au meilleur endroit dans ton programme). Il suffira alors que ton bouton aille le chercher et l'appelle.

Voilou

le monde a des idées : la preuve, c'est qu'il y en a de mauvaises
ne comprends pas tout, mais je parle de tout : c'est ce qui compte
Messages postés
5
Date d'inscription
mardi 24 juin 2008
Statut
Membre
Dernière intervention
26 septembre 2008

je te remercie pour ta réponse rapide. J'ai compris pour l'interface Observer. Je l'implémente dans la classe où j'ai ma table et je récupère les données via la méthode
[file:///D:/docs/api/java/util/Observer.html#update%28java.util.Observable,%20java.lang.Object%29 update]([file:///D:/docs/api/java/util/Observable.html Observable] o,
       [file:///D:/docs/api/java/lang/Object.html Object] arg)


. Quant à la classe Observable, je doit la créer à part ou faire en sorte qu'une des mes classe base données hérite de cette classe? Est-ce que cela veut aussi dire que je peux me passer le modèle de table (AbstractTableModel) que j'utilisais?
désolé, mes qustions paraîtront peut-être stupides mais jusqu'à maintenant je ne connaissais pas ces 2 classe. Je débute en java.

                        
                
Messages postés
750
Date d'inscription
mardi 9 mars 2004
Statut
Membre
Dernière intervention
23 décembre 2008
18
Re,
soit tu crées une instance d'Observable dans tes classes de base de données, soit tu hérites (selon ta conception, il faudra que tu prennes l'un ou l'autre).
En revanche, cela ne veut pas dire que tu puisses de passer de ton model. Au contraire, tu devras certainement l'utiliser dans la méthode update.

Voilà

le monde a des idées : la preuve, c'est qu'il y en a de mauvaises
ne comprends pas tout, mais je parle de tout : c'est ce qui compte
Messages postés
5
Date d'inscription
mardi 24 juin 2008
Statut
Membre
Dernière intervention
26 septembre 2008

ok, je vais essayer ça et je t'en dirais des nouvelles. Bonne journée