[RESOLVIDO] AbstractTableModel

4 respostas Resolvido
java
Marcelo1995

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());
}

}

4 Respostas

staroski

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

smatt
Solucao aceita

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);
    
}
Marcelo1995

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

Marcelo1995

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

Criado 31 de maio de 2019
Ultima resposta 31 de mai. de 2019
Respostas 4
Participantes 3