Tentando popular no abstractTableModel registros do Db, só tentando mesmo

Olá,

estou tentando aprender abstracttablemodel aquela $#$#($ para fugir daquela tabela que clica e arrasta, mas minha luta para aprender isso não está sendo fácil,

então estou recorrendo aqui para tentar obter ajuda.

fiz o metodo que lista no produto dao

public List listarProduto() throws SQLException{
String sql = “SELECT * FROM produto”;

    this.stmt = con.prepareStatement(sql);
    
    this.rs = this.stmt.executeQuery();
    
    List<Produto> ps = new ArrayList<Produto>();
    while(rs.next()){
        Produto p = new Produto();
        p.setId(rs.getInt("id"));
        p.setDescricao(rs.getString("descricao"));
        p.setQtd(rs.getInt("qtd"));
        p.setValor(rs.getDouble("valor"));
        ps.add(p);
    }
    
    stmt.close();
    rs.close();
    con.close();
    
    return ps;
}

agora que listar no tabela que estou criando. Se fosse naquela tabela (aquela que arrasta) não teria problema, mas como estoou tentando adicionar a abstracttablemodel tá dificil.

se alguém poder ajudar agradeço.

pois já faz tendo que estou tendando aprender essa coisa.

a AbstractTableModel que estou tentando criar está assim

public class TabelaProduto extends AbstractTableModel{

private List<Produto> dados = new ArrayList<>();
private String[] colunas = {"ID","Descricao", "QTD", "Valor"};

@Override
public String getColumnName(int i) {
    return colunas[i];
}

public void addRow(Produto p){
    dados.add(p);
    fireTableDataChanged();
}

public void removerRow(int linha){
    this.dados.remove(linha);
    fireTableRowsDeleted(linha, linha);
}

@Override
public int getRowCount() {
    return dados.size();
}

@Override
public int getColumnCount() {
    return colunas.length;
}

@Override
public Object getValueAt(int linha, int coluna) {
    switch(coluna){
        case 0:
            return dados.get(linha).getDescricao();
        case 1:
            return dados.get(linha).getQtd();
        case 2:
            return dados.get(linha).getValor();
    }
    return null;
}

@Override
public void setValueAt(Object valor, int linha, int coluna){
    switch(coluna){
        case 0:
            dados.get(linha).setDescricao((String)valor);
            break;
        case 1:
            dados.get(linha).setQtd(Integer.parseInt((String)valor));
            break;
        case 2:
            dados.get(linha).setValor(Double.parseDouble((String) valor));
            break;
    }
    fireTableRowsUpdated(linha, linha);
}

}

na tela que é instaciada está

TabelaProduto tabelaProduto = new TabelaProduto();

public TelaProduto() {
    initComponents();
    tblProduto.setModel(tabelaProduto);
   // montarTabela();
}

E onde você chama o método listarProduto() para passar a lista de produtos pro seu TableModel?

Então, é a partir dessa parte que não estou sabendo fazer!

se fosse para antes só fazia algo asssim


i private void montarTabela() {
List produtos;
try {
produtos = new ProdutoDAO().listarProduto();

     int linha = 0;
     for(Produto p : produtos){
         tblProduto.getModel().setValueAt(p.getId(), linha, 0);
         tblProduto.getModel().setValueAt(p.getDescricao(), linha, 1);
         tblProduto.getModel().setValueAt(p.getQtd(), linha, 2);
         tblProduto.getModel().setValueAt(p.getValor(), linha, 3);
        linha++;
     }

Vish, isso da trabalho mesmo …

Brother perceba essa linha:

private List<Produto> dados = new ArrayList<>();

Aqui você diz pro model bem assim: “Coé tabela! quando eu te dar um ‘new()’ os dados serão vazios!”, na criação da instancia desse objeto vc faz isso para dar suporte aos @Overrides que vc criou nessa classe já que seu model vai implementar todos os métodos a partir dessa lista vazia.

Acredito que quando vc exibe seu front-end assim sua tabela fica sem nada nas linhas somente com os nomes das colunas, mas por enquanto tah tudo de boas, relaxa, só te falta colocar coisas nessa lista.

Perceba que seu model tem esse método:

public void addRow(Produto p){
    dados.add(p);
    fireTableDataChanged();
}

Ele pega sua lista (até então vazia) adiciona um objeto, e depois manda o front-end da tabela atualizar pra versão mais atual da lista (falando de maneira bem superficial).

Logo se eu fizer algo assim já estarei adicionando coisas na sua tabela:

// *PS faz tempo que não mexo com Swing então não lembro se é bem assim que coloca um model na JTable
JTable tabela = new JTable();
TabelaProduto model = new TabelaProduto(); //criei a instancia do seu model - a lista está vazia
tabela.setModel(model);

Produto produto = new Produto(); //criei um produto pra inserir na sua tabela
produto.setId(1);
produto.setDescricao("produto teste");
produto.setQuantidade(20);
produto.setValor(2.5);

model.addRow(produto); //aeeeeee inseri um objeto na sua tabela

se vc quer inserir uma lista que vem do banco vc pode fazer isso num “for”:

for (Produto p: listaProduto){
     model.addRow(produto);
}

Você pode também fazer de dentro do seu model via construtor… Assim quando vc der um new() no seu model ele já vai preencher a lista “automaticamente”

public TabelaProduto(){
    ProdutosDao dao = new ProdutosDao();
    dados = dao.listarProdutos();
    super.fireTableDataChanged();
}

Finalizando… O seu objetivo é: Colocar objetos dentro da lista “dados”… uma vez que vc atualiza ela, é só mandar um “fireTableDataChanged();” pra informar as alterações pro front-end…

Agora eu consigo listar os dados do bd na tabela, mas não consigo fazer a lista seja atualizada quando atualizo, removo ou cadastro um registro :frowning:

Segue o exemplo. Basta seguir que funciona perfeito. Para alterar a tabela, basta passar uma nova lista para o método changeTabela

Table Model

/**
 *
 * @author fernando
 */
public class ContaTableModel extends AbstractTableModel{
private List<Emprestimo> lista;
private String[] colunas = {"Conta ", "Vencto. ", "Capital R$ ", "Juros R$ "};
private ControlaDatas cDatas = new ControlaDatas();

 

public ContaTableModel(){
   this.lista = new ArrayList<Emprestimo>();
}

public ContaTableModel(List<Emprestimo> lista){
    this();
    this.lista.addAll(lista);
}

@Override
public int getRowCount() {
    return this.lista.size();
}

@Override
public int getColumnCount() {
    return this.colunas.length;
}

//private String[] colunas = {"Conta ", "Vencto. ", "Capital R$ ", "Juros R$ "};
public String getColumnName(int column){
    if(colunas[column] == "Conta "){
        return "Conta ";
    }else if(colunas[column] == "Vencto. "){
        return "Vencto. ";
    }else if(colunas[column] == "Capital R$ "){
        return "Capital R$ ";
    }else if(colunas[column] == "Juros R$ "){
        return "Juros R$ ";
    }
    return "";
}

//private String[] colunas = {"Conta ", "Vencto. ", "Capital R$ ", "Juros R$ "};
public Class getColumnClass(int column){
    if(colunas[column] == "Conta "){
        return String.class;
    }if(colunas[column] == "Vencto. "){
        return String.class;
    }else if(colunas[column] == "Capital R$ "){
        return String.class;
    }else if(colunas[column] == "Juros R$ "){
        return String.class;
    }
    return String.class;
}

//private String[] colunas = {"Conta ", "Vencto. ", "Capital R$ ", "Juros R$ "};
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Emprestimo e = (Emprestimo)lista.get(rowIndex);
    switch(columnIndex){
        case 0: return e.getConta().getDescricao();
        case 1: return cDatas.getDataFormatada(e.getDtVencimento());
        case 2: return FormataValorMonetario.getValorFormatado(e.getValorCapital()); 
        case 3: return FormataValorMonetario.getValorFormatado(e.getJurosReais());            
        //case 3: return cli.getStatus() == 1 ? "Ativo" : "Inativo";
        default: return new String();
    }
}

/** retorna o objeto */
public Emprestimo getObject(int row){
    return lista.get(row);
}

/** remove registro da tabela */
public void removeRow(int row){
    this.lista.remove(row);
    fireTableDataChanged();
}

/** altera a tabela */
public void changeTabela(List<Emprestimo> novaLista){
    this.lista = novaLista;
    fireTableDataChanged();
}

}

Usando TableModel

public class BaixasEmprestimo extends javax.swing.JDialog {
      private ContaTableModel model;

      public BaixasEmprestimo(java.awt.Frame parent, boolean modal) {
         super(parent, modal);        
         init();
     }

      private void init(){
             List<Emprestimo> lista = new EmprestimoDAO().findAllAtivo();        
             model = new ContaTableModel(lista);
             tabela.setModel(model); //JTable setModel
      }

      public void alteraValoresTabela(List<Emprestimo> lista){
            model.changeTabela(lista);
      }
      

}

Basta seguir a lógica que consegue. O TableModel já esta pronto, altere conforme você precisar. E lembre-se, em todas as operações na JTable você realiza no TableModel e não no Form.