Haber voy a poner las dos clases que utilizo. Una es la que crea el modelo y la otra crea el jtable y coge el modelo. Es muy genérico. Coge datos de una bd y crea tantas filas y columnas como tenga el resultado de la consulta a la base de datos.
Tengo puesto que las celdas sean editables, pero no me deja editarlas. Por favor, haber si alguien me puede ayudar!
Código:
import java.awt.BorderLayout;
import javax.swing.DefaultCellEditor;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
public class MostrarResultadosConsulta extends JPanel {
private ModeloTablaResultado modeloTabla;
private JTable tablaResultados = null;
public MostrarResultadosConsulta(int consulta) {
// crear objeto ModeloTablaResultados y mostrar tabla de la base de datos
try {
modeloTabla = new ModeloTablaResultado(consulta);
tablaResultados = new JTable(modeloTabla);
tablaResultados.setCellSelectionEnabled(true);
tablaResultados.setCellEditor(new DefaultCellEditor(new JTextField()));
this.setLayout(new BorderLayout());//los he puesto yo
this.add( new JScrollPane(tablaResultados) , BorderLayout.CENTER );
setSize( 500, 250 );
setVisible( true );
} catch ( Exception e){
System.out.println(e.getMessage());
modeloTabla.desconectarDeLaBaseDeDatos();
}
}
}
Y la clase del modelo:
Código:
import java.awt.event.ActionEvent;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.ListSelectionModel;
import javax.swing.table.AbstractTableModel;
import SAD.accesodatos.gestorBD;
public class ModeloTablaResultado extends AbstractTableModel {
private Statement instruccion;
private ResultSet conjuntoResultados;
private ResultSetMetaData metaDatos;
private int numeroDeFilas;
private boolean conectadoALaBaseDeDatos = false;
private gestorBD gbd;
public ModeloTablaResultado (int consulta) throws SQLException, ClassNotFoundException {
gbd=new gestorBD();
conectadoALaBaseDeDatos=gbd.conectar("localhost", "sad","root", "");
if(consulta==1){
conjuntoResultados=gbd.buscarPersonas();
}else if(consulta==2){
conjuntoResultados=gbd.mostrarTasas();
}
establecerConsulta();
}
// obtener la clase que representa al tipo de columna
public Class getColumnClass( int columna ) throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// determinar la clase de Java de columna
try {
String nombreClase = metaDatos.getColumnClassName( columna + 1 );
// devolver objeto Class que representa a nombreClase
return Class.forName( nombreClase );
}
// atrapar excepciones SQLException y ClassNotFoundException
catch ( Exception excepcion ) {
excepcion.printStackTrace();
}
// si ocurren problemas arriba, suponer que es tipo Object
return Object.class;
}
// obtener el número de columnas en el objeto ResultSet
public int getColumnCount() throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// determinar el número de columnas
try {
return metaDatos.getColumnCount();
}
// atrapar excepciones SQLException e imprimir mensaje de error
catch ( SQLException excepcionSQL ) {
excepcionSQL.printStackTrace();
}
// si ocurren problemas arriba, devolver 0 para el número de columnas
return 0;
}
// obtener el nombre de una columna específica en el objeto ResultSet
public String getColumnName( int columna ) throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// determinar el nombre de la columna
try {
return metaDatos.getColumnName( columna + 1 );
}
// atrapar excepciones SQLException e imprimir mensaje de error
catch ( SQLException excepcionSQL ) {
excepcionSQL.printStackTrace();
}
// si hay problemas, devolver cadena vacía para el nombre de la columna
return "";
}
// devolver el número de filas en el objeto ResultSet
public int getRowCount() throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
return numeroDeFilas;
}
// obtener el valor en una fila y columna específicas
public Object getValueAt( int fila, int columna ) throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// obtener un valor en una fila y columna específicas del objeto ResultSet
try {
conjuntoResultados.absolute( fila + 1 );
return conjuntoResultados.getObject( columna + 1 );
}
// atrapar excepciones SQLExceptions e imprimir mensaje de error
catch ( SQLException excepcionSQL ) {
excepcionSQL.printStackTrace();
}
// si hay problemas, devolver objeto cadena vacía
return "";
}
// establecer nueva cadena de consulta para la base de datos
public void establecerConsulta()throws SQLException, IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
metaDatos = conjuntoResultados.getMetaData();
conjuntoResultados.last(); // mover a la última fila
numeroDeFilas = conjuntoResultados.getRow(); // obtener número de fila
fireTableStructureChanged();
}
// cerrar objetos Statement y Connection
public void desconectarDeLaBaseDeDatos() {
// cerrar objetos Statement y Connection
try {
instruccion.close();
// conexion.close();
gbd.desconectar();
}
// atrapar excepciones SQLException e imprimir mensaje de error
catch ( SQLException excepcionSQL ) {
excepcionSQL.printStackTrace();
}
// actualizar estado de conexión a la base de datos
finally {
conectadoALaBaseDeDatos = false;
}
}
public void setValueAt(int fila, int columna)throws IllegalStateException {
// asegurar que la conexión a la base de datos esté disponible
if ( !conectadoALaBaseDeDatos )
throw new IllegalStateException( "No hay conexion a la base de datos" );
// obtener un valor en una fila y columna específicas del objeto ResultSet
try {
conjuntoResultados.updateRow();
}
// atrapar excepciones SQLExceptions e imprimir mensaje de error
catch ( SQLException excepcionSQL ) {
excepcionSQL.printStackTrace();
}
// si hay problemas, devolver objeto cadena vacía
}
}
Muchas gracias!