[RESOLVIDO]Atualizar valor celula JTable

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

[code]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;
    }
}

}[/code]

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.

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

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

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.

[code] @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;  
     }  
 }  [/code]

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!

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?

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.

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?

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.

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

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).

: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.