AbstractTableModel removendo registro do BD?

salve galera…

implementei um AbstractTableModel, esta funcionando blzinha trazendo os registros e tals. Quero saber, melhor entender, como faco por exemplo pra pegar uma linha da JTable e excluir ou alterar o registro no banco de dados.

aqui meu AbstractTableModel e meu DAO.

public class CaixaTableModel extends AbstractTableModel{
    private List<Caixa> caixa;
    private String[] colunas = {"Itens", "Cód.Produto", "Produto", "Descrição", "Valor Un.", "Qtd.", "Total Compra"};
    
    public CaixaTableModel(){
        this.caixa = new ArrayList<Caixa>();
    }
    
    public CaixaTableModel(List<Caixa> lista){
        this();
        this.caixa.addAll(lista);
    }

    
    
    @Override
    public int getRowCount() {
        //throw new UnsupportedOperationException("Not supported yet.");
        return this.caixa.size();
    }

    @Override
    public int getColumnCount() {
       // throw new UnsupportedOperationException("Not supported yet.");
        return this.colunas.length;
    }
    
    public String getColumnName(int column){
        //nome da coluna
        if(colunas[column] == "Itens"){
            return "Itens";
        }else if(colunas[column] == "Cód.Produto"){
            return "Cód.Produto";
        }else if(colunas[column] == "Produto"){
            return "Produto";
        }else if(colunas[column] == "Descrição"){
            return "Descrição";
        }else if(colunas[column] == "Valor Un."){
            return "Valor Un.";
        }else if(colunas[column] == "Qtd."){
            return "Qtd.";
        }else if(colunas[column] == "Total Compra"){
            return "Total Compra";
        }
        return "";
    }
    
     public Class getColumnClass(int column){
        if(colunas[column] == "Itens"){
            return Integer.class;
        }else if(colunas[column] == "Cód.Produto"){
            return Long.class;
        }else if(colunas[column] == "Produto"){
            return String.class;
        }else if(colunas[column] == "Descrição"){
            return String.class;
        }else if(colunas[column] == "Valor Un."){
            return BigDecimal.class;
        }else if(colunas[column] == "Qtd."){
            return double.class;
        }else if(colunas[column] == "Total Compra"){
            return BigDecimal.class;
        }
        return String.class;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        //throw new UnsupportedOperationException("Not supported yet.");
        Caixa c = this.caixa.get(rowIndex);        
        switch(columnIndex){
            case 0: return new FormataCodigos().retornaCodigoFormatado(new Long(c.getItensPedido()));
            case 1: return new FormataCodigos().retornaCodigoFormatado(c.getProduto().getCodigo());
            case 2: return c.getProduto().getProduto();
            case 3: return c.getProduto().getDescricao();
            case 4: return new FormataMonetarios().retornaValorFormatado(c.getValorUnitario());
            case 5: return new FormataDecimais().retornaValorFormatado(c.getQuantidade());
            case 6: return new FormataMonetarios().retornaValorFormatado(c.getTotalCompra());
            default: return new String();
        }        
        
    }

    public Boolean deleteAll(){
        this.caixa.clear();
        fireTableDataChanged();
        return true;
    }
    
    public boolean removeRow(int line){   
         this.caixa.remove(line); 
         fireTableDataChanged();
         return true;   
   }   
}


//aqui meu DAO
public void removeRegistro(Long id){
    PreparedStatement stm = this.con.prepareStatement("DELETE FROM tabela WHERE id = ?");
    stm.setLong(1, id);
    stm.execute();
}

Como eu faco por exemplo pra remover a linha da JTable e ja remover o registro no banco de dados…A mesma coisa para UPDATE.
Com DefaultTableModel eu pegava o codigo do produto direto da tabela e mandava para meu DAO remove-lo, ja com AbstractTableModel ainda nao entendi como fazer.

obrigado.

Opa galera…Acho q descobri, basta dar um getValue() no model pegando o codigo e passando para o DAO.

acho q eh isso.

Long id = model.getValueAt(linha, coluna); 
removeRow(linha);
new DAO.remove(id);

Acho q é isso, naum se se eh a melhor maneira de fazer mas consegui assim.

Como diz o Vini Godoy: “Trabalhar com AbstractTableModel eh bem mais facil e pratico”…To curtindo muito…

Qquer dica, posta ae.

obrigado.

E se a coluna que você põe o id mudar? Ou se você quiser uma tabela sem ela coluna, já que muitas vezes ela nem tem significado para seu usuário?

Melhor ainda é você criar no seu model um método get que retorna um Caixa inteiro:

public Caixa get(int row) { return caixa.get(row); }

Aí vc pode fazer assim com o seu Dao:

Caixa c = model.get(linhaSelecionada); new CaixaDao().removeRegistro(c.getId()); suaTable.removeRow(linhaSelecionada);

Deixe os métodos getValueAt e setValueAt para a tabela usar. Para você, basta usar o get que retorna um caixa inteiro e trabahar diretamente com objetos de negócio. :slight_smile:
Diga adeus a lidar com campos separadamente, ou a ter que decorar em que índice está a coluna do seu id.

Note que assim, você também poderá usar dados de caixa que sequer estão lidados na tabela. O model sabe quem é o objeto, então use-o. :wink:

Opa Vini…Muito bom, to gostando muito de mexer com AbstractTableModel realmente é muiiiito melhor q mexer com DefaultTableModel.
Apanhando ainda e entendendo o conceito, mas ja da pra perceber a diferença, muito bomm msm.

t+ e obrigado