O código grava corretamente o item na tabela sql mas devolve na de visualização em lugar errado

O código abaixo é uma gravação de alteração de item de pedido, parece que a alteração na tabela sql está ok mas na tabela de visualização ele repete uma linha. Não sei porque. Se alguém puder apontar o erro eu agradeço. Veja o código:

        btAlterar2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Double quantidade = util.spaceToDouble(tfQuantidade.getText());
                if(quantidade <= 0) {
                    JOptionPane.showMessageDialog(null, "Quantidade não pode ser zero!");
                    tfQuantidade.requestFocus();
                    return;
                }
                Double preco = util.spaceToDouble(tfPreco.getText());
                if(preco <= 0) {
                    JOptionPane.showMessageDialog(null, "Preço não pode ser zero!");
                    tfPreco.requestFocus();
                    return;
                }
                
                if(!pedidosDAO.localizarProduto(tfId_produto.getText())) {
                    JOptionPane.showMessageDialog(null, "Produto não cadastrado!");
                    tfId_produto.requestFocus();
                    return;
                } 
                
                pedidosDAO.itemPedidoClienteEstendida = new ItensPedidoClienteEstendida();
                
                pedidosDAO.itemPedidoClienteEstendida.setId_pedido_cli(pedidosDAO.pedidoCliente.getId());
                pedidosDAO.itemPedidoClienteEstendida.setId(Integer.parseInt(tfId_item.getText()));
                pedidosDAO.itemPedidoClienteEstendida.setId_produto(tfId_produto.getText());
                pedidosDAO.itemPedidoClienteEstendida.setQuantidade(quantidade);
                pedidosDAO.itemPedidoClienteEstendida.setPreco(preco);
                pedidosDAO.itemPedidoClienteEstendida.setDescricao_produto(pedidosDAO.produto.getDescricao());
                
                if(!pedidosDAO.alterar2()) {
                    JOptionPane.showMessageDialog(null, "Erro ao gravar alteração!");
                } else {
                    listaItens.get(linha).setId_produto(
                            pedidosDAO.itemPedidoClienteEstendida.getId_produto());
                    listaItens.get(linha).setQuantidade(
                            pedidosDAO.itemPedidoClienteEstendida.getQuantidade());
                    listaItens.get(linha).setPreco(
                            pedidosDAO.itemPedidoClienteEstendida.getPreco());
                    listaItens.get(linha).setDescricao_produto(pedidosDAO.produto.getDescricao());
                    
                    tableModel.setNumRows(0);
                    for(int i = 0; i < listaItens.size(); i++ ) {
                        tableModel.addRow(new Object[] {
                            listaItens.get(i).getId(),
                            listaItens.get(i).getId_produto(),
                            listaItens.get(i).getDescricao_produto(),
                            listaItens.get(i).getQuantidade(),
                            listaItens.get(i).getPreco(),
                            listaItens.get(i).getQuantidade() * listaItens.get(i).getPreco()
                        });
                    }
                    limparCamposItem();
                    //btNovo2, btGravar2, btAlterar2, btExcluir2, btLimpar2
                    setBotoesItem(true, false, false, false, false);
                    setTFPedido(true);
                    setTFItem(false, false);
                }
                return;
            }
        });

Pessoal, pode fazer pergunta e pedir outros trechos de código, a gente dialoga.
Atenciosamente,
Ronaldo

Não se entendi muito bem seu problema “repete uma linha” tente ser um pouco mais específico, se o problema for uma linha em branco talvez posso ser o default da tabela então vc pode setar o número de rows para 0.
setrows(0)

1 curtida

No começo da exibição eu seto o número de linhas da tabela para zero. Mas ele repete uma linha com dados e não em branco quando eu mando exibir novamente os itens. É um erro estranho.

Ele não está repetindo uma linha de dados, é você que está alterando um item existente para ficar com o mesmo conteúdo do item atual, olha só:

// DAQUI
        pedidosDAO.itemPedidoClienteEstendida.setId_pedido_cli(pedidosDAO.pedidoCliente.getId());
        pedidosDAO.itemPedidoClienteEstendida.setId(Integer.parseInt(tfId_item.getText()));
        pedidosDAO.itemPedidoClienteEstendida.setId_produto(tfId_produto.getText());
        pedidosDAO.itemPedidoClienteEstendida.setQuantidade(quantidade);
        pedidosDAO.itemPedidoClienteEstendida.setPreco(preco);
        pedidosDAO.itemPedidoClienteEstendida.setDescricao_produto(pedidosDAO.produto.getDescricao());
