JTable retorna o valor ao perder o foco

O erro é basicamente esse, eu altero um valor da JTable mas quando a célula perde o foco o valor volta ao anterior. Não mudei em quase nada os códigos das tabelas, só sobrescrevi o método isCellEditable para true em todas as células.

Ps: Caso necessite de algum trecho do código, é só falar.

Ps2: Não estou usando DefaultTableModel.

Alguém pode me ajudar?

Como está implementado o método setValueAt do seu TableModel? É ele que confirma as modificações.

Desse jeito:

@Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        dom_ins c = getLinhas().get(rowIndex);
        switch (columnIndex) {
            case (0):
                return c.getLim_ins();
            case (1):
                return c.getAli_ins();
            default:
                throw new IndexOutOfBoundsException("Número da coluna inválido.");
        }
    }

Esse método confirma as modificações mesmo depois de definir o TableModel na JTable?

Ah sim! SETValueAt… Foi mal, me confundi

Esse método eu não sobrescrevi, deixei do jeito que veio do AbstractTableModel, que ta vazio…

public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
}

Como ele deve ficar?

Deve ser mais ou menos assim:

@Override public Object setValueAt(Object value, int row, int col) { dom_ins c = getLinhas().get(row); switch (columnIndex) { case (0): return c.setLim_ins(value.toString()); case (1): return c.setAli_ins(value.toString()); default: throw new IndexOutOfBoundsException("Número da coluna inválido."); } }

Observe que no get vc retorna os valores do objeto, e no set vc altera o objeto dentro do seu model. De modo que dentro do seu model sempre haverá uma lista atualizada dos objetos.

Caso queira descartar uma alteração, por exemplo, para negar um valor inválido, simplesmente não altere o objeto. Como vc mesmo viu, a JTable irá redesenhar o valor antigo, indicando que a alteração não foi realizada.

Nossa! Muito obrigado, consegui resolver finalmente, e é muito bom saber que o model tem a lista do que ta na tabela atualizada, pois assim eu posso fazer as gravações com os valores dele e não da tabela como eu fazia antes(Ficava um código terrivelmente grande).

Mas o meu setValueAt ficou desse jeito:

    @Override
    public void setValueAt(Object value, int row, int col) {  
        dom_ins c = getLinhas().get(row);  
        switch (col) {
            case (0):  
                c.setLim_ins((Float)value);  
            case (1):  
                c.setAli_ins((Float)value);
            default:  
                throw new IndexOutOfBoundsException("Número da coluna inválido.");  
        }  
    } 

Com método de retorno void, igual ao do AbstractTableModel para poder sobrescrever, e mudei os parâmetros para Float, só isso. Vou deixar aqui pra que se alguem tiver a mesma dúvida algum dia…

À propósito, ficou com uma coisinha esquisita, para não abrir outro tópico, vou postar logo aqui:

Quando eu edito o valor e teclo enter (ou clico fora) não acontece nada, continua na edição da célula(e enquanto ta na edição não é possível alterar valores da mesma tabela), mas se eu teclo Enter e depois Esc, sai da edição com o valor alterado certinho, porque isso?