[RESOLVIDO]Atualizar valor celula JTable

10 respostas
furacao123

Aew galera tenho uma jtable onde apenas uma coluna é possivel entrar com valores numericos por exemplo de quantidade, que ao ser digitado uma quantidade e apertar enter desejo que atualize uma outra celulacom total * qtd implementei o table model e funcionou mas apenas quando seleciono outra linha ele atualiza o valor da celula...segue o table model que implementei

public class SaldoInicialModel extends AbstractTableModel {

    private List<EstoqueMovimentacaoItem> tabela;
    private String[] colunas = {"Código", "Produto", "Local Estoque",
        "Status Estoque", "Saldo", "Valor Unitário", "Valor Total"};
    private Class[] types = new Class[]{
        java.lang.String.class, java.lang.String.class,
        java.lang.String.class, java.lang.String.class, java.lang.String.class,
        java.lang.String.class, java.lang.String.class
    };
    private boolean[] canEdit = new boolean[]{
        false, false, false, false, true, false, false
    };

    public SaldoInicialModel(List<EstoqueMovimentacaoItem> lista) {
        this.tabela = lista;
    }

    @Override
    public int getRowCount() {
        return tabela.size();
    }

    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    @Override
    public Object getValueAt(int row, int col) {

        EstoqueMovimentacaoItem obj = tabela.get(row);

        switch (col) {
            case 0:
                return obj.getProduto().getId();
            case 1:
                return obj.getProduto().getDescricao();
            case 2:
                return obj.getEstoqueMovimentacao().getEstoqueLocal().getDescricao();
            case 3:
                return obj.getEstoqueMovimentacao().getEstoqueStatus().getDescricao();
            case 4:
                return obj.getQtd();
            case 5:
                return ArrangeFields.decimals(obj.getVlunit(), 2, ",");
            case 6:
                return ArrangeFields.decimals(obj.getVlproduto(), 2, ",");
            default:
                return null;
        }
    }

    @Override
    public String getColumnName(int col) {
        return colunas[col];
    }

    @Override
    public Class getColumnClass(int c) {
        return types[c];
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        return canEdit[col];
    }

    @Override
    public void setValueAt(Object aValue, int row, int col) {

        EstoqueMovimentacaoItem obj = tabela.get(row);

        switch (col) {
            case 4:
                if (Double.parseDouble(aValue.toString()) > 0) {
                    obj.setQtd(Double.parseDouble(aValue.toString()));
                    obj.setVlproduto(obj.getVlunit() * obj.getQtd());
                } else {
                    JOptionPane.showMessageDialog(null, "Informe um valor no saldo maior que 0.");
                }
                break;
        }
    }
}

Como eu faço para que ao apertar enter depois de entrar com o valor na celula de edicao ja atualize a celula com o valor * oq eu digitei ao indes de ter de trocar de linha para que isso aconteça?

Obrigado.

10 Respostas

Nicolas_Fernandes

Já pensou em criar um listener que, ao apertar o enter após alterar o valor na célula, chama o setValueAt?

furacao123

Pensei nisso mas gostaria de entender oq ocorre no TableModel para que ele atualize sozinho o valor, pois coloquei esse codigo soh para ver no que dava nao tinha esperança nenhuma que iria atualizar o valor, eu ia fazer com listener para calcular como vc me disse

ViniGodoy

Você precisa lançar o evento com fireTableCellsUpdated ou fireTableRowsUpdated.

fireTableCellUpdated(row, col);

Esse método avisa o JTable que o conteúdo de outra célula também mudou. Pode fazer isso no seu setValueAt.

@Override  
     public void setValueAt(Object aValue, int row, int col) {  
   
         EstoqueMovimentacaoItem obj = tabela.get(row);  
   
         switch (col) {  
             case 4:  
                 if (Double.parseDouble(aValue.toString()) > 0) {  
                     obj.setQtd(Double.parseDouble(aValue.toString()));  
                     obj.setVlproduto(obj.getVlunit() * obj.getQtd());  
                     fireTableCellUpdated(row, COL_VL_PRODUTO); //Avisa que a outra coluna também mudou
                 } else {  
                     JOptionPane.showMessageDialog(null, "Informe um valor no saldo maior que 0.");  
                 }  
                 break;  
         }  
     }

Validação é tarefa do controle e exibir a mensagem de erro da view. Esse tipo de código não deveria estar no seu model!

furacao123

Eu trabalho com View + Handler no View tenho apenas os componentes com metodos get onde no handler eu utilizo, agora no caso o controller creio que estou utilizando um conceito errado, onde o controller apenas faz a ponte com o Service que faz consutas inserts etc e retorna para o Handler que por sua vez popula os componentes da view, agora como eu faria para integrar View e Controller no TableModel?

E o meu conceito de controller esta correto?

ViniGodoy

O controller valida os dados da view e os encaminha para os models corretos.
No caso de aplicações Swing, é comum fazer com que view e controller fiquem na mesma classe.

O que nunca se mistura é view e model, como vc está fazendo.

furacao123

entendi mas no caso como eu faria para jogar as mensagens de erro no handler, por exemplo no setValueAt do tableModel como eu fiz como eu retorno para o Handler disparar e mostrar erro?

ViniGodoy

Se tiver erro, nem sequer deve chegar no tableModel. Você pode disparar um erro na forma de uma exceção, que volta para a view e é exibida.

furacao123

então mas essa validacao ocorre quando faço a edição de uma celula da jTable, entao nao sei como controlar isso no Handler pois quem dispara os eventos eh o TableModel

ViniGodoy

Ah sim, entendi. Nesse caso, o cellEditor poderia fazer isso.
Mas aí até vale manter desse jeito, para simplificar mesmo o código (nem tudo é perfeito).

furacao123

:smiley: mas tranquilo a edição da celula da tabela funcionou balinha havia esquecido do metodo

fireTableCellUpdated(row, col);

obrigado a todos e dou por encerrado esse assunto.

Criado 28 de setembro de 2010
Ultima resposta 28 de set. de 2010
Respostas 10
Participantes 3