Problema ao editar jtable

6 respostas
java
Giovanni_Chrispin

Bom dia, estou tentando editar uma célula de uma coluna, mas ao editar com o valor novo ele retorna para o valor antigo. estou usando as seguintes classes:

classe TableModel:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Model;

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

/**
 *
 * @author Giovanni.Chrispin
 */
public class TableModel extends AbstractTableModel{
    private ArrayList linhas = null;
    private String[] colunas = null;
    
    public TableModel(ArrayList lin, String[] col){
        setLinhas(lin);
        setColunas(col);
    }
        public ArrayList getLinhas(){
            return linhas;
        }
        
        public void setLinhas (ArrayList dados){
            linhas = dados;
        }
        
        public String[] getColunas(){
            return colunas;
        }
        
        public void setColunas (String[] nomes){
            colunas = nomes;
        }
        
        public int getColumnCount(){
            return colunas.length;
        }
        
        public int getRowCount(){
            return linhas.size();
        }
        
        public String getColumnName(int numCol){
            return colunas[numCol];
        }
        
        public Object getValueAt(int numLin, int numCol){
            Object[] linha = (Object[])getLinhas().get(numLin);
            return linha[numCol];
        }
        
        public boolean isCellEditable(int numLin, int numCol){
            return true;
        }
        
}

Metodo para gerar parcelas e preencher jtable:

public void preencherTabela() {

        ArrayList dados = new ArrayList();
        String[] colunas = new String[]{"ID", "DATA", "VALOR"};

        String data = jFormattedTextField_data.getText();
        String dia, mes, ano;
        dia = "" + data.charAt(0) + data.charAt(1) + "/";
        mes = "" + data.charAt(3) + data.charAt(4);
        ano = "/" + data.charAt(6) + data.charAt(7) + data.charAt(8) + data.charAt(9);
        int anoInt = Integer.parseInt("" + data.charAt(6) + data.charAt(7) + data.charAt(8) + data.charAt(9));
        int mesInt = Integer.parseInt(mes);

        while (i <= quantidadeParcela) {
            if (mesInt < 10) {
                dados.add(new Object[]{i, dia + "0" + mesInt + "/" + anoInt, nf.format(valorParcela)});
            } else {
                dados.add(new Object[]{i, dia + mesInt + "/" + anoInt, nf.format(valorParcela)});
            }
            mesInt++;

            if (mesInt > 12) {
                anoInt++;
                mesInt = 1;
            }
            i++;
            cont++;
        }

        TableModel modelo = new TableModel(dados, colunas);
        jTable_parcelas.setModel(modelo);
        jTable_parcelas.getColumnModel().getColumn(0).setPreferredWidth(50);
        jTable_parcelas.getColumnModel().getColumn(0).setResizable(false);
        jTable_parcelas.getColumnModel().getColumn(1).setPreferredWidth(200);
        jTable_parcelas.getColumnModel().getColumn(1).setResizable(false);
        jTable_parcelas.getColumnModel().getColumn(2).setPreferredWidth(180);
        jTable_parcelas.getColumnModel().getColumn(2).setResizable(false);

        jTable_parcelas.getTableHeader().setReorderingAllowed(false);
        jTable_parcelas.setAutoResizeMode(jTable_parcelas.AUTO_RESIZE_OFF);

        jTable_parcelas.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    }

6 Respostas

Rodrigo_Void

Ola
precisa implementar o método abaixo no seu TableModel:

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

    }
Giovanni_Chrispin

Ok, Depois como faço para poder usa-lo?

Rodrigo_Void

Vc n chama ele diretamente. A JTable chama ele.
Vc só precisa ter ali implementado sua logica para salvar os novos valores, do contrário se perdem.

Pelo que vi, seus dados ficam na lista LINHAS. No metodo getValueAt é retornado o valor desta lista. Se no setValueAt vc não alterar o respectivo valor nesta lista, logo sempre mostrará o valor antigo.

Para que funcione é muito parecido com o getValueAt. Só precisa pegar o objeto referente a linha e a coluna, mas ao invés de retornar, vc altera o valor na lista.

Giovanni_Chrispin

Entendi, se tiver algum exemplo para me passar para ficar mais claro eu agradeceria, como sou novo na área de programação ainda estou aprendendo. Mas vou tentar fazer algo aqui, obrigado.

Giovanni_Chrispin

Tentei fazer o seguinte no forma da minha tabela:

'private void jTable_parcelasMouseClicked(java.awt.event.MouseEvent evt) {

String data = (String) jTable_parcelas.getValueAt(jTable_parcelas.getSelectedRow(), 1);

jTable_parcelas.setValueAt(data, jTable_parcelas.getSelectedRow(), jTable_parcelas.getSelectedColumn());

} 

metodo no tableModel:

public void setValueAt(Object aValue, int numLin, int numCol) {

Object[] linha = (Object[])getLinhas().get(numLin);



}
Giovanni_Chrispin

Alguém para ajudar?

Criado 23 de janeiro de 2017
Ultima resposta 13 de fev. de 2017
Respostas 6
Participantes 2