AbstractTableModel adicionar item?

5 respostas
fernandopaiva

Salve galera…

Seguinte, eu tenho uma JTable q usa um AbstractTableModel, a ideia e ir adicionando items a ela q sao vindos de uma consulta. Por exemplo, eu adiciono um item a uma venda e dou um SELECT nos itens da venda e exibo na JTable. Problema, é na hora de remover um item e adicionar mais itens.

to tentando assim.

// Meu DAO
public void addItemVenda(ItensVenda iv){ 
        /**
        * Adicionar itens a venda
        */  
        try {
            PreparedStatement stm = this.con.prepareStatement("INSERT INTO itensvenda (id_venda, id_produto, itens, valorun, qtd, totalitem) "
                                                            + "VALUES (?,?,?,?,?,?)");
            stm.setLong(1, iv.getVenda().getIdVenda());
            stm.setLong(2, iv.getProduto().getId_produto());
            stm.setInt(3, iv.getItens());
            stm.setBigDecimal(4, iv.getValorUn());
            stm.setDouble(5, iv.getQtd());
            stm.setBigDecimal(6, iv.getTotal());
            stm.executeUpdate();
            stm.close();
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Não foi possivel vender este item: " + ex.getMessage(), "Erro de Item", JOptionPane.ERROR_MESSAGE);
        }
    }


public List<ItensVenda> consultaTodosItensVenda(Long idVenda){  
        /**
        * Retorna todos os itens da venda
        */      
        List<ItensVenda> lista = new ArrayList<ItensVenda>();        
        try {
            PreparedStatement stm = this.con.prepareStatement("SELECT * FROM itensvenda "
                                                            + "INNER JOIN produtos ON (itensvenda.id_produto = produtos.id_produto) "
                                                            + "INNER JOIN unidades ON (unidades.id_unidade = produtos.id_unidade) "
                                                            + "WHERE id_venda = ?");
            stm.setLong(1, idVenda);
            ResultSet rs = stm.executeQuery();
            while(rs.next()){                
                ItensVenda iv = new ItensVenda();
                
                Unidades u = new Unidades();
                u.setUnidade(rs.getString("unidade"));
                
                Produtos p = new Produtos();
                p.setDescricao(rs.getString("descricao"));
                p.setUnidade(u);
                
                iv.setProduto(p);                
                iv.setItens(rs.getInt("itens"));
                iv.setValorUn(rs.getBigDecimal("valorun"));
                iv.setQtd(rs.getDouble("qtd"));
                iv.setTotal(rs.getBigDecimal("totalitem"));
                lista.add(iv);
            }
            rs.close();
            stm.close();
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Não foi possivel encontrar o item: " + ex.getLocalizedMessage(), "Erro de Conexão", JOptionPane.ERROR_MESSAGE);
        }        
        return lista;
    }




//meu AbstractTableModel
public class PDVTableModel extends AbstractTableModel{
    private List<ItensVenda> itemVenda;
    private String[] colunas = {"Itens","Descrição","Valor Un.(R$)","Qtd.","Un.","Total(R$)"};
    
    public PDVTableModel(){
        this.itemVenda = new ArrayList<ItensVenda>();
    }
    
    public PDVTableModel(List<ItensVenda> lista){
        this();
        this.itemVenda.addAll(lista);
    }

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

    @Override
    public int getColumnCount() {
        return this.colunas.length;
    }
    
    public String getColumnName(int column){
        //nome da coluna              
        if(colunas[column] == "Itens"){
            return "Itens";
        }else if(colunas[column] == "Descrição"){            
            return "Descrição";
        }else if(colunas[column] == "Un."){
            return "Un.";
        }else if(colunas[column] == "Valor Un.(R$)"){
            return "Valor Un.(R$)";            
        }else if(colunas[column] == "Qtd."){
            return "Qtd.";
        }else if(colunas[column] == "Total(R$)"){
            return "Total(R$)";
        }
        return new String();
    }
    
