[Java]Problème de recharge d'une JTable avec le résultat d'une requête

Problème de recharge d'une JTable avec le résultat d'une requête [Java] - Java - Programmation

Marsh Posté le 21-06-2007 à 13:21:38    

Bonjour,
 
j'ai écrit un programme qui devrait me permettre d'afficher dans une JTable le résultat d'une requête sql.
Avant d'écrire mon programme avec une requête sql, je l'ai testé avec des données fixées.
C'est le programme suivant qui fonctionne :

Code :
  1. import javax.swing.JFrame;
  2. import javax.swing.JScrollPane;
  3. import javax.swing.JTable;
  4. import javax.swing.table.AbstractTableModel;
  5. import java.util.List;
  6. import java.util.ArrayList;
  7. import java.util.Random;
  8. public class Divers extends AbstractTableModel{
  9. private static final long serialVersionUID = 1L;
  10. String[] colonnes = {"Nom", "Prenom", "Age"};
  11. //la liste du contenu du tableau  
  12. private List<Object[]> allLignes = new ArrayList<Object[]>();
  13. public Divers(){}
  14. //constructeur avec la liste
  15. public Divers(List<Object[]> allLignes){
  16.  //test si la liste est vide rajouter une ligne vide
  17.  if (allLignes == null || allLignes.size()<1){
  18.   allLignes.add(new Object[colonnes.length]);
  19.  }
  20.  this.allLignes = allLignes;
  21. }
  22. /* retourne le nombre d'element de la colonne */
  23. public int getColumnCount() {
  24.  return colonnes.length;
  25. }
  26. /* retourne le nombre de lignes */
  27. public int getRowCount() {
  28.  return allLignes.size();
  29. }
  30. /* retourne le nom de la colonne */
  31. public String getColumnName(int col) {
  32.  return colonnes[col];
  33. }
  34. /* retourne la valeur à la ligne row et colonne col */
  35. public Object getValueAt(int row, int col) {
  36.  return allLignes.get(row)[col];
  37. }
  38. public Class<?> getColumnClass(int c) {
  39.  return getValueAt(0, c).getClass();
  40. }
  41. /* definie les cellules éditables ou non */
  42. public boolean isCellEditable(int row, int col) {
  43.   return false;
  44. }
  45. /* permet de modifier l'element en placant value a la ligne row  
  46. colonne col */
  47. public void setValueAt(Object value, int row, int col) {
  48.  allLignes.get(row)[col] = value;
  49.  fireTableCellUpdated(row, col); // on signal un changement
  50. }
  51. //Rempli le tableau
  52. public void remplie(List<Object[]> lignes){
  53.  allLignes = lignes;
  54.  //On signale le changement des données aux listeners :
  55.  fireTableDataChanged();
  56. }
  57. //Vide la table
  58. public void vide(){
  59.  allLignes.removeAll(allLignes);
  60.  fireTableRowsDeleted(0,getRowCount());
  61. }
  62. public static void main(String [] args){
  63.  Divers maTable = new Divers();
  64.  JTable jTable = new JTable(maTable);
  65.  List<Object[]> donnees = new ArrayList<Object[]>();
  66.  Object [][] data = {
  67.    {"Cardin","Pierre",50},
  68.    {"Lopez", "Hector", 47},
  69.    {"Laurent", "Robert", 29},
  70.    {"Cardetti","Martin",30},
  71.    {"Angel", "Marcos", 47}
  72.  };
  73.  JFrame frame = new JFrame("Divers" );
  74.  JScrollPane scroll = new JScrollPane(jTable);
  75.  frame.setSize(300,200);
  76.  frame.add(scroll);
  77.  frame.setVisible(true);
  78.  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  79.  Random r = new Random();
  80.  while(true){
  81.   maTable.vide();
  82.   int n = r.nextInt(5);
  83.   System.out.println(n +" " );
  84.   for(int i=0; i<n; i++){
  85.    Object [] val = new Object[3];
  86.    for(int j=0; j<3; j++)
  87.     val [j]= data[i][j];
  88.    donnees.add(val);
  89.   }
  90.   ((Divers)jTable.getModel()).remplie(donnees);
  91.   for(Object [] o : donnees){
  92.    for(Object obj : o)
  93.     System.out.print(obj + " " );
  94.   System.out.println("" );
  95.   }
  96.   try {
  97.    Thread.sleep(2000);
  98.   }catch(InterruptedException ie){}
  99.  }
  100. }
  101. }


 
Comme il fonctionnait, je l'ai modifié pour qu'il focntionne avec le résultat d'une requête sql.
Le soucis, c'est que ça ne fonctionne pas. Lorsque de nouvelles données arrivent, elles ne sont pas prises en compte dans la JTable.
Le probleme provient de tout ce qui est dans le try{}catch mais je n'arrive pas à savoir pourquoi.
Voici le code avec la connexion à une base de données :

