Você está na página 1de 6

GUJ

Notcias, artigos e o maior frum brasileiro sobre Java


home frum notcias tpicos recentes empregos artigos

Bem vindo ao GUJ. Crie seu login, ou digite-o para logar no site. Usurio: Senha:

Tutorial sobre JTable do Swing - parte I


em 25/05/2004 , por Bruno Rios Lima Tutorial do JTable do Swing Com esse tutorial voce aprender a criar desde uma JTable simples, at uma complexa, utilizando as princpais classes ( editor, renderer, model, etc ). Este tutorial estar subdividindo em diversos capitlos, aumentando sua complexidade a medida que entrarmos em um novo captulo. CAPITULO 1 - Construindo uma JTable Simples Introduo: A classe JTable utilizada para vizualizar dados em grid no Swing e um dos componentes mais complexos desse pacote. Alias o JTable possui at um pacote especial, que contm diversas classes para sua utilizao: javax.swing.table. A JTable um componente MVC: o seu trabalho dividido em 3 partes: Model: a parte que cuida dos dados, quem controla e distribui os dados na jtable. implementado pela interface TableModel ( AbstractTableModel e DefaultTableModel ). Ela responsavel por fornecedor os dados para a tabela, a qual requisitar os dados atraves do mtodo getValueAt, informando a linha e a coluna. Este mtodo retorna um Object, ou seja, um objeto qualquer, que pode ser um Integer, uma String ou uma outra classe que voc tenha implementado. View: a parte que cuida da apresentao. implementado pela interface CellRenderer. como a apresentao dada celula a celula na tabela, o renderer deve ser fornecedido para uma celula especifica. Na Jtable possivel fornecer tanto um renderer para a tabela inteira como para uma coluna especifica. Assim como na tablemodel requisitar o valor na linha e coluna especifica, aqui ele requisitara o objeto que ira apresentar o dados, passando como parametro a linha, a coluna o valor (object), a tabela (jtable), se esta celula esta selecionada e se ela celula possui o foco. Este mtodo o getCellRendererComponent, que ir retornar um JComponent. O DefaultCellRenderer implementa o JLabel para apresentar os dados, que a forma de apresentao mais comum para um valor. Controller: a parte que controla a

apresentao dos dados na view. a prpria JTable. Como a JTable ja vem implementada para usar os tipos defaults existentes e implementados, para criar uma jtable simples no to complicado. O unico problema que voce acaba se engessando quando precisar de algum recurso mais "completo". Criando uma JTable Vamos agora conhecer uma forma de contruir uma JTable, simplesmente fornecedor os dados que quero exibir nela. view plainprint? 1. 2. 3. 4. 5. 6. 7. 8. 9. String[] colunas = new String []{"Estado","Cidade"}; String[][] dados = new String [][] { {"SP","Sao Paulo"}, {"RJ","Rio de Janeiro"}, {"RN","Rio Grande do Norte"}, {"PR","Parana"} }; JTable jtable = new JTable(dados, colunas);

O exemplo acima cria uma instncia da classe JTable passando como argumentos as variveis dados e colunas. Existem diversos contrutores para a JTable, e um deles a passagem de arrays (linhas e colunas) como argumentos. Este o modo mais simples de fornecer JTable os dados que deseja exibir. Ela utliza toda a estrutura default para exibio deste codigo. Trabalhando com a JTable: DefaultTableModel() Tendo nossa JTable criada, podemos trabalhar em cima do modelo (TableModel) que ela criou. Para obtermos o modelo dessa JTable criada, basta chamarmos o mtodo getModel() que retorna uma instncia de classe que implementa o TableModel. Como o argumento para criao de nossa JTable foi uma coleo, o modelo utilizado internamente foi o DefaultTableModel. O DefaultTableModel uma classe de javax.swing.table e implementa a interface TableModel, fornecedo-nos todo o controle dos dados da JTable. Claro que uma classe com mtodos bsicos para trabalhar com os dados da JTable. getValueAt(): obtem o valor de uma determinada linha e coluna na JTable. - setValueAt(): seta o valor em uma determinada linha e coluna na JTable. - addRow(): adiciona uma nova linha na JTable. Recebe um array simples. - addColumn(): adiciona uma nova coluna no modelo. Com base no exemplo anterior, digamos que seria necessario adicionar outras linhas apos a criao da nossa JTable. Vamos alterar nosso codigo para tirarmos o peso de controlar os dados da prpria JTable e jogar esse trabalho pro DefaultTableModel: view plainprint? 1. String[][] dados = new String [][]{ 2. {"SP","Sao Paulo"}, 3. {"RJ","Rio de Janeiro"}, 4. {"RN","Rio Grande do Norte"}, 5. {"PR","Parana"} 6. };

7. String[] colunas = new String []{"Estado","Cidade"}; 8. // Ao inves de passar direto, colocamos os dados em um modelo 9. DefaultTableModel modelo = new DefaultTableModel(dados, colunas); 10. // e passamos o modelo para criar a jtable 11. JTable jtable = new JTable( modelo );

