package Thiago_teste_supercred;
import java.sql.*;
import javax.swing.*;
import javax.swing.table.*;
public class ResultSetTable extends JFrame {
private JTable grid;
private JScrollPane scrollPane;
public ResultSetTable() {
this.setTitle("Tabela com banco de dados");
this.setSize(300, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
grid = new JTable();
scrollPane = new JScrollPane(grid);
this.getContentPane().add(scrollPane, "Center");
this.pack();
}
public ResultSet consultar(String sql) {
ResultSet resultado = null;
try {
//Carregar o driver JDBC para PostGresql
DriverManager.registerDriver(new org.postgresql.Driver());
//Criando um conexao com schema contatos
Connection c =
DriverManager.getConnection(
"jdbc:postgresql:java",
"postgres",
"");
//execurtar consulta
Statement consulta = c.createStatement();
resultado = consulta.executeQuery(sql);
} catch (Exception e) {
e.printStackTrace();
}
return resultado;
}
public static void main(String[] args) {
ResultSetTableModel modelo = null;
ResultSet rs = null;
Connection con = null;
Statement stmt = null;
ResultSetTable frame = new ResultSetTable();
String query =
"SELECT nome, cidade.descricao as cidade,"
+ " bairro.descricao as bairro, uf"
+ " FROM pessoa, bairro, cidade"
+ " WHERE pessoa.cod_cidade = cidade.cod_cidade"
+ " AND pessoa.cod_bairro = bairro.cod_bairro";
rs = frame.consultar(query);
modelo = new ResultSetTableModel(rs);
frame.grid.setModel(modelo);
TableColumn col;
col = frame.grid.getColumnModel().getColumn(1);
col.setPreferredWidth(100);
col = frame.grid.getColumnModel().getColumn(2);
col.setPreferredWidth(1000);
frame.setVisible(true);
}
}
Resultset em Jtable com Postgre - como inserir eventos para exclusão, alteração?
8 Respostas
Voce precisa tratar isso no seu TableModel, poste ele.
E já vou te avisando, trabalhar com ResultSets no TableModel é possivel, mas é mais complicado.
E no caso que sua aplicação evolua e o retorno de uma pesquisa for uma List e não um ResultSet seu TableModel se tornara inutil.
import javax.swing.table.*;
import java.sql.*;
import java.util.*;
public class ResultSetTableModel extends AbstractTableModel {
private ResultSet rs;
private ResultSetMetaData rsmd;
protected ArrayList cache;
public ResultSetTableModel(ResultSet aResultSet){
rs = aResultSet;
try {
rsmd = rs.getMetaData();
cache = new ArrayList();
//os dados da consulta são armazenados no cache.
while (rs.next()) {
Object[] row = new Object[rsmd.getColumnCount()];
for (int j=0;j<row.length;j++)
row[j] = rs.getObject(j+1);
cache.add(row);
}
} catch(SQLException e) {
System.out.println("Error " + e);
}
}//fim bloco construtor
}//fim bloco classe
Entao, voce precisa sobreescrever o método setValueAt para fazer o que voce quer.
Me dê um exemplo de como ficaria correto esta implementação , não sei se esta é a melhor prática.
Vish cara, vai dar trabalho voce fazer do modo que voce quer.
Se voce tivesse um TableModel que trabalhasse com Objetos do tipo da classe voce apenas modificaria no objeto correspondente e mandaria sua classe DAO altera-la no banco.
No seu caso, voce precisa saber qual é o objeto daquela linha, montar o statement e enviar pro banco. Inviavel fazer isso genericamente.
Então vamos esquecer este meu modelo e me passe uma prática sua, que você use e tenha um bom desempenho. Poste seu código para eu estudá-lo.
Cara… eu nao tenho nenhum exemplo.
Mas voce pode seguir esse link.
http://www.guj.com.br/posts/list/15/199067.java#1001295
E se quier ver um TableModel pronto tem esse que eu fiz ObjectTableModel que trabalha com Annotations.
Ou o que o ViniGodoy fez Auto-Filtro que trabalha com enums.
E em ambos TableModels que falei trabalha com uma List do tipo do objeto que voce tem que trabalhar na tabela.
Por exemplo, seu DAO precisa consultar clientes, então ele retorna um List invés de um ResultSet.
É um conceito que se voce for usar os models prontos ou entao criar o seu deveria ser seguido.