Code :
  1. import javax.swing.JFrame;
  2. import javax.swing.JScrollPane;
  3. import javax.swing.JTable;
  4. import javax.swing.table.AbstractTableModel;
  5. import sun.jdbc.odbc.JdbcOdbcDriver;
  6. import java.sql.Connection;
  7. import java.sql.Driver;
  8. import java.sql.DriverManager;
  9. import java.sql.ResultSet;
  10. import java.sql.ResultSetMetaData;
  11. import java.sql.Statement;
  12. import java.util.List;
  13. import java.util.ArrayList;
  14. public class Divers2 extends AbstractTableModel{
  15. private static final long serialVersionUID = 1L;
  16. String[] colonnes = {"Nom", "Prenom", "Age"};
  17. //la liste du contenu du tableau  
  18. private List<Object[]> allLignes = new ArrayList<Object[]>();
  19. public Divers2(){}
  20. //constructeur avec la liste
  21. public Divers2(List<Object[]> allLignes){
  22.  //test si la liste est vide rajouter une ligne vide
  23.  if (allLignes == null || allLignes.size()<1){
  24.   allLignes.add(new Object[colonnes.length]);
  25.  }
  26.  this.allLignes = allLignes;
  27. }
  28. /* retourne le nombre d'element de la colonne */
  29. public int getColumnCount() {
  30.  return colonnes.length;
  31. }
  32. /* retourne le nombre de lignes */
  33. public int getRowCount() {
  34.  return allLignes.size();
  35. }
  36. /* retourne le nom de la colonne */
  37. public String getColumnName(int col) {
  38.  return colonnes[col];
  39. }
  40. /* retourne la valeur à la ligne row et colonne col */
  41. public Object getValueAt(int row, int col) {
  42.  return allLignes.get(row)[col];
  43. }
  44. public Class<?> getColumnClass(int c) {
  45.  return getValueAt(0, c).getClass();
  46. }
  47. /* definie les cellules éditables ou non */
  48. public boolean isCellEditable(int row, int col) {
  49.   return false;
  50. }
  51. /* permet de modifier l'element en placant value a la ligne row  
  52. colonne col */
  53. public void setValueAt(Object value, int row, int col) {
  54.  allLignes.get(row)[col] = value;
  55.  fireTableCellUpdated(row, col); // on signal un changement
  56. }
  57. //Rempli le tableau
  58. public void remplie(List<Object[]> lignes){
  59.  allLignes = lignes;
  60.  //On signale le changement des données aux listeners :
  61.  fireTableDataChanged();
  62. }
  63. //Vide la table
  64. public void vide(){
  65.  allLignes.removeAll(allLignes);
  66.  fireTableRowsDeleted(0,getRowCount());
  67. }
  68. public static void main(String [] args){
  69.  Divers2 maTable = new Divers2();
  70.  JTable jTable = new JTable(maTable);
  71.  List<Object[]> donnees = new ArrayList<Object[]>();
  72.  //Parametre de connexion a la base de données
  73.  String url="jdbc:odbc:TABLE";
  74.     String login = "root";
  75.     String password = "root";
  76.     Connection connection = null;
  77.     JFrame frame = new JFrame("Divers" );
  78.  JScrollPane scroll = new JScrollPane(jTable);
  79.  frame.setSize(300,200);
  80.  frame.add(scroll);
  81.  frame.setVisible(true);
  82.  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  83.  try{
  84.   Driver monDriver = new JdbcOdbcDriver();
  85.   DriverManager.registerDriver(monDriver);
  86.   connection=DriverManager.getConnection(url,login,password);
  87.   Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
  88.   String sql = "SELECT * FROM TABLE.PERSONNEL";
  89.   while(true){
  90.    maTable.vide();
  91.    ResultSet rs = stmt.executeQuery(sql);
  92.    ResultSetMetaData rsmd = rs.getMetaData();
  93.    int ncols = rsmd.getColumnCount();
  94.    //Remise du curseur à sa position initiale
  95.    rs.beforeFirst();
  96.    boolean suivant = rs.next();
  97.    while(suivant){
  98.     Object val [] = new Object[ncols];
  99.     for(int j=1; j<=ncols; j++)
  100.      val[j-1] = rs.getString(j);
  101.     donnees.add(val);
  102.     suivant = rs.next();
  103.    }
  104.    ((Divers2)jTable.getModel()).remplie(donnees);
  105.    //Remise du curseur à sa position initiale
  106.    rs.beforeFirst();
  107.    try {
  108.     Thread.sleep(2000);
  109.    }catch(InterruptedException ie){}
  110.   }
  111.  }catch(Exception e){}
  112. }
  113. }

Reply

Marsh Posté le 21-06-2007 à 13:21:38   

Reply

Marsh Posté le 21-06-2007 à 16:40:13    

ese-aSH a écrit :

ta requete sql elle renvoie qqchose t'es sur ? ton objet val il contient quoi a la sortie de ta boucle for ?
 
(essaye de pas mettre 50 tartines de code si t'es sur que le pb vient de 10 ptites lignes ;) )


Oui, j'obtiens un résultat mais le soucis c'est que la table n'ajoute pas les nouvelles lignes lorsqu'il le faut.
Elle reste figée.
Toutes les 2 secondes, je relance la requete et en principe si la requete donne de nouveaux résultats, il faut que la table les ajoutent mais là, ça ne le fait pas


Message édité par lasvegastheking le 21-06-2007 à 16:41:37
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed