Resultset em Jtable com Postgre - como inserir eventos para exclusão, alteração?

8 respostas
THIAGOANALISTA
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);
    }
}

8 Respostas

Marky.Vasconcelos

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.

THIAGOANALISTA
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
Marky.Vasconcelos

Entao, voce precisa sobreescrever o método setValueAt para fazer o que voce quer.

THIAGOANALISTA

Me dê um exemplo de como ficaria correto esta implementação , não sei se esta é a melhor prática.

Marky.Vasconcelos

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.

THIAGOANALISTA

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.

Marky.Vasconcelos

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.

Marky.Vasconcelos

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.

Criado 4 de agosto de 2010
Ultima resposta 4 de ago. de 2010
Respostas 8
Participantes 2