Rellenar jTable a partir de un ResultSet

Hola,

Quisiera tener una idea sobre cómo rellenar un JTable a partir de una consulta SELECT SQL y, por supuesto, pasando por un ResultSet() ...
he visto en la web que hay que crear un TableModel pero no he entendido el principio....
gracias por orientarme ...

gracias de antemano por vuestra ayuda

<config>Windows 7 Firefox 12.0</config>

2 respuestas

  1. Hola,
    Voy a intentar resumir el código en pasos:

    1- en tu método declaras objetos en los que devuelves los registros de la base (un objeto para cada campo) por ejemplo:
    Col1 = new String[100];
    Col2 = new String[100];
    ....

    2- declaras un objeto data de tipo Object así:
    data = new Object[200][N]; // N siendo el número de columnas de tu JTable 200 filas

    3- abres tu conexión con la base de datos ... (Class.forName.. y la parafernalia habitual)

    4- la consulta

    5- recuperas el resultado de la consulta en un ResultSet

    // stmt siendo el preparedStatement
    ResultSet rs=stmt.executeQuery();

    while (rs.next()) {

    Col1 [j] = rs.getString("Champ1");
    Col2[j] = rs.getString("Champ2");
    ... // para tantas columnas como quieras devolver

    data[j][i]= Col1 [j];
    data[j][i+1]= Col2[j];
    ....
    j++;
    }
    // los encabezados de las columnas :
    String title[] = {"La columna 1", "La columna 2",....};
    JTable table = new JTable(data, title);

    JPanel tableau = new JPanel (new BorderLayout ());
    // añade los encabezados al norte del contenedor
    tableau.add (table.getTableHeader (), BorderLayout.NORTH);
    tableau.add (table, BorderLayout.CENTER);
    JSplitPane split3 = new JSplitPane (JSplitPane.VERTICAL_SPLIT, true, tableau, new JTextArea (" Avec entête "));
    TableColumn column = null;
    for(int i=0;i<4 ; i++){
    column= table.getColumnModel().getColumn(i);
    column.setPreferredWidth(180);
    }
    P.add(tableau); // P étant le panel de la fenêtre
    // un JScrollPane en cas de besoin
    JScrollPane scrollpane = new JScrollPane(P,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    this.getContentPane().add(scrollpane);
    6- tu finis with un catch ....

    Il n’y a pas plus simple :-)
    0
    1. muchísimas gracias, lo aplicaré de inmediato y le haré saber el resultado...
      0
    2. Hola

      entonces, esto es lo que hice:
      1) creé una clase Jforme
      2) la clase contiene un botón "OK" para llamar al método en cuestión (okActionPerformed), es decir, cuando hago clic en OK me mostrará el resultado: como sigue ...

      PANEL p = new JPanel (new BorderLayout ());

      try {
      Class.forName("com.mysql.jdbc.Driver");
      connexion = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/csh","root","");
      statement = (Statement) connexion.createStatement();
      String SelectUser =" Select * from compte ";
      resultat = (ResultSet) statement.executeQuery(SelectUser);

      while (resultat.next()){
      int j=0;
      int i=0;
      Col1 [j] = resultat.getString("login");
      Col2[j] = resultat.getString("password");
      data[j][i]= Col1 [j];
      data[j][i+1]= Col2[j];

      } // fin while
      } // fin try
      catch (ClassNotFoundException ex) {
      Logger.getLogger(model.class.getName()).log(Level.SEVERE, null, ex);
      } catch (SQLException ex) {
      Logger.getLogger(model.class.getName()).log(Level.SEVERE, null, ex);
      }
      catch(Exception e){
      System.out.println(e);
      }

      JTable table = new JTable(data, title);

      JPanel tableau = new JPanel (new BorderLayout ());

      tableau.add (table.getTableHeader (), BorderLayout.NORTH);
      tableau.add (table, BorderLayout.CENTER);
      JSplitPane split3 = new JSplitPane (JSplitPane.VERTICAL_SPLIT, true, tableau, new JTextArea (" Avec entête "));
      TableColumn column = null;

      for (int k =0; k<2 ; k++){

      column= table.getColumnModel().getColumn(k);
      column.setPreferredWidth(180);
      }

      p.add(tableau); // P étant le panel de la fenêtre
      // un scrollPane en cas de besoin
      JScrollPane scrollpane = new JScrollPane(p,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
      this.getContentPane().add(scrollpane);
      // TODO add your handling code here:
      }

      Merci le problème est que rien ne s'affiche dans la table quand je clique sur le bouton "OK"...
      et je n'ai aucun message d'erreur sur NetBeans
      je n'ai que
      "
      run:
      BUILD SUCCESSFUL (total time: 4 seconds)
      "

      merci de votre aide
      0
    3. Buenas noches,
      Sí, es totalmente normal. ¡Tienes que crear el JTable dentro del try justo después del while! y es solo después que añades el catch.
      Entonces desplazas todo el código a partir de la creación del JTable hasta la incorporación del ScrollPane dentro del try. Después enes con el catch ...
      Y normalmente debería funcionar ;)

      Buen ánimo
      0
    4. @LaDiva432gracias LaDiva432 por vuestros esfuerzos :)
      entonces he corregido lo que me señalaste ,
      pero a pesar de ello no funciona .. sin embargo con System.out.println(data [0][0] +" "+ data [0][1] ); muestra el resultado de la consulta correctamente ...
      0
    5. @LaDiva432¡Por favor! :)
      No veo la declaración de la cadena tilte (atributo del JTable en tu código) ¡revísalo! puede que el error venga de ahí ;)
      0
  2. hola :) he seguido lo que escribiste pero me muestra el siguiente error !!
    java:219: error: cannot find symbol
    TableColumn column = null;
    ^
    ¿alguien puede ayudarme :) gracias
    0
    1. saam

      no estoy seguro de la respuesta, pero bueno... puede servir para algo.

      intenta verificar si :

      1) las clases están en el mismo paquete (si no, haz un import....).
      2) la declaración de las tablas y de las demás variables ...
      3) la instanciación de las variables...
      0
    2. Moderador
      Efectivamente, una importación debería ayudar:
      import javax.swing.table.TableColumn;
      0
    3. LaDiva432, he seguido tus consejos porque realmente necesitaba aprender cómo mostrar los resultados de una consulta en un JTABLE
      pero he encontrado un problema, es que en la visualización solo se muestra la última fila de mi tabla SQL, ¡las demás filas no se muestran!
      0