// ATÉ AQUI você setou as informações do novo item

        if(!pedidosDAO.alterar2()) {
            JOptionPane.showMessageDialog(null, "Erro ao gravar alteração!");
        } else {
// DAQUI
            listaItens.get(linha).setId_produto(pedidosDAO.itemPedidoClienteEstendida.getId_produto());
            listaItens.get(linha).setQuantidade(pedidosDAO.itemPedidoClienteEstendida.getQuantidade());
            listaItens.get(linha).setPreco(pedidosDAO.itemPedidoClienteEstendida.getPreco());
            listaItens.get(linha).setDescricao_produto(pedidosDAO.produto.getDescricao());
// ATÉ AQUI você alterou o item na posição 'linha' para ter as mesmas informações do novo item, tá errado

Na verdade tem tanta coisa errada no seu código mas você não acredita quando falamos, então infelizmente vai acabar batendo a cabeça tentando resolver do jeito errado.

Você não está programando de forma orientada a objetos, você até criou algumas classes mas elas não se relacionam e os objetos delas não trocam mensagens entre si.

A sua classe de pedido nem tem uma lista de itens, no seu código o pedido é uma coisa e os itens são outra completamente independentes, tá errado, o pedido deveria ter uma lista com os seus itens.

Você criou uma classe PedidosDAO que deveria ter a única responsabilidade de ler e gravar objetos pedido na tabela do banco de dados, ao invés disso ela faz de tudo e o pior ela ainda mantem um atributo público que é o item de pedido, isso não faz o menor sentido.

Você não deveria usar DefaultTableModel pois ele é só um facilitador para preencher uma JTable com conteúdo estático, um sistema de cadastros não é algo estático, o conteúdo varia.
Em diversos lugares do seu sistema você fica removendo e adicionando itens ao DefaultTableModel, além de ser uma operação lenta, tá errado.
Você deveria criar o seu próprio TableModel para renderizar a lista de itens do seu pedido, se você fizesse dessa forma, a partir do momento que um novo item é adicionado ao seu pedido, o conteúdo da JTable estaria “automaticamente” atualizado.

Você deveria urgentemente dar uma pausa nessa programação orientada a tentativa e erro e realmente estudar os conceitos de programação orientada a objetos, senão vai ficar cada vez mais difícil.

  • Aprenda a diferença entre classe e objeto.
  • Aprenda a usar corretamente variáveis de instância, variáveis locais e variáveis de classe, você costuma usar somente variáveis de instância, parece ter medo de usar variáveis locais.
  • Aprenda como funcionam as referências e também a passagem de parâmetros.
  • Aprenda o que é agregação e composição.
  • Aprenda como funciona a troca de mensagens entre objetos, pois é algo que você sempre erra e tenta resolver com static e está errado.

Não adianta tapar o sol com a peneira, há meses você diz que essa tela de pedidos está quase finalizada, mas obviamente não está, pois a cada funcionalidade nova você se enrola no meio de tanto macarrão de código e isso só acontece porque você não entendeu os conceitos e não modelou as classes antes de começar a programar.

4 curtidas

Certo, Staroski. Você tem toda razão, mas não tenho material didático que possa me ensinar JTable. Tenho alguns livros que já lí mas não são um manual de referência e mesmo que fossem não estariam com o conteúdo didaticamente disposto. Com relação a ter uma lista de itens, eu tenho. Pois listaItens é uma lista de itens de pedido. Eu vou fazer uma pausa no desenvolvimento, correto. E vou me dedicar a um curso em video que eu estava fazendo.

Material didático gratuito é o que não falta, por exemplo, documentação oficial da Oracle: How to Use Tables (The Java™ Tutorials > Creating a GUI With Swing > Using Swing Components)

Mas sua dificuldade não é a JTable, e sim os conceitos de POO.
Como você ainda não entendeu os conceitos de classe e objeto e como trocam mensagens entre si, então obviamente também não compreende como funciona o polimorfismo nem o conceito de interface, por isso tem dificuldade em entender os códigos que te mostramos.

Sim, você tem uma variável listaItens, mas ela é um atributo da sua tela GuiPedidoCliente, isso está errado.

Seu GuiPedidoCliente possui a listaItens e seu PedidosClienteDAO possui o pedidoCliente, percebe que está tudo espalhado e que não faz sentido?

A lista de itens deveria ser um atributo do próprio pedido.
Os itens pertencem à quem? Ao pedido!
Então é uma relação de composição, não existe um pedido sem itens.

A tela deveria simplesmente “conversar” com um objeto de uma classe controladora.

A classe controladora manteria a instância do pedido sendo atualmente manipulado e as instâncias dos DAOs necessários.

Suas classes DAO deveriam simplesmente ter os métodos para leitura e gravação dos objetos na base de dados e não manter atributos do pedido e item de pedido em memória.

Tenho acompanhado que o programador anyblueangel3 tem realizado muitas postagens de duvidas e tem recebido muita ajuda dos companheiros, entre eles as orientações do staroski.

Penso que o que precisa mesmo é ver um sisteminha simples com todos os conceitos implementados da melhor forma possível e a partir dai seguir.

Pena que não tô em condições de fazer isso agora, senão faria.

Sozinho e apenas com fragmentações de códigos é muito difícil.

Com Swing a gente consegue dar nó em pingo de água, mas é mais complexo em termos de implementação. No entanto todas as vezes que precisei ver o fonte dele, foram uma verdadeira aula de POO, é bem feito e melhor programado que o JavaFX.

Com JavaFX que nem nessa pauta está, isso tudo é muito mais fácil.

Mas é claro que precisa conhecer os conceitos de POO.

1 curtida