O que fizemos foi pegar as colunas e os dados, e jog-los em algum para cuidar deles: no caso um TableModel, que o responsavel por controlar os dados de uma JTable. Agora que criamos uma JTable passando um TableModel que controla os dados, podemos trabalhar em cima desse modelo. Uma coisa que devemos ter em mente sempre saber que modelo tal JTable est usando, pois assim podemos pega-lo de volta e trabalhar em cima dele. - addRow() Digamos que, na nossa tela, colocamos um novo boto para incluir novas linhas nessa minha JTable. E para tal, criamos o mtodo adicionaLinha(), chamado pelo ActionPerformed deste boto. Este mtodo ir obter o nosso modelo, quem controla os dados, e incluir uma nova linha em branco. view plainprint? 1. 2. 3. 4. 5. 6. 7. 8. 9. /** * Mtodo para adicionar uma nova linha na JTable */ public void adicionaLinha() { // Obtem o modelo da JTable DefaultTableModel modelo = (DefaultTableModel)getTabela().getModel(); // Adiciona uma nova linha em branco no modelo modelo.addRow( new String [] {"", ""} ); }

- removeRow() A mesmo coisa poderia ser feito se quisermos deletar uma determinada linha. Digamos que vamos excluir a linha atualmente selecionada. Para saber qual linha est selecionada, devemos perguntar a JTable, que o controlador. O mtodo utilizado o getSelectedRow() e retorna um int, a linha selecionada. Se nao houver linhas selecionadas, o retorno -1. view plainprint? 1. /** 2. * Remove a linha do modelo. 3. * @param linha 4. */ 5. public void removeLinha(int linha){ 6. 7. // Obtem o modelo da JTable 8. DefaultTableModel modelo = (DefaultTableModel)getTabela().getModel(); 9. 10. // Remove a linha 11. modelo.removeRow(linha);

12. 13. } 14. 15. /** 16. * Obtem a linha selecionada e chama o mtodo para remover 17. * do modelo 18. */ 19. public void removeLinha(){ 20. 21. // Obtem a linha selecionada na tabela e chama o mtodo 22. // para excluir a linha 23. int linhaSelecionada = getTabela().getSelectedRow(); 24. 25. // Verificamos se existe realmente alguma linha selecionada 26. if( linhaSelecionada < 0 ){ 27. return; 28. }else{ 29. // Remove a linha do modelo 30. removeLinha(linhaSelecionada); 31. } 32. 33. 34. }

- ListSeleciont Trabalhar com seleo de linhas e colunas na JTable tambem um trabalho a parte. Existem mtodos para obter nao s a linha, mas o numero de linhas selecionadas, as linhas selecionadas ( que retorna um array de int[] ). Assim como as linhas, os mesmos mtodos se encontram para obter as colunas seleciondas. Vale a pena dar uma olhada na API da JTable para conferir estes mtodos. Para setar o modo de seleo no qual sua JTable ir trabalahar, vamos permitir somente a seleo de linhas ( unicas ) e nao multiplas. view plainprint? 1. .setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

- getValueAt e setValueAt Em algum ponto de sua aplicao, voce pode querer substituir o contedo de uma celula, ou de vrias linhas em uma determinada coluna. Com os mtoso getValueAt e setValueAt podemos obter e setar o valor em uma determinada coluna e linha. Vamos criar um mtodo para subtituir um determinado valor por outro, em uma coluna especifica. view plainprint? 1. /** 2. * Mtodo para subtituir um valor por outro em uma determinada 3. * coluna.

4. * @param oldValue 5. * @param newValue 6. * @param column 7. * @return Numero de substituies 8. */ 9. public int substituirValor(String oldValue, String newValue, int column){ 10. // Flag para saber se algum valor foi 11. int total = 0; 12. // Obtem o modelo da JTable 13. DefaultTableModel modelo = (DefaultTableModel)getTabela().getModel(); 14. // Faz um looping em cima das linhas do modelo 15. for( int linha=0; linha<modelo.getRowCount(); linha++){ 16. // Obtem o valor atual na coluna 17. String valorAtual = (String)modelo.getValueAt(linha, column); 18. if( valorAtual.equals(oldValue) ){ 19. // Substitui pelo novo valor na linha e coluna 20. modelo.setValueAt(newValue, linha, column); 21. // Adiciona mais um no numero de linhas atualizadas 22. total++; 23. } 24. } 25. return total; 26. }

Poderiamos ter utilizado o Iterator para trabalhar em cima dos dados, basta obter o iterator do vetor de linhas dos dados retornado pelo modelo e obter os valor por meio de array de strings. view plainprint? 1. Iterator i = modelo.getDataVector().iterator(); 2. String [] row = i.next();

Implementando meu prprio TableModel Para implementar o TableModel, existem diversos pontos que devemos cobrir - devemos tratar o controle dos dados ( colunas e linhas ). Uma opo simples para comearmos, ser a de estender a classe AbstractTableModel que fornece diversos mtodos j sobrescritos exceto aqueles que retornam dados: - public Object getValueAt( int row, int col ) - public int getRowCount() public int getColumnCount() Esta classe tambm j implementa 7 mtodos de atualizao da JTable ( TableModelEvents ). Estes mtodos so utilizados para informar as alteraes ocorridas dentro de um modelo. Exemplo seria a incluso de uma nova linha, que dispara o mtodo fireTableRowsInserted. Durante a criao dos mtodos para trabalhar com os dados, iremos ver estes eventos. Mas este assunto vamos tratar na prxima parte do artigo. At l!

Apoiado e desenvolvido por Caelum Cursos Java - GUJ: desde 2002 Conhea tambm AgendaTech, Tectura, Programador Poliglota e InfoQ Brasil