【问题标题】:They could help me with JTable displays data and how?他们可以帮助我使用 JTable 显示数据以及如何显示数据?
【发布时间】: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;


}

【问题讨论】:

    标签: java mysql swing


    【解决方案1】:

    查看Table From Database 了解一些解决方案。

    1. TableFromDatabaseExample 代码显示了使用 DefaultTableModel 时的简单解决方案。

    2. ListTableModel.createModelFromResultSet(...) 方法使用自定义的通用 ListTableModel。理解起来更复杂,但功能更多。

    【讨论】:

      猜你喜欢
      • 2015-05-07
      • 2010-11-23
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      相关资源
      最近更新 更多