Rellenar jTable a partir de un ResultSet

Eagle_de_nord Mensajes publicados 46 Estado Miembro -  
oumeiima Mensajes publicados 3 Estado Miembro -
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. LaDiva432
     
    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. Eagle_de_nord Mensajes publicados 46 Estado Miembro
       
      muchísimas gracias, lo aplicaré de inmediato y le haré saber el resultado...
      0
    2. Eagle_de_nord Mensajes publicados 46 Estado Miembro
       
      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. LaDiva432
       
      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. Eagle_de_nord Mensajes publicados 46 Estado Miembro > LaDiva432
       
      gracias 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 > 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. guns65 Mensajes publicados 38 Estado Miembro
     
    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. Eagle_de_nord Mensajes publicados 46 Estado Miembro
       
      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. KX Mensajes publicados 19031 Estado Moderador 3 020
       
      Efectivamente, una importación debería ayudar:
      import javax.swing.table.TableColumn;
      0
    3. oumeiima Mensajes publicados 3 Estado Miembro
       
      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