JTable a partir de un ResultSet

seba
29 de Abril del 2005
Como podría mostrar los datos obtenidos de una consulta executeQuery en una tabla JTable.

Gracias.

chuidiang
29 de Abril del 2005
Hazte una clase que implemente TableModel y que implemente todos los metodos a base de devolver las cosaa propias del ResultSet. No sé si esto es fácil o no, porque no conozco bien ResultSet.
Luego al JTable le puedes hacer un setModel () pasandole esta clase.
Se bueno.

Alf
29 de Abril del 2005
Hola. Te pego una clase enterita que uso yo. Sólo tienes que pasarle la query como argumento y luego crear el JTable con lo que te devuelva.

Es decir: Harías (para este nombre de la clase)

Monitor_Tabla_Impresion aTabla = new Monitor_Tabla_Impresion(tuquery);

JTable laTablaFinal = new JTable(aTabla);

Espero haberte ayudado y que el copy paste me funcione bien a continuación.

Saludos
Alf

import javax.swing.event.*;
import javax.swing.*;
import java.util.Vector;
import java.sql.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.event.TableModelEvent;

public class Monitor_Tabla_Impresion extends AbstractTableModel {
Connection connection = Monitor_Conexion.aConexion;
Statement statement = Monitor_Conexion.aStatement;
ResultSet resultSet;
String[] columnNames = {
};
public static Vector rows = new Vector();
ResultSetMetaData metaData;

public Monitor_Tabla_Impresion(String aQuery) {
statement = Monitor_Conexion.aStatement;

try {
if (resultSet != null)
resultSet.close();
resultSet = statement.executeQuery(aQuery);
metaData = resultSet.getMetaData();

int numberOfColumns = metaData.getColumnCount();
columnNames = new String[numberOfColumns];
// Get the column names and cache them.
// Then we can close the connection.
for (int column = 0; column < numberOfColumns; column++) {
columnNames[column] = metaData.getColumnLabel(column + 1);
}

// Get all rows.
rows = new Vector();
while (resultSet.next()) {
Vector newRow = new Vector();
for (int i = 1; i <= getColumnCount(); i++) {
newRow.addElement(resultSet.getObject(i));
}
rows.addElement(newRow);
}
// close(); Need to copy the metaData, bug in jdbc:odbc driver.
//fireTableChanged(null); // Tell the listeners a new table has arrived.

resultSet.close();
} catch (SQLException ex) {
System.err.println("Error al ejecutar la query " + aQuery);
System.err.println(ex);
}

}

public String dbRepresentation(int column, Object value) {
int type;

if (value == null) {
return "null";
}

try {
type = metaData.getColumnType(column + 1);
} catch (SQLException e) {
return value.toString();
}

switch (type) {
case Types.INTEGER :
case Types.DOUBLE :
case Types.FLOAT :
return value.toString();
case Types.BIT :
return ((Boolean) value).booleanValue() ? "1" : "0";
case Types.DATE :
return value.toString(); // This will need some conversion.
default :
return """ + value.toString() + """;
}

}

public Class getColumnClass(int column) {
int type;
try {
type = metaData.getColumnType(column + 1);
} catch (SQLException e) {
return super.getColumnClass(column);
}

switch (type) {
case Types.CHAR :
case Types.VARCHAR :
case Types.LONGVARCHAR :
return String.class;

case Types.BIT :
return Boolean.class;

case Types.TINYINT :
case Types.SMALLINT :
case Types.INTEGER :
return Integer.class;

case Types.BIGINT :
return Long.class;

case Types.FLOAT :
case Types.DOUBLE :
return Double.class;

case Types.DATE :
return java.sql.Date.class;

default :
return Object.class;
}
}
public int getColumnCount() {
return columnNames.length;
}
//////////////////////////////////////////////////////////////////////////
//
// Implementation of the TableModel Interface
//
//////////////////////////////////////////////////////////////////////////

// MetaData

public String getColumnName(int column) {
if (columnNames[column] != null) {
return columnNames[column];
} else {
return "";
}
}
// Data methods

public int getRowCount() {
return rows.size();
}
public Object getValueAt(int aRow, int aColumn) {
Vector row = (Vector) rows.elementAt(aRow);
return row.elementAt(aColumn);
}
public boolean isCellEditable(int row, int column) {
return false;
}
public void setValueAt(Object value, int row, int column) {
try {
String tableName = metaData.getTableName(column + 1);
// Some of the drivers seem buggy, tableName should not be null.
if (tableName == null) {
System.out.println("Table name returned null.");
}
String columnName = getColumnName(column);
String query = "update " + tableName + " set " + columnName + " = " + dbRepresentation(column, value) + " where ";
// We don't have a model of the schema so we don't know the
// primary keys or which columns to lock on. To demonstrate
// that editing is possible, we'll just lock on everything.
for (int col = 0; col < getColumnCount(); col++) {
String colName = getColumnName(col);
if (colName.equals("")) {
continue;
}
if (col != 0) {
query = query + " and ";
}
query = query + colName + " = " + dbRepresentation(col, getValueAt(row, col));
}
System.out.println(query);
System.out.println("Not sending update to database");
// statement.executeQuery(query);
} catch (SQLException e) {
// e.printStackTrace();
System.err.println("Update failed");
}
Vector dataRow = (Vector) rows.elementAt(row);
dataRow.setElementAt(value, column);

}
}