Inicio > Tutoriales Java > Cargar un ResultSet en un JTable

Cargar un ResultSet en un JTable

Hace unos días se me presentó la necesidad de mostrar los resultados de una consulta en un JTable, en todas partes la solución propuesta consiste en implementar la interfaz TableModel y cargar el ResultSet en una Array de dos dimensiones. El problema con este método es determinar el número de filas del ResultSet para lo cual encontré este interesante método:

try
{
	rs.last(); //Muevo el cursor al último registro del ResultSet
	int noFilas = rs.getRow(); //Obtengo el número de la fila actual
}
catch(SQLException ex)
{
	System.out.println(ex.toString());
}

Y eso fue todo lo que necesité. Sin embargo al intentar hacer mi programa más portable, decidí no usar MySQL sino una base de datos embebida, escogí SQLite, inmediatamente el código dejó de funcionar y obtenía la siguiente excepción:

java.sql.SQLException: ResultSet is TYPE_FORWARD_ONLY

Lo que es claro, no todas los controladores de bases de datos soportan las instrucciones last() y beforeFirst() y tenemos que conformarnos con next(). La solución entonces no era universal y tenía que crear una, mi propuesta es la siguiente clase que utiliza ArrayList.

import java.sql.*;
import java.sql.*;
import java.util.ArrayList;
import javax.swing.event.*;

public class ResultSetTable implements javax.swing.table.TableModel
{

    private ArrayList<ArrayList<Object>> Datos; //Datos
    private String[] etiquetas; //Nombres de columna
    protected EventListenerList listenerList = new EventListenerList();

    public ResultSetTable(java.sql.ResultSet rs)
    {
        if (rs != null)
        {
            Datos = new ArrayList();
            try
            {
                ResultSetMetaData metaDatos = rs.getMetaData();
                int noColumnas = metaDatos.getColumnCount();
                etiquetas = new String[noColumnas];
                for (int i = 0; i < noColumnas; i++)
                {
                    etiquetas[i] = metaDatos.getColumnLabel(i + 1);
                }
                ArrayList<Object> temp;
                while (rs.next())
                {
                    temp = new ArrayList();
                    for (String etiqueta : etiquetas)
                    {
                        temp.add(rs.getObject(etiqueta));
                    }
                    Datos.add(temp);
                }
            }
            catch (SQLException ex)
            {
                Datos = null;
                etiquetas = null;
                System.out.println("Error: " + ex.getErrorCode());
                System.out.println("Mensaje: " + ex.getMessage());
            }
        }
    }

    public int getRowCount()
    {
        return Datos == null ? 0 : Datos.size();
    }

    public int getColumnCount()
    {
        return Datos == null ? 0 : Datos.get(0).size();
    }

    public Object getValueAt(int rowIndex, int columnIndex)
    {
        return Datos == null ? null : Datos.get(rowIndex).get(columnIndex);
    }

    public String getColumnName(int columnIndex)
    {
        return etiquetas == null ? null : etiquetas[columnIndex];
    }

    public Class<?> getColumnClass(int columnIndex)
    {
        return Object.class;
    }

    public boolean isCellEditable(int rowIndex, int columnIndex)
    {
        return false;
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex)
    {
        Datos.get(rowIndex).set(columnIndex, aValue);
    }

    public void addTableModelListener(TableModelListener l) {
		listenerList.add(TableModelListener.class, l);
    }

    public void removeTableModelListener(TableModelListener l) {
		listenerList.remove(TableModelListener.class, l);
    }
}

Ahora basta con poner la clase en el mismo paquete que nuestro programa y

JTable tabla = new JTable();
tabla.setModel(new ResultSetTable(rs)); //rs es un ResultSet previamente cargado
Categorías:Tutoriales Java Etiquetas: , ,
  1. miamu
    septiembre 20, 2011 a las 10:57 am

    Buen dia, me ayudo muchisimo tu respuesta. Enhorabuena,sigue adelante con tan excelentes tutoriales. Gracias!!!

  2. marzo 1, 2013 a las 5:17 pm

    Sweet blog! I found it while browsing on Yahoo News.
    Do you have any tips on how to get listed in Yahoo News?

    I’ve been trying for a while but I never seem to get there! Appreciate it

  3. junio 17, 2013 a las 12:03 pm

    Does your blog have a contact page? I’m having problems locating it but, I’d like to shoot you an e-mail.
    I’ve got some suggestions for your blog you might be interested in hearing. Either way, great blog and I look forward to seeing it expand over time.

  4. julio 8, 2013 a las 5:32 am

    This paragraph gives clear idea designed for the new
    users of blogging, that actually how to do blogging and site-building.

  1. octubre 31, 2014 a las 3:23 am
  2. noviembre 11, 2014 a las 12:09 pm

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: