[RESOLVIDO] AbstractTableModel

Boa noite,

Pessoal, criei um AbstractTableModel no qual possui um ArrayList que corresponde as linhas da minha JTable, então quando adiciono a primeira linha ele aparece lá bonitinho na visão, mas quando adiciono da segunda linha em diante ele adiciona a nova linha, mas infelizmente atualiza todo o restante das linhas anteriores para valor da última linha que acabei inserir. Eu já debuguei o projeto e no Arraylist de fato não fica valor duplicado, é apenas a exibição da JTable que fica com esse problema.
Exemplo:
A primeira vez inseri o usuário MARCELO e apareceu lá na tabela normal.
A segunda fez inseri o usuário JOÃO no qual inseriu uma nova linha, mas também sobrescreveu o usuário MARCELO para JOÃO, ou seja, ficou dois JOÃO. E se eu adicionar um terceiro usuário ele insere uma nova linha com o novo usuário, mas sobrescreve todos os anteriores para o último usuário inserido e assim sucessivamente nas inserções posteriores. Ao%20adicionar%20a%20terceira%20linha

public class TableModelUsuario extends AbstractTableModel {

private List<Usuario> listaUsuarios;
private List<String> colunas;

public TableModelUsuario(List<Usuario> usuarios) {
    listaUsuarios  = new ArrayList<Usuario>(usuarios);
    colunas = Arrays.asList("NOME", "LOGIN", "PERFIL");
}

public String getColumnName(int coluna) {
    return colunas.get(coluna);
}

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

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

@Override
public Object getValueAt(int rowIndex, int columnIndex) {

    switch (columnIndex) {
        case 0:
            return listaUsuarios.get(rowIndex).getNome();
        case 1:
            return listaUsuarios.get(rowIndex).getLogin();
        case 2:
            return listaUsuarios.get(rowIndex).getPerfil();

    }
    return null;
}

public void setValueAt(Usuario usuario, int rowIndex, int columnIndex) {

    switch (columnIndex) {
        case 0:
            listaUsuarios.get(rowIndex).setNome(usuario.getNome());
        case 1:
            listaUsuarios.get(rowIndex).setLogin(usuario.getLogin());
        case 2:
            listaUsuarios.get(rowIndex).setPerfil(usuario.getPerfil());
    }
    this.fireTableDataChanged();
}

public Usuario getUsuario(int i) {
    return listaUsuarios.get(i);
}

public List<Usuario> getUsuarios() {
    return listaUsuarios;        
}


public void adicionarUm(Usuario usuario) {
    listaUsuarios.add(usuario);
    fireTableRowsInserted(listaUsuarios.size(), listaUsuarios.size());
}

}

Posta o código onde você adiciona ítens à esse List.

Provavelmente quando você preenche seu ArrayList, você não está criando um novo objeto a cada vez que acrescenta uma linha no seu List. Daí ele pega o mesmo objeto e muda os dados dele. Isso tava acontecendo comigo. Se você está fazendo um programa desse jeito, provavelmente está usando a arquitetura MVC. Daí dentro do seu método que você preenche seu model, você coloca a criação do objeto do Model dentro dele. Daí toda vez que o método é invocado, criará um novo objeto. Assim, ele não substituirá os dados da sua List.

Forma que não substituirá sua List toda com o último dado que você lançou:

List <SuaClasse> suaLista = new ArrayList <> ();

 public void insereDados(int conta, String nome, double saldo, double limite) {

    SeuModel modelo = new SeuModel();  // Criando um objeto dentro do método.

    modelo.setConta(conta);
    modelo.setNome(nome);
    modelo.setSaldo(saldo);
    modelo.setLimite(limite);
    suaLista.add(modelo);
    
}

Agora a forma que creio que você deve estar fazendo, criando o objeto fora do método. Assim, o mesmo objeto vai sendo mudado, causando esse “bug” na sua List:

List <SeuModel> suaLista = new ArrayList <> ();
SeuModel modelo = new SeuModel();  // Criando fora do método.

 public void insereDados(int conta, String nome, double saldo, double limite) {

    modelo.setConta(conta);
    modelo.setNome(nome);
    modelo.setSaldo(saldo);
    modelo.setLimite(limite);
    suaLista.add(modelo);
    
}
1 curtida

Smatt, pelo visto você passou pelo mesmo problema. Deu certo sim! Obrigado.

1 curtida

staroski, obrigado também pela atenção.