Adicionar Row AbstractTableModel!

Olá Pessoal!

Estou tendo um probleminha e queria saber se alguem pode me dar uma ajuda ae!

Tenho um jtable de pedido da qual um vendedor ira digitar os seus produtos e efetuar posteriormente a gravacao do mesmo

quando digito o codigo do produto busco com o JPA no banco e dou um add no meu tablemodelpedido

Ate ae tudo bem aparece o codigo descricao valorunitario quantidade e valor total

o problema é se eu quiser adicionar uma linha em branco para a insercao de uma novo pedido

por exemplo quando eu clicar um VK.DOWN.

Ja tentei com DefaulTableModel mas nao tem como fazer um cast pois a tabela eh AbstractTableModel

Outra coisa tambem é se eu quiser alterar o codigo do produto ja digitado para outro codigo

Se alguem souber ou me dar uma dica de como fazer ou ate mesmo outro jeito mais simples

Obrigado e aguardo respostas

Código pedidoTableModel:

[code]package Frames;

import ConexaoBD.Manager;
import Entidades.ItensPedido;
import Entidades.Produto;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.persistence.EntityManager;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;

/**
*

  • @author Assis
    */
    public class pedidoTableModel extends AbstractTableModel {
    private static final int COL_CODIGO = 0;
    private static final int COL_DESCRICAO = 1;
    private static final int COL_QUANTIDADE = 2;
    private static final int COL_VLRUNITARIO = 3;
    private static final int COL_VLRTOTAL = 4;

    private List itensPedido;

    //Esse é um construtor, que recebe a nossa lista de livros
    public pedidoTableModel (List itensPedido) {
    this.itensPedido = new ArrayList(itensPedido);
    }

    public int getRowCount() {
    //Quantas linhas tem sua tabela? Uma para cada item da lista.
    return itensPedido.size();
    }

    public int getColumnCount() {
    //Quantas colunas tem a tabela? Nesse exemplo, só 2.
    return 5;
    }

    @Override
    public String getColumnName(int column) {
    //Qual é o nome das nossas colunas?
    if (column == COL_CODIGO) return “Produto”;
    if (column == COL_DESCRICAO) return “Descrição”;
    if (column == COL_QUANTIDADE) return “Quant.”;
    if (column == COL_VLRUNITARIO) return “Vlr. Unitário”;
    if (column == COL_VLRTOTAL) return “Vlr. Total”;
    return “”; //Nunca deve ocorrer
    }

    public Object getValueAt(int row, int column) {
    //Precisamos retornar o valor da coluna column e da linha row.
    ItensPedido itemPedido = itensPedido.get(row);
    if (column == COL_CODIGO) return itemPedido.getProduto().getId();
    else if (column == COL_DESCRICAO) return itemPedido.getProduto().getDescricao();
    else if (column == COL_QUANTIDADE) return itemPedido.getQuantidade();
    else if (column == COL_VLRUNITARIO) return itemPedido.getProduto().getPrecoVenda();
    else if (column == COL_VLRTOTAL) return itemPedido.getProduto().getPrecoVenda() * itemPedido.getQuantidade();
    return “”; //Nunca deve ocorrer
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    try {
    if (columnIndex == COL_CODIGO) { }
    if (columnIndex == COL_QUANTIDADE) itensPedido.get(rowIndex).setQuantidade(Integer.parseInt(aValue.toString()));
    if (columnIndex == COL_VLRUNITARIO) itensPedido.get(rowIndex).setValorUnitario(Double.parseDouble(aValue.toString()));
    } catch (Exception e) {
    //Em caso de exceção, deixo o produto inalterado. Isso fará com que os valores antigos sejam desenhados.
    //Pode ocorrer caso o usuário digite uma letra na quantidade, por exemplo.
    }
    }

    @Override
    public Class getColumnClass(int columnIndex) {
    //Qual a classe das nossas colunas?
    //if (columnIndex == COL_CODIGO) return Integer.class;
    // if (columnIndex == COL_DESCRICAO) return String.class;
    //As demais são double
    //return Double.class;
    return String.class;
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    //Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa tabela toda é.
    if (columnIndex == COL_CODIGO) return columnIndex == COL_CODIGO;
    else if (columnIndex == COL_QUANTIDADE) return columnIndex == COL_QUANTIDADE;
    else if (columnIndex == COL_VLRUNITARIO) return columnIndex == COL_VLRUNITARIO;
    return false;
    }

    //Já que esse tableModel é de livros, vamos fazer um get que retorne um livro inteiro.
    //Isso elimina a necessidade de chamar o getValueAt() nas telas.
    public ItensPedido get(int row) {
    return itensPedido.get(row);
    }

    //Já respondemos ao Swing o que ele queria saber. Agora é hora de adicionar métodos para nós mesmo. :slight_smile:
    //Esse método permite adicionar um produto na JTable
    public void add(ItensPedido itemPedido) {
    //Adicionamos o produto
    itensPedido.add(itemPedido);
    //Avisamos a table, para que redesenhe a linha
    fireTableRowsInserted(itensPedido.size()-1, itensPedido.size()-1);
    }

    public void addLinha () {
    }

    public List getProdutos() {
    return Collections.unmodifiableList(itensPedido);
    }
    }[/code]

Esse tipo de implementação não é trivial, pois o JTable não foi feito para se comportar dessa forma. Tentar xunxar com captura de teclas geralmente gera um resultado desajeitado e pouco portável. Especialmente quando o usuário quiser cancelar a edição da linha pressionando ESC.

Você tem algumas soluções. A primeira é deixar seu model editável, e criar um botão inserir que crie uma linha com valores padrões na sua JTable. Aí o usuário altera se quiser.

A segunda, seria criar campos de texto, onde o usuário faria a alteração ou inserção, de acordo com o caso. No caso de usar essa, você ainda tem que decidir se o campo ficará na mesma tela ou num JDialog, que aparecerá assim que o usuário clicar para editar uma linha ou incluir um registro. Eu, particularmente, gosto da opção com a Dialog.

Resolva seus problemas com Glazed Lists:

http://publicobject.com/glazedlists/

Em particular, estude a classe WritableTableFormat.

Dae Vini valeu pela ajuda ae

mas voce poderia me dar um exemplo ou algum codigo, tutorial

para mim conseguir enteder melhor

Se possivel

Muito obrigado