     public Class getColumnClass(int column){
         //private String[] colunas = {"Itens","Descrição","Unidade","R$ Valor Un.","Qtd.","R$ Total"};
         if(colunas[column] == "Itens"){
             return int.class;
         }else if(colunas[column] == "Descrição"){
            return String.class;
         }else if(colunas[column] == "Un."){
             return String.class;
         }else if(colunas[column] == "Valor Un.(R$)"){
             return BigDecimal.class;
         }else if(colunas[column] == "Qtd."){
            return double.class;
         }else if(colunas[column] == "Total(R$)"){
            return BigDecimal.class;
         }
        return String.class;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) { 
        //private String[] colunas = {"Itens","Descrição","Valor Un.(R$)","Qtd.","Un.","Total(R$)"};
        ItensVenda item = this.itemVenda.get(rowIndex);        
        switch(columnIndex){
            case 0: return new FormataItens().retornaItensFormatado(item.getItens());
            case 1: return item.getProduto().getDescricao();    
            case 2: return new FormataMonetarios().retornaValorFormatado(item.getValorUn());            
            case 3: return new FormataQuantidades().retornaValorFormatado(item.getQtd());
            case 4: return item.getProduto().getUnidade();            
            case 5: return new FormataMonetarios().retornaValorFormatado(item.getTotal());
            default: return new String();
        }        
        
    }
    
    public BigDecimal getTotalCompra(){
        /**
        * Retorna calculo total dos itens
        */
        BigDecimal total = new BigDecimal(0);
        for(ItensVenda iv : itemVenda){
            if(iv.getTotal().compareTo(BigDecimal.ZERO) > 0){
                total = total.add(iv.getTotal());
            }            
        }
        return total;
    }

    
    public void deleteAll(){        
        this.itemVenda.clear();
        fireTableDataChanged();
    }

    
 public void removeRow(int row){
        itemVenda.remove(row);
        fireTableDataChanged();
    }

    
    public ItensVenda getItensVenda(int row){
        /**
         * Retorna os ItensVenda
         */
        return itemVenda.get(row);
    }
    
    
    
    public void deleteItem(ItensVenda iv){
        /**
         * Remove item 
         */
        itemVenda.remove(iv);
        fireTableDataChanged();
    }
    
    
    public void add(ItensVenda v){
        /**
         * Add mais itens
         */
        itemVenda.add(v);
        fireTableDataChanged();
    }
}


// aqui meu Beans(POJO)
public class ItensVenda {
    private Vendas venda;
    private Produtos produto;
    private Integer itens;
    private BigDecimal valorUn;
    private Double qtd;
    private BigDecimal total;

    public ItensVenda() {
    }

    public Integer getItens() {
        return itens;
    }

    public void setItens(Integer itens) {
        this.itens = itens;
    }

    public Produtos getProduto() {
        return produto;
    }

    public void setProduto(Produtos produto) {
        this.produto = produto;
    }

    public Double getQtd() {
        return qtd;
    }

    public void setQtd(Double qtd) {
        this.qtd = qtd;
    }

    public BigDecimal getTotal() {
        return total;
    }

    public void setTotal(BigDecimal total) {
        this.total = total;
    }

    public BigDecimal getValorUn() {
        return valorUn;
    }

    public void setValorUn(BigDecimal valorUn) {
        this.valorUn = valorUn;
    }

    public Vendas getVenda() {
        return venda;
    }

    public void setVenda(Vendas venda) {
        this.venda = venda;
    }
}






// Aqui meu JDialog com JTable
public class IguanaPDV extends javax.swing.JDialog{    
    private PDVTableModel model;

