【发布时间】:2015-10-28 16:47:38
【问题描述】:
我正在创建用于数据库中任何表的通用草图模型表。想法是JTable模型实例化采用这个类,只传递数据库的表来查询。
还没写完,看到有参数,但没用过。
问题是我使用 Object [] [] 数组扩展到 AbstractTableModel 和性别数据,这使我丢失了数据类型。
为了解决我得到一个 ResultSetMetaData 列的数据类并存储在一个数组中。
覆盖getColumnClass()方法,返回我存储在所述数组中的类,但是当组装表时,Integer仍然出现左对齐,就像String一样。
Les step 希望能说明错误在哪里,或者发现代码遗漏。
package com.reclamos.jpa.utilitarios;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
public class GeneracionTableModel extends AbstractTableModel {
/**
*
*/
private static final long serialVersionUID = -5487182325989883781L;
public GeneracionTableModel(JTable tabla, String pTabla, String[] titulosColumnas){
//this.tabla = tabla;
this.pTabla = pTabla;
this.titulosColumnas = titulosColumnas;
conexion = null;
sqlString = null;
sentencia = null;
rs = null;
obtenerDatos();
}
public void obtenerDatos(){
try {
conexion = new Conexion();
sqlString = "SELECT * FROM " + pTabla;
sentencia = conexion.getConexion().prepareStatement(sqlString);
rs = sentencia.executeQuery();
rsmd = rs.getMetaData();
crearTableModel(rs);
}
catch(SQLException sqle){
JOptionPane.showMessageDialog(null, "Se ha producido el siguiente error: " + sqle.getMessage());
}
finally{
try {
rs.close(); //ver de mover al m�todo en donde se llena el TableModel, para que se cierre antes de leerlo
conexion.getConexion().close();
} catch (SQLException sqle) {
JOptionPane.showMessageDialog(null, "Se ha producido el siguiente error: " + sqle.getMessage());
}
}
}
public void crearTableModel(ResultSet resultSet){
try {
resultSet.last();
ultimaFila = resultSet.getRow();
resultSet.first();
clases = new Class[rsmd.getColumnCount()];
for(int puntero=0; puntero < rsmd.getColumnCount();puntero++ ){
Class<?> clase = Class.forName(rsmd.getColumnClassName(puntero+1));
//System.out.println(clase);
clases[puntero] = clase;
//System.out.println(clases[puntero].getClass().toString());
JOptionPane.showMessageDialog(null, "CrearTableModel-Clases: " + clases[puntero]);
}
/**
HashMap hashColumnas = new HashMap<Integer, Class<?>>();
for(int puntero=0; puntero < rsmd.getColumnCount(); puntero++){
String clase = rsmd.getColumnClassName(puntero+1) + ".class";
hashColumnas.put(puntero, Class.forName(clase));
System.out.println(hashColumnas.get(puntero));
}
*/
fila = new Object[ultimaFila][rsmd.getColumnCount()];
for (int punteroFilas = 1; punteroFilas <= ultimaFila; punteroFilas++) {
for (int punteroColumnas = 0; punteroColumnas < titulosColumnas.length; punteroColumnas++) {
//String tipoDato = rsmd.getColumnTypeName(punteroColumnas+1);
//System.out.println(tipoDato);
fila[punteroFilas-1][punteroColumnas] = resultSet.getString(punteroColumnas+1);
//System.out.println(fila[punteroColumnas]);
}
rs.next();
}
//tabla.getColumn(0).setCellRenderer(new DefaultTableCellRenderer());
}
catch(ClassNotFoundException cnfe){
JOptionPane.showMessageDialog(null, "CrearTableModel-CNFE-Se ha producido el siguiente error: " + cnfe.getMessage());
}
catch(SQLException e){
JOptionPane.showMessageDialog(null, "CrearTableModel-SQL-Se ha producido el siguiente error: " + e.getMessage());
}
finally{
try {
rs.close();
conexion.getConexion().close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "CrearTableModel-Finally-Se ha producido el siguiente error: " + e.getMessage());
}
}
}
@Override
public Class<?> getColumnClass(int columnIndex) {
//System.out.println(clases[columnIndex].getClass());
JOptionPane.showMessageDialog(null, "GetColumnClass: " + clases[columnIndex].toString());
return clases[columnIndex].getClass();
}
@Override
public int getColumnCount(){
try {
return rsmd.getColumnCount();
} catch (SQLException e) {
e.printStackTrace();
return 0;
}
}
@Override
public int getRowCount() {
return ultimaFila;
}
@Override
public Object getValueAt(int row, int col) {
return fila[row][col];
}
/**
public static void main(String[] args){
String[] titulos = {"IdLocalidad", "Descripci�n"};
new GeneracionTableModel("localidades", titulos );
}
*/
private Conexion conexion;
private String pTabla;
private Object[][] fila;
private String[] titulosColumnas;
private String sqlString;
private PreparedStatement sentencia;
private ResultSet rs;
private ResultSetMetaData rsmd;
private int ultimaFila;
private Class<?>[] clases;
private DefaultTableModel tableModel;
//private JTable tabla;
}
【问题讨论】: