Java IES Ilíberis JTable y bases de datos Se puede utilizar a la clase JTable para mostrar datos provenientes de una consulta a una base de datos. Para ello se necesita implementar una clase modelo de tabla, TableModel. La interfaz TableModel define los siguientes métodos: public int getRowCount() Debe devolver el número de filas. public int getColumnCount() Debe devolver el número de columnas. public String getColumnName(int columnIndex) Debe devolver el nombre de la columna con el índice especificado. public Class getColumnClass(int columnIndex) Debe devolver la clase de la columna con el índice especificado. public boolean isCellEditable(int rowIndex,int columnIndex) Debe indicar si las celda con los índices especificados es editable. public Object getValueAt(int rowIndex,int columnIndex) Debe devolver el valor de la posición especificada. public void setValueAt(Object aValue,int rowIndex,int columnIndex) Debe establecer el valor de la posición especificada. public void addTableModelListener(TableModelListener l) Debe añadir una clase de escucha que se dispare cada vez que se modifica un valor de la tabla. public void removeTableModelListener(TableModelListener l) Debe suprimir una clase de escucha que se dispare cada vez que se modifica un valor de la tabla. Para implementar esta clase se puede optar por implementarla de forma genérica, es decir, que sirva para cualquier consulta. Para ello será necesario acudir a los metadatos de los conjuntos de registros. Los metadatos no son más que información acerca de los campos devueltos por una consulta. Pasemos a la implementación de la clase ModeloTabla: import javax.swing.table.*; import javax.swing.event.*; import java.sql.*; public class ModeloTabla implements TableModel { ResultSet r; ResultSetMetaData md; int columnas,filas; //constructor //se le pasa el ResultSet para obtener el modelo de tabla Administración de sistemas informáticos Página 1 Java IES Ilíberis public ModeloTabla(ResultSet r) throws SQLException { this.r = r; this.md = r.getMetaData(); columnas = md.getColumnCount(); r.last(); filas = r.getRow(); } //devuelve el número de filas public int getRowCount() { return filas; } //devuelve el número de columnas public int getColumnCount() { return columnas; } //devuelve el nombre de la columna //la información de la columna 0 en los metadatos está en la 1 //y así sucesivamente public String getColumnName(int columnIndex) { try { return md.getColumnLabel(columnIndex+1); } catch (SQLException e) { return e.toString(); } } //el tipo de todas las columnas es String public Class getColumnClass(int columnIndex) { return String.class; } //no es editable public boolean isCellEditable(int rowIndex,int columnIndex) { return false; } //obtener celda (i,j)->(i+1,j+1) public Object getValueAt(int rowIndex,int columnIndex) { try { r.absolute(rowIndex+1); Object o = r.getObject(columnIndex+1); if (o == null) return "null"; else return o.toString(); } catch (SQLException e) Administración de sistemas informáticos Página 2 Java IES Ilíberis { } } return e.toString(); //no se implemanta ningún método más ya que no es modificable public void setValueAt(Object aValue,int rowIndex,int columnIndex) { } public void addTableModelListener(TableModelListener l) { } } public void removeTableModelListener(TableModelListener l) { } Una vez implementada esta clase la carga de datos de una consulta en una JTable se realiza con un sólo método: public class UsaModeloTabla extends JFrame { ModeloTabla modelo; JTable tabla; ResultSet r; Administración de sistemas informáticos Página 3 Java IES Ilíberis public UsaModeloTabla () { super("Consultas"); //cargar driver, establecer conexión, crear ResultSet r ... try { ... ResultSet r = s.executeQuery("select * from datos;"); modelo=new ModeloTabla(r); } catch (Exception e){...} tabla = new JTable(); try { tabla.setModel(modelo); } } ... } catch (Exception ex){...} Container c = jf.getContentPane(); c.add(new JScrollPane(tabla)); setVisible(true); Administración de sistemas informáticos Página 4