Criar JTable dinamicamente a partir do Metadados de uma tabela [RESOLVIDO]

1 resposta
L

Boa tarde pessoal, estou precisando criar um aplicativo que carrega dinamicamente os dados de uma tabela. COmo este aplicativo deve ser capaz de conectar em qqr banco de dados, não tenho como ter classes de entidades no meu sistema.

Para tal, penso em ler os metadados da tabela utilizando JDBC. Na verdade já tenho um classe Table que representa a tabela e outra Column que representa as colunas, segue:

TABLE

public class Table {
    private String name;
    private List<Column> columns;
    ....
}

COLUMN

public class Column {
    private String name;
    private Integer type;
    private String typeName;    
    private Integer size;
    private Integer decimal;
    private Boolean nullable;
    private Boolean primarykey;
    private String comment;
    ....
}

No caso, tenho um objeto tabela do tipo Table, populado com os dados de uma determinada tabela do banco… Então já sei o nome dados colunas, o tipo delas, etc…

O problema é como alimentar este JTable baseado no meu tabela.getColumns()… Sei que terei de dar um select na tabela, mas como jogar isto pro JTable. Como estou começando com desenvolvimento swing, estou com dificuldades.

Obrigado pela ajuda.

1 Resposta

L

Boa tarde, resolvi o problema… Não sei se da melhor maneira possível, mas o trem funcionou…

Criei uma classe baseada no AbstractTableModel que recebe por parametro a tabela (classe Table descrita anteriormente) que deverá ser pesquisada e seus dados (ArrayList):

public class DadosTableModel extends AbstractTableModel {
    private Table tabela;
    private ArrayList dados;

    public DadosTableModel(Table tabela, ArrayList linhas) {
        this.tabela = tabela;
        this.dados = linhas;
    }
    
    @Override
    public int getRowCount() {
        return this.dados.size();
    }

    @Override
    public int getColumnCount() {
        return tabela.getColumns().size();
    }

    @Override
    public String getColumnName(int column) {  
        Column c = tabela.getColumns().get(column);
        return c.getName();
    } 
    
    @Override
    public Class<?> getColumnClass(int columnIndex) { 
        Column c = tabela.getColumns().get(columnIndex);
        return c.getClasse();
    }
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {  
        //Nenhuma célula será editável
        return false;  
    }
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        ArrayList linha = (ArrayList) this.dados.get(rowIndex);
        return linha.get(columnIndex);
    }
}

Criei uma classe DAO para buscar os dados no banco:

public class GenericDAO {
    private Connection conn;
    private Table tabela;
    
    public GenericDAO(AplicacaoVO app, Table tabela) throws SQLException {
        this.conn = ConnectionFactory.getConnection(app);
        this.tabela = tabela;
    }
    public ArrayList getDados() throws SQLException {
        String sql = "select * from "+ this.tabela;
        PreparedStatement stmt = this.conn.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();
        
        ArrayList retorno = new ArrayList();

        while (rs.next()) {
            ArrayList linha = new ArrayList();
            
            for (int i = 0;i < this.tabela.getColumns().size(); i++) {
                Column coluna = this.tabela.getColumns().get(i);
                        
                linha.add(rs.getObject(coluna.getName()));
            }
            
            retorno.add(linha);
        }

        return retorno;
    }
}

e depois chamei tudo isto:

GenericDAO dao = new GenericDAO(this.app, this.tabela);
table.setModel(new DadosTableModel(this.tabela, dao.getDados()));

Como eu falei, pode não ser a melhor forma de solucionar… até deve ter um jeito mais simples, mas para o meu problema deu certo… Se alguém tiver uma sugestão para otimizar isto, toda crítica construtiva será bem vinda…

[]s

Criado 23 de dezembro de 2011
Ultima resposta 27 de dez. de 2011
Respostas 1
Participantes 1