Para facilitar a vida a Sun criou o AbstractTableModel. Que é um model que ajuda a montar sua consulta em Grid.
Objeto a ser exibido na grid - o JavaBean
Note que este JavaBean (setters/getters) será usado por partes nos exemplos. Primeiramente vamos apenas definir código e nome no construtor. Ele tem uma propriedade de cada tipo (inteiro, string, date, float e boolean) - vamos exibir todos na JTable formatados devidamente.
import java.util.Date;
private String nome;
private int codigo;
private Date nasc;
private float salario;
private Boolean temCarro;
Cliente() {
}
Cliente(int acodigo, String anome) {
this.codigo = acodigo;
this.nome = anome;
this.nasc = new Date();
this.salario = 0f;
this.temCarro = false;
}
public int getCodigo() {
return codigo;
}
public String getNome() {
return nome;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public void setNome(String nome) {
this.nome = nome;
}
public Date getNasc() {
return nasc;
}
public float getSalario() {
return salario;
}
public Boolean getTemCarro() {
return temCarro;
}
public void setNasc(Date nasc) {
this.nasc = nasc;
}
public void setSalario(float salario) {
this.salario = salario;
}
public void setTemCarro(Boolean temCarro) {
this.temCarro = temCarro;
}
}
Model personalizado
Para montar um JTable precisamos de um Model, faça a herdança do Model da Sun, o AbstractTableModel, que por sua vez implementa a interface TableModel:
import javax.swing.table.AbstractTableModel;
class ClienteModel extends AbstractTableModel {
public static final int COL_CODIGO = 0;
public static final int COL_NOME = 1;
private static final int TOTAL_COLUNAS = 2;
private ArrayList<Cliente> clientes;
private String[] colunas = {"Código", "Nome"};
// já no construtor criamos o arraylist dos dados a serem exibidos
public ClienteModel() {
clientes = new ArrayList<Cliente>();
}
// método para adicionar um objeto no model
public void add(Cliente cliente) {
clientes.add(cliente);
// evento que manda "atualizar" a tela
fireTableRowsInserted(clientes.size()-1,clientes.size()-1);
}
// retorna o numero de colunas
public int getColumnCount() {
return TOTAL_COLUNAS;
}
// retorna o numero de linhas
public int getRowCount() {
return clientes.size();
}
// retorna o nome da coluna (veja a matriz)
public String getColumnName(int col) {
return colunas[col];
}
// retorna o valor (para exibir na tela)
public Object getValueAt(int row, int col) {
switch(col) {
case COL_CODIGO: return String.valueOf(clientes.get(row).getCodigo());
case COL_NOME : return clientes.get(row).getNome();
default: return null;
}
}
// retorna o tipo da classe
public Class getColumnClass(int c) {
return clientes.isEmpty() ? Object.class : String.class; // todas as colunas retornam String
}
// retorna um cliente
public Cliente getCliente(int row) {
return clientes.get(row);
}
// retorna true para colunas editáveis
public boolean isCellEditable(int row, int col) {
return false;
}
}
Exibindo a table com o modelo implementado
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
public class Principal extends JFrame {
private JTable table;
private JScrollPane scroller;
private ClienteModel modelo;
public static void main(String args[]) {
new Principal();
}
// inicializa o frame
Principal() {
super("Exemplo grid");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents();
setSize(300, 200);
setVisible(true);
}
public void initComponents() {
// matriz que conterá os dados
modelo = new ClienteModel();
modelo.add(new Cliente(1, "Junior"));
modelo.add(new Cliente(2, "Flavio"));
modelo.add(new Cliente(3, "Romeu"));
modelo.add(new Cliente(4, "Mandarim"));
// cria tabela com modelo
table = new JTable(modelo);
// só permite selecionar 1 linha por vez
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// coloca table num scroll
scroller = new JScrollPane(table);
// adiciona na tela (frame)
setLayout(new BorderLayout());
getContentPane().add(scroller, BorderLayout.CENTER);
// cria um botão com título "Add"
JButton btAdd = new JButton("Add");
btAdd.addActionListener(new btNovoListener());
JPanel panel = new JPanel();
panel.add(btAdd);
getContentPane().add(panel, BorderLayout.SOUTH);
}
// cria uma classe para adicionar um novo cliente na table
public class btNovoListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String s = JOptionPane.showInputDialog("Digite nome:");
if (!s.equals("")) {
modelo.add(new Cliente(table.getRowCount() + 1, s));
table.setRowSelectionInterval(table.getRowCount()-1, table.getRowCount()-1);
}
}
}
}
Telas

Ao pressionar o botão "Add":

Resultado:

Veja também
•Como formatar valores na JTable