Boteco Digital

Criando um grid em Java com JTable

A Classe JTable é a classe responsável por representar um grid no swing, ao meu ver é umas das classes de GUI mais difícil de se trabalhar pela sua flexibilidade. Esta é uma classe que usa o padrão MVC(Model , View e Controller):

Model: é a classe responsável por representar os dados da tabela, sempre que iremos modificar os dados de uma JTable deve ser feito através do objeto model que é implementado pela interface TableModel ( AbstractTableModel e DefaultTableModel).

View: É a apresentação da célula na JTable é implementado pela interface CellRenderer, que através de seus métodos define como seram apresentados os valores.

Controller: é a parte que controla os dados e a apresentação, ele é representado pela própria 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 serão os nomes das colunas e os usaremos para construir nossa JTable, 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 método tabela.getModel().

Na linha 9 criamos um JScrollPane para colocar a tabela dentro através do seu método 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.

Também poderiamos ter criado a mesma tabela através do seguinte código:

	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 através do método setModel, devemos fazer assim quando quisermos criar nossos próprios models.

Adicionando uma linha:

DefaultTableModel model =  (DefaultTableModel) tabela.getModel();

String[] linha = new String[]{"João", "15" , "Masculino"};
model.addRow(linha);

Como vimos, para manipular os dados de um JTable devemos utilizar o objeto model que ela possui, então primeiro devemos pegar o model através do método getModel(), após isto basta criar um array de Strings com os valores correspondentes a cada coluna e adiciona-lo através do método 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 método removeRow() que recebe como parâmetro um inteiro que será o número da linha que ele deve excluir, lembrando que as linha são contadas iniciando em 0.

Na maior parte dos caso queremos remover um linha do JTable que esta selecionada, para isso devemos pegar o número 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 método getSelectedRow() da JTable, que retorna o numero da linha selecionada ou -1 se não tiver nenhuma linha selecionada.

Bom não adianta nada ter uma tabela se não podemos manipular os valores dela, veremos abaixo como pegar um valor de uma célula 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 fácil de pegar um valor de uma célula de uma JTable é através do método getValueAt(int , int), que recebe como primeiro parâmetros o número da linha e como segundo o número da coluna, lembrando que como as linhas a numeração das colunas começa em 0.

Para colocar um valor especifico em uma célula podemos utilizar o método setValueAt(Object, int, int):

	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 métodos getRowCount() e getColumnCount() que retornam respectivamente o número de linhas e colunas.

Também podemos pegar todos os dados da tabela pegando o objeto Vector que representa os dados da tabela através do método 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 também é armazenada como um Vector, sendo cada um dos objetos armazenados nele o valor de uma célula. Só lembrando, se você modificar o Vector retornado pelo método getDateVector() os dados visualizados na JTable serão modificados.

Esta é a maneira mais simples de trabalhar com JTable, para customizarmos mais ela teremos criar o nosso próprio TableModel e CellRenderer que veremos em próximos posts, eu espero.

Referências

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

Categorias Java
comments powered by Disqus