Adicionar Row AbstractTableModel!

3 respostas
A

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:

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> itensPedido;

     //Esse é um construtor, que recebe a nossa lista de livros
     public pedidoTableModel (List<ItensPedido> itensPedido) {
           this.itensPedido = new ArrayList<ItensPedido>(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. :)
     //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<ItensPedido> getProdutos() {
        return Collections.unmodifiableList(itensPedido);
     }
}

3 Respostas

ViniGodoy

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.

E

Resolva seus problemas com Glazed Lists:

http://publicobject.com/glazedlists/

Em particular, estude a classe WritableTableFormat.

A

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

Criado 10 de junho de 2010
Ultima resposta 10 de jun. de 2010
Respostas 3
Participantes 3