Exemplo com ArrayList e AbstractTableModel

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;

 

public class Cliente {

 

 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 java.util.ArrayList;

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

         defaultreturn 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(300200);

         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