Atualizar célula do JTable

1 resposta
A

Boa tarde pessoal,

estou com um problema em uma tabela que tenho em meu projeto.

Gostaria de quando estivesse entrando com os dados nas células uma determinada coluna fosse atualizando em tempo de execução.
Para isso tenho o seguinte código:

tbDeslocamento.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                
                BigDecimal vlKmIni = null;
                BigDecimal vlKmFim = null;
                BigDecimal vlKmTotal = new BigDecimal("0");
                
                
                if (tbDeslocamento.getModel().getValueAt(tbDeslocamento.getSelectedRow(), 2) != null &&
                        tbDeslocamento.getModel().getValueAt(tbDeslocamento.getSelectedRow(), 3) != null){
                    vlKmIni = new BigDecimal((String)tbDeslocamento.getModel().getValueAt(tbDeslocamento.getSelectedRow(), 2));
                    vlKmFim = new BigDecimal((String)tbDeslocamento.getModel().getValueAt(tbDeslocamento.getSelectedRow(), 3));
                    vlKmTotal = vlKmFim.subtract(vlKmIni);
                    tbDeslocamento.setValueAt(vlKmTotal.toString(), tbDeslocamento.getSelectedRow(), 4);
                } else {
                    tbDeslocamento.setValueAt(vlKmTotal.toString(), tbDeslocamento.getSelectedRow(), 4);
                }
               
            }
        });

Neste os valores que são inseridos nas colunas 2 e 3 são calculados e apresentados na coluna 4.

O código funciona, porém para que ele apresente o resultado tenho que sair da linha que esta sendo editada e depois retornar para ela novamente, ou seja, clicar na linha debaixo e depois clicar nela de novo.

Gostaria de saber como posso fazer para que quando o valor for inserido em uma célula da coluna 3, a célula da coluna 4 da mesma linha seja atualizada.

Desde já agradeço a atenção.

1 Resposta

T

Ao invés de efetuar o cálculo e atualizar a tabela, uma solução é tranferir o cálculo para dentro do modelo da tabela, desta forma não será mais necessário usar o ListSelectionListener.

O cálculo será efetuado dentro do modelo da tabela:

package principal;

import java.math.BigDecimal;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

/**
 *
 */
public class ModeloTabela extends AbstractTableModel{

    private ArrayList dados;
    private String[] colunas = {"Coluna1","Coluna2","(Coluna2 - Coluna1)"};
    
    public ModeloTabela() {
        super();
        dados = new ArrayList();
        dados.add(new LinhaModelo("", "", ""));
        dados.add(new LinhaModelo("", "", ""));
        dados.add(new LinhaModelo("", "", ""));
        dados.add(new LinhaModelo("", "", ""));
        dados.add(new LinhaModelo("", "", ""));
        dados.add(new LinhaModelo("", "", ""));
        dados.add(new LinhaModelo("", "", ""));
        dados.add(new LinhaModelo("", "", ""));
        dados.add(new LinhaModelo("", "", ""));
        dados.add(new LinhaModelo("", "", ""));
    }

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

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        LinhaModelo linha = (LinhaModelo) dados.get(rowIndex);
        
        switch (columnIndex) {
            case 0:
                return linha.getColuna1();
            case 1:
                return linha.getColuna2();
            case 2:
                return linha.getColuna3();
        }
        
        return null;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        LinhaModelo linha = (LinhaModelo) dados.get(rowIndex);
        
        switch (columnIndex) {
            case 0:
                linha.setColuna1(aValue.toString());
                break;
            case 1:
                linha.setColuna2(aValue.toString());
                break;
            case 2:
                linha.setColuna3(aValue.toString());
                break;
        }
        
        BigDecimal vlKmIni = null;
        BigDecimal vlKmFim = null;
        BigDecimal vlKmTotal = new BigDecimal("0");
                
        if (validarNumero(linha.getColuna1())  &&
            validarNumero(linha.getColuna2()) ){
        
            vlKmIni = new BigDecimal(linha.getColuna1().replace(',', '.'));
            vlKmFim = new BigDecimal(linha.getColuna2().replace(',', '.'));
            vlKmTotal = vlKmFim.subtract(vlKmIni);
            linha.setColuna3(vlKmTotal.toString().replace('.', ','));
         } else {
            linha.setColuna3("");                    
         }
         
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        if (columnIndex == 2) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public String getColumnName(int column) {
        return colunas[column];
    }
   
    private boolean validarNumero(String texto) {
        boolean retorno = false;
        
        try {
            BigDecimal numero = new BigDecimal(texto.replace(',', '.'));
            retorno = true;
        } catch (Exception e){
            retorno = false;
        }
                
        return retorno;
    }
    
}
package principal;

/**
 *
 */
public class LinhaModelo {

    private String coluna1;
    private String coluna2;
    private String coluna3;
   
    public LinhaModelo(String coluna1, String coluna2, String coluna3) {
        this.coluna1 = coluna1;
        this.coluna2 = coluna2;
        this.coluna3 = coluna3;        
    }

    /**
     * @return the coluna1
     */
    public String getColuna1() {
        return coluna1;
    }

    /**
     * @param coluna1 the coluna1 to set
     */
    public void setColuna1(String coluna1) {
        this.coluna1 = coluna1;
    }

    /**
     * @return the coluna2
     */
    public String getColuna2() {
        return coluna2;
    }

    /**
     * @param coluna2 the coluna2 to set
     */
    public void setColuna2(String coluna2) {
        this.coluna2 = coluna2;
    }

    /**
     * @return the coluna3
     */
    public String getColuna3() {
        return coluna3;
    }

    /**
     * @param coluna3 the coluna3 to set
     */
    public void setColuna3(String coluna3) {
        this.coluna3 = coluna3;
    }

}

Sendo no seu frame:

modelo = new ModeloTabela();
        tabela.setModel(modelo);


Criado 1 de setembro de 2011
Ultima resposta 11 de out. de 2011
Respostas 1
Participantes 2