Evite usar DefaultTableModel
, o melhor é criar sua própria model usando AbstractTableModel
, veja um exemplo:
PessoaTableModel
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.table.AbstractTableModel;
public class PessoaTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
public static final int COL_NOME = 0;
public static final int COL_SOBRENOME = 1;
public static final int COL_IDADE = 2;
private static final Map<Integer, String> COLUNAS = new HashMap<>();
static {
COLUNAS.put(COL_NOME, "Nome");
COLUNAS.put(COL_SOBRENOME, "Sobrenome");
COLUNAS.put(COL_IDADE, "Idade");
}
private List<Pessoa> pessoas = new ArrayList<>();
public PessoaTableModel(List<Pessoa> pessoas) {
this.pessoas = pessoas;
}
@Override
public int getRowCount() {
return pessoas.size();
}
@Override
public int getColumnCount() {
return COLUNAS.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Pessoa pessoa = getRowValue(rowIndex);
switch (columnIndex) {
case COL_NOME: return pessoa.getNome();
case COL_SOBRENOME: return pessoa.getSobrenome();
case COL_IDADE: return pessoa.getIdade();
default: return null;
}
}
@Override
public String getColumnName(int columnIndex) {
return COLUNAS.get(columnIndex);
}
public Pessoa getRowValue(int rowIndex) {
return pessoas.get(rowIndex);
}
}
Para usar:
List<Pessoa> pessoas = // carrega a lista de pessoas
PessoaTableModel pessoaTableModel = new PessoaTableModel(pessoas);
JTable tablePessoa = new JTable(pessoaTableModel);
Tem um código que fiz há muito tempo que usa uma forma genérica.
GenericAbstractTableModel
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
public class GenericAbstractTableModel<T> extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private final List<ColumnDef<?>> columns = new ArrayList<>();
private List<T> data = new ArrayList<>();
public GenericAbstractTableModel(List<T> data) {
this.data = data;
}
public <V> void addColumn(String label, Function<T, V> fnValue) {
columns.add(new ColumnDef<V>(label, fnValue));
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public int getColumnCount() {
return columns.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
T rowValue = getRowValue(rowIndex);
return columns.get(columnIndex).fnValue.apply(rowValue);
}
@Override
public String getColumnName(int columnIndex) {
return columns.get(columnIndex).label;
}
public T getRowValue(int rowIndex) {
return data.get(rowIndex);
}
private class ColumnDef<V> {
private final String label;
private final Function<T, V> fnValue;
public ColumnDef(String label, Function<T, V> fnValue) {
this.label = label;
this.fnValue = fnValue;
}
}
@SuppressWarnings("unchecked")
public static <T> GenericAbstractTableModel<T> getModelFrom(JTable table) {
return (GenericAbstractTableModel<T>) table.getModel();
}
}
Para usar:
List<Pessoa> pessoas = new ArrayList<>();
pessoas.add(new Pessoa(1L, "Fulano", "Souza", 15));
pessoas.add(new Pessoa(2L, "Ciclano", "Silva", 18));
pessoas.add(new Pessoa(3L, "Beltrano", "Pereira", 30));
GenericAbstractTableModel<Pessoa> pessoaTableModel = new GenericAbstractTableModel<>(pessoas);
pessoaTableModel.addColumn("Nome", pessoa -> pessoa.getNome());
pessoaTableModel.addColumn("Sobrenome", pessoa -> pessoa.getSobrenome());
pessoaTableModel.addColumn("Idade", pessoa -> pessoa.getIdade());
JTable tablePessoa = new JTable(pessoaTableModel);
A classe Pessoa
usada no exemplo é assim:
Pessoa
public class Pessoa {
private final Long id;
private final String nome;
private final String sobrenome;
private final int idade;
public Pessoa(Long id, String nome, String sobrenome, int idade) {
this.id = id;
this.nome = nome;
this.sobrenome = sobrenome;
this.idade = idade;
}
public Long getId() {
return id;
}
public String getNome() {
return nome;
}
public String getSobrenome() {
return sobrenome;
}
public int getIdade() {
return idade;
}
}