Não repetir dados na Jtable

9 respostas
swingjava
J

Bom dia galera, já sou programador a algum tempo mais uma questão do Jtable vem me tirando a paciência, alguém sabe como acumular item na mesma linha. Abaixo tem um bom exemplo

O item 10117 e 10126 e outros, deveriam somar e não repetir
Exemplo:
COD - PRODUTO QTDE
10117 - GRACE LA ROSE SUBLIME - 3

9 Respostas

J

A ideia é simples!
Antes de adicionar um item na JTable, basta percorre-la procurando se o ID do produto em questão já existe, caso exista some a quantidade, caso contrário insira uma nova linha.

D

Esses dados vem de uma Query? Vem de onde?
Se for de uma Query um group by e sum deve resolver isso.

J

Os dados da tabela são inseridos conforme o codigo abaixo:

private void atualizaTabela() {
    ProdutoBD produtoBD = new ProdutoBD();
    int numeroLinhas = tblItensVenda.getRowCount();
    for (int i = 0; i < numeroLinhas; i++) {
        tableModel.removeRow(0);
        listProduto = produtoBD.consultaProduto();
    }

    int totalTeste = 0;
    //int desconto = 0;
   //double total = 0.0;

    //Double valorDesconto = 0.0;
    for (int i = 0; i < itensVenda.size(); i++) {
        

        tableModel.insertRow(i, new Object[]{
            itensVenda.get(i).getProduto().getCodigoProduto(),//ID PRODUTO
            itensVenda.get(i).getProduto().getNome(),//NOME PRODUTO
            itensVenda.get(i).getQtde(),// QTDE PRODUTO
        //itensVenda.get(i).getProduto().getValor(),//VALOR PRODUTO
        //itensVenda.get(i).getProduto().getValor() * itensVenda.get(i).getQtde(),//VALOR BRUTO TOTAL DE PRODUTOS
        });
        totalTeste += itensVenda.get(i).getQtde();
        total = 0.0;
        //desconto += (Integer)ftfVDescDinheiro.getValue();
        //valorDesconto += itensVenda.get(i).getProduto().getValor() * itensVenda.get(i).getQtde() / desconto;
        //valorTotal += itensVenda.get(i).getProduto().getValor() * itensVenda.get(i).getQtde();

    }
    ftfTotal.setValue(totalTeste);
    //valorTotal = totalTeste;
}
J

Os dados vem de um list de Objetos

D

Que seria este atributo itensVenda?
E esta List vem de uma Query? Como ela é preenchida com os Produtos?

J

Sim isso mesmo Depois da busca do produto conforme codigo abaixo:

private void buscaProduto() {

ProdutoBD produtoBD = new ProdutoBD();

String id_busca = txtIdProduto.getText();

listProduto = produtoBD.consultaProdutoBarra(id_busca);

int binario = 0;

try {

int max = listProduto.size();

//String id_busca = txtIdProduto.getText();

//int id_busca = Integer.parseInt(txtIdProduto.getText());

//Percorre a lista

if (listProduto.get(0).getCodigoBarra() != null) {

if (listProduto.get(0).getCodigoBarra().equals(id_busca)) {

setProduto(listProduto.get(0));

IncluirNaTabela();

binario = 1;

} else if (listProduto.get(0).getCodigoProduto().equals(id_busca)) {

setProduto(listProduto.get(0));

IncluirNaTabela();

binario = 1;

}

} else if (listProduto.get(0).getCodigoProduto().equals(id_busca)) {

setProduto(listProduto.get(0));

IncluirNaTabela();

binario = 1;

}
if (binario == 0) {
            JOptionPane.showMessageDialog(this, "Produto não existe", "Produto", JOptionPane.ERROR_MESSAGE);
            txtIdProduto.setText(null);
            //txtCodigoProduto.setText("");
            produto = null;
            lbFoto.setIcon(null);
        }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(this, "Erro ao localizar Produto", "Produto", JOptionPane.ERROR_MESSAGE);
        System.out.println("ERRO: " + e);
        e.printStackTrace();
        //produto = null;
        txtIdProduto.setText(null);
        //JOptionPane.showMessageDialog(this, "Digite o ID","ID",JOptionPane.INFORMATION_MESSAGE);
    }
}

O item é incluido no list

private void incluiProduto() {

if (produto == null) {

JOptionPane.showMessageDialog(this, Selecionar o produto!, Erro, JOptionPane.ERROR_MESSAGE);

btnSelecionaProduto.requestFocus();

} else {

ItensVenda item = new ItensVenda();
//new Object();
        item.setProduto(produto);
        item.setQtde(qtde);
        //  item.setDesconto((Integer) ftfDesconto.getValue());
        //item.setValor(produto.getValor());

        itensVenda.add(item);
        atualizaTabela();
        ftfQuantidade.setValue(1);
        //txtCodigoProduto.setText("");
        //ftfQuantidade.setEditable(false);
        //ftfQuantidade.setText("");
        //txtIdProduto.setText("");
        //ftfDesconto.setEditable(false);
        // ftfDesconto.setText("");

        // produto = null;
    }
}
D

Pelo o que eu entendi a table destes ItensVenda neste momento não tem relação com o Database correto? Não dá pra fazer um “Select * from” pra ir populando ela, você está adicionando um a um os Itens pra depois persistir no banco né?
Se for o caso, realmente acho que um workaround pra fazer isso funcionar seria de na hora de adicionar um Item na JTable verificar na List do TableModel se o Item inserido já existe, se sim faz um incremento no atributo quantidade do item já existente (não sei se isso tem um impacto no flow do seu código posteriormente, se você conta os itens da tabela pra inserir, etc) e senão adiciona da mesma forma que está fazendo.

J

Isso mesmo @Daniel95 a query não manda nessa questão de popular minha tabela, tentarei implementar sua idéia

D

Você pode pegar aquela List dos Itens pra comparar se o item já contém na List com o método contains(Object o) de List, ele vai chamar o equals do objeto Item, você pode sobrescrever o método equals dele pra retornar true quando eles tem o mesmo atributo código por exemplo no seu caso, então se na hora de adicionar o contains retornar true você pode pegar este objeto da List e alterar o atributo quantidade dele incrementando em 1 e não adicionando ele novamente na List.

if (itensVenda.contains(item)){
int index = itensVenda.indexOf(item);
item = itensVenda.get(index);
item.setQtde(item.getQtde() + 1);
}

No caso o atributo código está na classe Produto e não Item, já que a List é de Item sobrescrevendo o equals de Produto para retornar true quando tiverem o mesmo código de produto e o equals de Item para retornar true quando tiverem o mesmo Produto (Já foi sobrescrito o equals) deve resolver.

Assim um Item será considerado igual ao outro quando tem o mesmo código de Produto.

Criado 22 de outubro de 2018
Ultima resposta 23 de out. de 2018
Respostas 9
Participantes 3