Você está na página 1de 3

Criando um grid em Java com JTable

Autor: Rodrigo Aramburu


01/01/2013

A Classe JTable a classe responsvel por representar um grid no swing, ao meu ver
umas das classes de GUI mais difcil de se trabalhar pela sua flexibilidade. Esta uma
classe que usa o padro MVC(Model , View e Controller):
Model: a classe responsvel por representar os dados da tabela, sempre que iremos
modificar os dados de uma JTable deve ser feito atravs do objeto model que
implementado pela interface TableModel (AbstractTableModel e DefaultTableModel).
View: a apresentao da clula na JTable implementado pela interface CellRenderer,
que atravs de seus mtodos define como seram apresentados os valores.
Controller: a parte que controla os dados e a apresentao, ele representado pela
prpria JTable.
Vejamos agora como criar a mais simples das JTable:
String[] colunas = new String[]{"Nome","Idade","Sexo"};
String[][] dados = new String[][]{
{"Rodrigo","28","Masculino"},
{"Maria","30","Feminino"}
};
JTable tabela = new JTable(dados,colunas);
JScrollPane scroll = new JScrollPane();
scroll.setViewportView(tabela);
this.add(scroll);

Na lina 1 criamos uma array de strings que sero os nomes das colunas e os usaremos
para construir nossaJTable, na linha 3 criamos uma matriz que ser utilizada como dados
da tabela, sendo o primeiro ndice as linhas e o segundo as colunas sendo assim nossa
tabela de exemplo tem 2 linha e 3 colunas. No exemplo utilizamos uma matriz de String,
mas poderia ser uma matriz de Object ou objeto do tipo Vector
Na linha 8 criamos o objeto JTable passando como argumento para o construtor dos
dados e os nomes das colunas, com este construtor ele cria internamente um
objeto DefaultTableModel para armazenar os dados que posteriormente podemos pegar
utilizando o mtodo tabela.getModel().
Na linha 9 criamos um JScrollPane para colocar a tabela dentro atravs do seu mtodo
setViewportView(JTable), ele serve para a tabela possuir uma barra de rolagem e mostrar
os nomes das colunas.
Na linha 11 adicionamos o JScrollPane na janela.
Tambm poderiamos ter criado a mesma tabela atravs do seguinte cdigo:
String[] colunas = new String[]{"Nome","Idade","Sexo"};
String[][] dados = new String[][]{
{"Rodrigo","28","Masculino"},
{"Maria","30","Feminino"}
};
JTable tabela = new JTable();
DefaultTableModel model = new DefaultTableModel(dados , colunas );

tabela.setModel(model);
JScrollPane scroll = new JScrollPane();
scroll.setViewportView(tabela);
this.add(scroll);

Como podemos ver criamos um objeto DefaultTableModel(linha 8), com os dados da


tabela e os nomes das colunas em vez de passar para para o construtor de JTable, e
depois adicionamos o model criado atravs do mtodo setModel, devemos fazer assim
quando quisermos criar nossos prprios models.
Adicionando uma linha:
DefaultTableModel model =

(DefaultTableModel) tabela.getModel();

String[] linha = new String[]{"Joo", "15" , "Masculino"};


model.addRow(linha);

Como vimos, para manipular os dados de um JTable devemos utilizar o objeto model que
ela possui, ento primeiro devemos pegar o model atravs do mtodo getModel(), aps
isto basta criar um array de Strings com os valores correspondentes a cada coluna e
adiciona-lo atravs do mtodo addRow(), do objeto model
Removendo uma linha da tabela
DefaultTableModel model =

(DefaultTableModel) tabela.getModel();

model.removeRow(0);

Para remover uma linha devemos primeiro pegar o model do JTable como antes e depois
chamar o mtodoremoveRow() que recebe como parmetro um inteiro que ser o nmero
da linha que ele deve excluir, lembrando que as linha so contadas iniciando em 0.
Na maior parte dos caso queremos remover um linha do JTable que esta selecionada,
para isso devemos pegar o nmero desta linha.
int linha = tabela.getSelectedRow();
if( linha != -1){
model.removeRow( linha );
}

Como vemos na linha 1, para descobrir qual linha est selecionada utilizamos o
mtodo getSelectedRow() daJTable, que retorna o numero da linha selecionada ou -1 se
no tiver nenhuma linha selecionada.
Bom no adianta nada ter uma tabela se no podemos manipular os valores dela, veremos
abaixo como pegar um valor de uma clula do JTable
int linha = tabela.getSelectedRow();//pegando linha selecionada
String nome = tabela.getValueAt(linha , 0) );
String idade = tabela.getValueAt(linha , 1) );
String sexo = tabela.getValueAt(linha , 2) );

O modo mais fcil de pegar um valor de uma clula de uma JTable atravs do
mtodo getValueAt(int , int), que recebe como primeiro parmetros o nmero da linha e
como segundo o nmero da coluna, lembrando que como as linhas a numerao das
colunas comea em 0.

Para colocar um valor especifico


mtodo setValueAt(Object, int, int):

em

uma

clula

podemos

utilizar

int linha = tabela.getSelectedRow();//pegando linha selecionada


tabela.setValueAt("Nome alterado" , linha , 0);
tabela.setValueAt("0" , linha , 1);
tabela.setValueAt("indefinido" , linha , 2);

Ao utilizar getValueAt(int , int) e setValueAt(Objec , int , int ) voc pode querer percorrer
todas
as
linhas
ou
colunas
da JTable e
para
isso
os
mtodos getRowCount() e getColumnCount() que retornam respectivamente o nmero
de linhas e colunas.
Tambm podemos pegar todos os dados da tabela pegando o objeto Vector que
representa os dados da tabela atravs do mtodo getDataVector()
Iterator iterator = model.getDataVector().iterator();
while ( iterator.hasNext() ) {
Vector row = (Vector) iterator.next();
System.out.println(row.get(0));
System.out.println(row.get(1));
System.out.println(row.get(2));
}

Como vimos na linha 1 pegamos o Vector do model e utilizamos um iterator para percorrer
as linhas, sendo que cada linha tambm armazenada como um Vector, sendo cada um
dos objetos armazenados nele o valor de uma clula. S lembrando, se voc modificar
o Vector retornado pelo mtodo getDateVector() os dados visualizados na JTable sero
modificados.
Esta a maneira mais simples de trabalhar com JTable, para customizarmos mais ela
teremos criar o nosso prprio TableModel e CellRenderer que veremos em prximos
posts, eu espero.
Referncias
http://docs.oracle.com/javase/6/docs/api/javax/swing/JTable.html
http://docs.oracle.com/javase/6/docs/api/javax/swing/table/DefaultTableModel.html

Você também pode gostar