    public IguanaPDV(){

         isVendaAberta();
    }

public void isVendaAberta(){
        /** 
         * Verifica se a ultima venda ficou em aberto, se estiver retorna o id da venda, os itens e os valores.
         */
        List<ItensVenda> lista = new ItemsVendaDAO().getVendaAberta(); 
        if(!lista.isEmpty()){
            model = new PDVTableModel(lista);
            tabelaItensVenda.setModel(model);
            for(ItensVenda iv : lista){
                qtdItens.setText(String.valueOf(tabelaItensVenda.getRowCount()));
                idVenda.setText(new FormataCodigos().retornaCodigoFormatado(iv.getVenda().getIdVenda()));                
            }             
            totalVenda.setText(new FormataMonetarios().retornaValorFormatado(model.getTotalCompra()));
            descProduto.setText("VENDA EM ABERTO");
            defineGrid();
        }  
    }



public void addItemVenda(){
    /**
    * Adiciono os itens a venda
    */
    ItensVenda iv = new ItensVenda();
        
    Vendas v = new Vendas();
    v.setIdVenda(Long.parseLong(idVenda.getText()));
    
    Produtos p = new Produtos();
    p.setId_produto(Long.parseLong(idProduto.getText()));

    iv.setItens(new ItemsVendaDAO().getUltimoItem(Long.parseLong(idVenda.getText())));
    
    iv.setValorUn(new BigDecimal(valorUn.getText().replaceAll("\\.", "").replace(",", ".")));
    iv.setQtd(Double.parseDouble(quantidade.getText().replaceAll("\\.", "").replace(",", ".")));
    iv.setTotal(new BigDecimal(subTotal.getText().replaceAll("\\.", "").replace(",", "."))); 
    iv.setVenda(v);
    iv.setProduto(p);
    
    //estoque 
    Estoque e = new Estoque();
    e.setProduto(p);
    //
    new ItemsVendaDAO().addItemVenda(iv);
    fazSaidaEstoque(iv, e, iv.getQtd());
    consultaItensVenda(); // retorna um List<ItensVenda> 
}



public void consultaItensVenda(){
    List<ItensVenda> lista = new ItemsVendaDAO().consultaTodosItensVenda(Long.parseLong(idVenda.getText()));    
    if(!lista.isEmpty()){        
        model = new PDVTableModel(lista); 
        tabelaItensVenda.setModel(model);        
        qtdItens.setText(String.valueOf(tabelaItensVenda.getRowCount()));
    }    
    defineGrid();
    limpaCampos();    
}

Eu acho q o problema esta no metodo consultaItensVenda(), pq ele sempre reinstancia um PDVTableModel() q é o Abstract e assim se perde nos indices pois foi reinstanciado, criado um outro objeto na memoria.

Tentei retornar o POJO e ir adicionando ao model mas o retorno é null e da erro de NullPointerException.

Qual seria a melhor maneira de fazer isso ?

aqui uma imagem do PDV.


5 Respostas

Nicolas_Fernandes

Fala, fernandopaiva, beleza?

Cara, explica direito a execução do procedimento…
Você abre a tela de venda, aperta algum botão para adicionar um produto, abre uma tela, escolhe o produto, dá OK e quer adicionar na sua tabela da venda, é isso?

fernandopaiva

Nicolas Fernandes:
Fala, fernandopaiva, beleza?

Cara, explica direito a execução do procedimento…
Você abre a tela de venda, aperta algum botão para adicionar um produto, abre uma tela, escolhe o produto, dá OK e quer adicionar na sua tabela da venda, é isso?

Salve Nicolas…

Seguinte, quando abre a tela de PDV ele procura por uma venda e se encontrar exibe ela na tela aqui.

public void isVendaAberta(){  
        /**  
         * Verifica se a ultima venda ficou em aberto, se estiver retorna o id da venda, os itens e os valores. 
         */  
        List<ItensVenda> lista = new ItemsVendaDAO().getVendaAberta();   
        if(!lista.isEmpty()){  
            model = new PDVTableModel(lista);  
            tabelaItensVenda.setModel(model);  
            for(ItensVenda iv : lista){  
                qtdItens.setText(String.valueOf(tabelaItensVenda.getRowCount()));  
                idVenda.setText(new FormataCodigos().retornaCodigoFormatado(iv.getVenda().getIdVenda()));                  
            }               
            totalVenda.setText(new FormataMonetarios().retornaValorFormatado(model.getTotalCompra()));  
            descProduto.setText("VENDA EM ABERTO");  
            defineGrid();  
        }    
    }

Caso exista uma venda em aberto como falei, eu posso ir adicionando mais itens a ela, fechar ou cancelar a venda…Enfim, trabalhar com a venda q esta em aberto.

Mas o problema esta em fazer uma nova venda, aqui.

public void addItemVenda(){  
    /** 
    * Adiciono os itens a venda 
    */  
    ItensVenda iv = new ItensVenda();  
          
    Vendas v = new Vendas();  
    v.setIdVenda(Long.parseLong(idVenda.getText()));  
      
    Produtos p = new Produtos();  
    p.setId_produto(Long.parseLong(idProduto.getText()));  
  
    iv.setItens(new ItemsVendaDAO().getUltimoItem(Long.parseLong(idVenda.getText())));  
      
    iv.setValorUn(new BigDecimal(valorUn.getText().replaceAll("\\.", "").replace(",", ".")));  
    iv.setQtd(Double.parseDouble(quantidade.getText().replaceAll("\\.", "").replace(",", ".")));  
    iv.setTotal(new BigDecimal(subTotal.getText().replaceAll("\\.", "").replace(",", ".")));   
    iv.setVenda(v);  
    iv.setProduto(p);  
      
    //estoque   
    Estoque e = new Estoque();  
    e.setProduto(p);  
    //  
    new ItemsVendaDAO().addItemVenda(iv);  
    fazSaidaEstoque(iv, e, iv.getQtd());  
    consultaItensVenda(); // retorna um List<ItensVenda>   
}  


public void consultaItensVenda(){  
    /**
    * Retorna uma lista de itens da venda
    */
    List<ItensVenda> lista = new ItemsVendaDAO().consultaTodosItensVenda(Long.parseLong(idVenda.getText()));      
    if(!lista.isEmpty()){          
        model = new PDVTableModel(lista);   
        tabelaItensVenda.setModel(model);          
        qtdItens.setText(String.valueOf(tabelaItensVenda.getRowCount()));  
    }      
    defineGrid();  
    limpaCampos();      
}

Veja o metodo consultaItensVenda(), eu sempre instancio o model novamente saca ??? Para cada item vendido, o model é redefinido e é ai q acho q esta dando o problema. Só q estou quebrando a cabeça aqui para ir fazendo a venda e retornar seus itens em um SELECT sem precisar redefinir sempre o model.

obrigado

fernandopaiva

Ups a venda é feita apos informar o codigo de barra no produto e sair no lostFocus do JTextField, ai e invocado o metodo addItemVenda() e o consultaItensVenda().

obrigado.

Nicolas_Fernandes

Cara, o model da sua tabela deve ser instanciado na hora da CRIAÇÃO da venda.
Você criou uma venda. Para isso, você instancia o formulário de venda e instancia o objeto do seu TableModel.
Pronto, você não mexe mais nesse objeto.

Você quis adicionar uma coleção nova à tabela, certo? Crie um método dentro da sua tabela modificarTabela ou coisa similar, que recebe uma coleção e altera a atual.
public void modificarTabela(List<ItensVenda> produtos) {

    this.produtos = produtos;
    fireTableDataChanged(); // ele remonta a tabela com os novos dados.
}

Faça uso desse método ao invés de instanciar novamente o seu objeto do TableModel.
Vê se dá certo, e nos dê um reply!

Abraços,
fique com Deus! :D

fernandopaiva
Nicolas Fernandes:
Cara, o model da sua tabela deve ser instanciado na hora da CRIAÇÃO da venda. Você criou uma venda. Para isso, você instancia o formulário de venda e instancia o objeto do seu TableModel. Pronto, você não mexe mais nesse objeto. Você quis adicionar uma coleção nova à tabela, certo? Crie um método dentro da sua tabela modificarTabela ou coisa similar, que recebe uma coleção e altera a atual.
public void modificarTabela(List<ItensVenda> produtos) {

    this.produtos = produtos;
    fireTableDataChanged(); // ele remonta a tabela com os novos dados.
}

Faça uso desse método ao invés de instanciar novamente o seu objeto do TableModel.
Vê se dá certo, e nos dê um reply!

Abraços,
fique com Deus! :D

Kramba Nicolas, nem te conto o problema, levei metade do dia procurando o NullPointer e estava na POR**** de um SELECT :-@. Ja havia feito isso q vc propos e num tinha funcionado...Agora achei o problema, affffssss !!! 100% funcionando. SELECT maldito.

obrigado kra.

Criado 3 de março de 2012
Ultima resposta 3 de mar. de 2012
Respostas 5
Participantes 2