TableModel bugado

1 resposta
guisantogui

E ai galera, to com mais uma bronca com um tableModel que eu fiz aqui, básicamente à medida que eu insiro itens nesse tableModel ele altera os valores de algumas colunas automaticamente, já depurei, mas não rolou de eu achar a resposta, segue o código do evento e do TableModel:

TableModel:
public class ProdutoNFETableModel extends AbstractTableModel {

    public static final String[] COLUNAS = {"Código","Nome","Descricao","Quantidade","Preço", "Unidade"};
    private List<Produto> dados;

    public ProdutoNFETableModel(){
        dados = new ArrayList<Produto>();
    }

    public ProdutoNFETableModel(List<Produto> ls){
        if(ls == null){
            dados = new ArrayList<Produto>();
        }else{
            dados = ls;
        }
    }

    public void addRow(Produto p){
        dados.add(p);
        fireTableRowsInserted(dados.size()-1, dados.size()-1);
    }

    public void removeRow(Produto p){
        dados.remove(p);
        fireTableRowsDeleted(dados.indexOf(p), dados.indexOf(p));
    }

    public void removeRow(int i){
        dados.remove(i);
        fireTableRowsDeleted(i, i);
    }

    public int getRowCount() {
        return dados.size();
    }

    @Override
    public Class<?> getColumnClass(int columnIndex){
        switch(columnIndex){
            case 0: return Integer.class;
            case 1: return String.class;
            case 2: return String.class;
            case 3: return Integer.class;
            case 4: return Double.class;
            case 5: return String.class;
            default: throw new IndexOutOfBoundsException("Opção não encontrada");
        }
    }

    public int getColumnCount() {
        return COLUNAS.length;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        Produto produto = dados.get(rowIndex);
        switch(columnIndex){
            case 0: return produto.getId();
            case 1: return produto.getNomeProd();
            case 2: return produto.getDescricao();
            case 3: return produto.getQuantidade();
            case 4: return produto.getPreco();
            case 5: return produto.getUnidade();
            default: throw new IndexOutOfBoundsException("Opção não encontrada");
        }
    }

    public Produto getProduto(int row){
        if(row < dados.size()){
            return dados.get(row);
        }
        else{
            throw new IndexOutOfBoundsException("Numero maior que o tamanho da lista");
        }
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex){
        return false;
    }

    @Override
    public String getColumnName(int column){
        return COLUNAS[column];
    }

     public void setDados(List<Produto> ls){
        dados = ls;
        fireTableDataChanged();
    }
}

Evento, aliás o problema só ocorre quando eu adiciono alguém na tabela, a exclusão ta ok:
Mais uma coisa, vocês vão notar duas tabelas pois estão sendo adicionadas a partir de outra tabela, e quando é clicado o botão a tabela "nova" adiciona.

if(tabTodosProdutos.getSelectedRow() < 0){
            JOptionPane.showMessageDialog(this, "Selecione um registro antes de alterá-lo");
        }
        ProdutoNFETableModel pNfeTableModel = (ProdutoNFETableModel) tabelaProdutos.getModel();
        ProdutoTableModel ptm = (ProdutoTableModel) tabTodosProdutos.getModel();

        Produto p = ptm.getProduto(tabTodosProdutos.getSelectedRow());

        String quant = JOptionPane.showInputDialog(this, "Digite a quantidade de itens para esse produto.");
        String val = JOptionPane.showInputDialog(this, "Digite o valor para esse produto");

        try{
            p.setPreco(Double.parseDouble(val));
            p.setQuantidade(Integer.parseInt(quant));
        }
        catch(NumberFormatException nfe){
            JOptionPane.showMessageDialog(this, "Valor não aceito");
            return;
        }

        String unidade = JOptionPane.showInputDialog(this, "Digite a unidade para este produto");

        if(unidade.equalsIgnoreCase("KG")){
            p.setUnidade(unidade);
        }
        else if(unidade.equalsIgnoreCase("CX")){
             p.setUnidade(unidade);
        }
        else if(unidade.equalsIgnoreCase("SC")){
             p.setUnidade(unidade);
        }
        else{
            JOptionPane.showMessageDialog(this, "Unidade inválida");
            return;
        }

        pNfeTableModel.addRow(p);
}

1 Resposta

javer
Altere esse método para:
public void addRow(Produto p){  
        dados.add(p);  
        fireTableDataChanged(); // Pra mim isso é suficiente em todas as alterações na lista do modelo
    }

Outra dica, não faça cast do modelo para uma varíavel, deixe o modelo acessível na classe:

Isso:
ProdutoNFETableModel pNfeTableModel = (ProdutoNFETableModel) tabelaProdutos.getModel();  
ProdutoTableModel ptm = (ProdutoTableModel) tabTodosProdutos.getModel();
Deixe assim:
// nas declarações...
ProdutoNFETableModel modeloProdutoTabela1;
ProdutoTableModel  modeloProdutoTabela2;
...
// Quando iniciar a classe
modeloProdutoTabela1 = new ProdutoNFETableModel();
modeloProdutoTabela2 = new ProdutoTableModel();
...
// Quando a lista que vai para o modelo estiver pronta passe ela para o modelo
// supondo que vc criou um metodo para fazer isso.
modeloProdutoTabela1.setLista(new ArrayList<Produto>());
modeloProdutoTabela2.setLista(new ArrayList<Produto>());

...
// Quando for pegar o produto da linha selecionada
Produto p = modeloProdutoTabela2.getProduto(tabTodosProdutos.getSelectedRow());
Método para passar a lista completa para o modelo:
public void setLista(ArrayList<Produto> dados) {
        this.dados = dados == null ? new ArrayList<Produto>() : dados;
        fireTableDataChanged();
    }
Criado 5 de abril de 2011
Ultima resposta 6 de abr. de 2011
Respostas 1
Participantes 2