Este é o meu primeiro post (aeee...). E vou logo começando com algo que percebo que causa muito nó na cabeça de alguns programadores: Por que não utiliza DefaultTableModel?
Aqui vai a resposta: o código fica confuso e mais difícil de manter; não representa o objeto em si, havendo a necessidade de duplicação de objetos (o objeto propriamente dito, e o que representará na lista); força com que seja apresentado o id (ou algo único que identifique o objeto) dentre vários outros que podemos citar.
Todo os problemas citados acima e até mesmo os que não me lembrei são solucionados quando implementamos nosso próprio TableModel.
Para este exemplo, vamos cria um table com informações de funcionários (nome, idade, departamento, cargo).
Primeiro vamos criar nossa classe Funcionario:
public class Funcionario {
private String nome;
private Integer idade;
private String departamento;
private String cargo;
public Funcionario() {
}
public Funcionario(String nome, Integer idade, String departamento, String cargo) {
this.nome = nome;
this.idade = idade;
this.departamento = departamento;
this.cargo = cargo;
}
public String getCargo() {
return cargo;
}
public void setCargo(String cargo) {
this.cargo = cargo;
}
public String getDepartamento() {
return departamento;
}
public void setDepartamento(String departamento) {
this.departamento = departamento;
}
public Integer getIdade() {
return idade;
}
public void setIdade(Integer idade) {
this.idade = idade;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
private String nome;
private Integer idade;
private String departamento;
private String cargo;
public Funcionario() {
}
public Funcionario(String nome, Integer idade, String departamento, String cargo) {
this.nome = nome;
this.idade = idade;
this.departamento = departamento;
this.cargo = cargo;
}
public String getCargo() {
return cargo;
}
public void setCargo(String cargo) {
this.cargo = cargo;
}
public String getDepartamento() {
return departamento;
}
public void setDepartamento(String departamento) {
this.departamento = departamento;
}
public Integer getIdade() {
return idade;
}
public void setIdade(Integer idade) {
this.idade = idade;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
Vamos ao o que nos interessa de verdade:
import java.util.LinkedList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class FuncionarioTableModel extends AbstractTableModel {
//nome da coluna da table
private final String[] colunas = new String[]{"Nome", "Idade", "Departamento", "Cargo"};
//lista para a manipulacao do objeto
private List<Funcionario> listaFuncionario;
public FuncionarioTableModel() {
listaFuncionario = new LinkedList<Funcionario>();
}
public FuncionarioTableModel(List<Funcionario> listaFuncionario) {
this.listaFuncionario = listaFuncionario;
}
//numero de linhas
public int getRowCount() {
return listaFuncionario.size();
}
//numero de colunas
public int getColumnCount() {
return colunas.length;
}
//define o que cada coluna conterá do objeto
public Object getValueAt(int rowIndex, int columnIndex) {
Funcionario f = listaFuncionario.get(rowIndex);
switch(columnIndex){
case 0:
return f.getNome();
case 1:
return f.getIdade();
case 2:
return f.getDepartamento();
case 3:
return f.getCargo();
default:
return null;
}
}
//determina o nome das colunas
@Override
public String getColumnName(int column) {
return colunas[column];
}
//determina que tipo de objeto cada coluna irá suportar
@Override
public Class<?> getColumnClass(int columnIndex) {
switch(columnIndex){
case 0:
return String.class;
case 1:
return Integer.class;
case 2:
return String.class;
case 3:
return String.class;
default:
return null;
}
}
}
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class FuncionarioTableModel extends AbstractTableModel {
//nome da coluna da table
private final String[] colunas = new String[]{"Nome", "Idade", "Departamento", "Cargo"};
//lista para a manipulacao do objeto
private List<Funcionario> listaFuncionario;
public FuncionarioTableModel() {
listaFuncionario = new LinkedList<Funcionario>();
}
public FuncionarioTableModel(List<Funcionario> listaFuncionario) {
this.listaFuncionario = listaFuncionario;
}
//numero de linhas
public int getRowCount() {
return listaFuncionario.size();
}
//numero de colunas
public int getColumnCount() {
return colunas.length;
}
//define o que cada coluna conterá do objeto
public Object getValueAt(int rowIndex, int columnIndex) {
Funcionario f = listaFuncionario.get(rowIndex);
switch(columnIndex){
case 0:
return f.getNome();
case 1:
return f.getIdade();
case 2:
return f.getDepartamento();
case 3:
return f.getCargo();
default:
return null;
}
}
//determina o nome das colunas
@Override
public String getColumnName(int column) {
return colunas[column];
}
//determina que tipo de objeto cada coluna irá suportar
@Override
public Class<?> getColumnClass(int columnIndex) {
switch(columnIndex){
case 0:
return String.class;
case 1:
return Integer.class;
case 2:
return String.class;
case 3:
return String.class;
default:
return null;
}
}
}
Os métodos descritos acima são os necessários para se criar um TableModel básico. Podemos criar também métodos para adicionar, excluir e editar itens diretamente do table (vamos aprimorar isto no próximo post). Observe que neste método, o modelo irá suportar o próprio objeto Funcionario, o que não iria acontecer seu fosse usado DefaultTableModel.
E para finalizar:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class TableModelTeste extends JFrame {
private JTable tableFuncionario;
private JScrollPane scrollPane;
private List<Funcionario> listaFuncionarios;
public TableModelTeste() {
init();
}
final void init() {
this.setTitle("Exemplo de TableModel");
//populando a lista para inserir no table
this.listaFuncionarios = new LinkedList<Funcionario>();
this.listaFuncionarios.add(new Funcionario("Marlon Meneses", 26, "Centro Tecnologico", "Desenvolvedor"));
this.listaFuncionarios.add(new Funcionario("Fulano Teste", 19, "Centro Tecnologico", "Estagiario"));
this.listaFuncionarios.add(new Funcionario("Siclano Anonimo", 32, "Recepcao", "Auxiliar Administrativo"));
this.listaFuncionarios.add(new Funcionario("Beltrano Nao Sei O Nome", 30, "Centro Tecnologico", "Gerente de Projetos"));
//adicionando no table
this.tableFuncionario = new JTable(new FuncionarioTableModel(this.listaFuncionarios));
this.scrollPane = new JScrollPane(this.tableFuncionario);
this.setLayout(new BorderLayout());
this.add(this.scrollPane);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setLocationRelativeTo(null);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new TableModelTeste().setVisible(true);
}
});
}
}
import java.awt.EventQueue;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class TableModelTeste extends JFrame {
private JTable tableFuncionario;
private JScrollPane scrollPane;
private List<Funcionario> listaFuncionarios;
public TableModelTeste() {
init();
}
final void init() {
this.setTitle("Exemplo de TableModel");
//populando a lista para inserir no table
this.listaFuncionarios = new LinkedList<Funcionario>();
this.listaFuncionarios.add(new Funcionario("Marlon Meneses", 26, "Centro Tecnologico", "Desenvolvedor"));
this.listaFuncionarios.add(new Funcionario("Fulano Teste", 19, "Centro Tecnologico", "Estagiario"));
this.listaFuncionarios.add(new Funcionario("Siclano Anonimo", 32, "Recepcao", "Auxiliar Administrativo"));
this.listaFuncionarios.add(new Funcionario("Beltrano Nao Sei O Nome", 30, "Centro Tecnologico", "Gerente de Projetos"));
//adicionando no table
this.tableFuncionario = new JTable(new FuncionarioTableModel(this.listaFuncionarios));
this.scrollPane = new JScrollPane(this.tableFuncionario);
this.setLayout(new BorderLayout());
this.add(this.scrollPane);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setLocationRelativeTo(null);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new TableModelTeste().setVisible(true);
}
});
}
}
Pronto!
Pode até parecer, mas não é difícil.
No próximo post vamos aprimorar este exemplo.
Até a próxima
Ótimo trabalho !
ResponderExcluir