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. sta uma classe !ue usa o padr"o #$C%#odel , $ie& e Controller'( Model: a classe responsvel por representar os dados da tabela, sempre !ue iremos modificar os dados de uma )*able deve ser feito atravs do ob+eto model !ue implementado pela interface TableModel % AbstractTableModel e DefaultTableModel'. View: , a apresenta-"o da clula na JTable implementado pela interface CellRenderer, !ue atravs de seus mtodos define como ser"o apresentados os valores. Controller: a parte !ue controla os dados e a apresenta-"o, ele representado pela pr.pria JTable. $e+amos agora como criar a mais simples das JTable( /tring01 colunas 2 ne& /tring01345ome4,4Idade4,4/exo467
/tring0101 dados 2 ne& /tring01013 348odrigo4,49:4,4#asculino46, 34#aria4,4;<4,4=eminino46 67
)*able tabela 2 ne& )*able%dados,colunas'7 )/croll>ane scroll 2 ne& )/croll>ane%'7 scroll.set$ie&port$ie&%tabela'7 this.add%scroll'7 5a lina ? criamos uma arra@ de strings !ue ser"o os nomes das colunas e os usaremos para construir nossa JTable, na linha ; criamos uma matriA !ue ser utiliAada como dados da tabela, sendo o primeiro ndice as linhas e o segundo as colunas sendo assim nossa tabela de exemplo tem 9 linha e ; colunas. 5o exemplo utiliAamos uma matriA de /tring, mas poderia ser uma matriA de Bb+ect ou ob+eto do tipo Vector 5a linha : criamos o ob+eto JTable passando como argumento para o construtor dos dados e os nomes das colunas, com este construtor ele cria internamente um ob+eto DefaultTableModel para armaAenar os dados !ue posteriormente podemos pegar utiliAando o mtodo tabela.getModel(). 5a linha C criamos um JScrollPane para colocar a tabela dentro atravs do seu mtodo set$ie&port$ie&%)*able', ele serve para a tabela possuir uma barra de rolagem e mostrar os nomes das colunas. 5a linha ?? adicionamos o JScrollPane na +anela. *ambm poderiamos ter criado a mesma tabela atravs do seguinte c.digo( /tring01 colunas 2 ne& /tring01345ome4,4Idade4,4/exo467 /tring0101 dados 2 ne& /tring01013 348odrigo4,49:4,4#asculino46, 34#aria4,4;<4,4=eminino46 67
)*able tabela 2 ne& )*able%'7 Default*able#odel model 2 ne& Default*able#odel%dados , colunas '7 tabela.set#odel%model'7 )/croll>ane scroll 2 ne& )/croll>ane%'7 scroll.set$ie&port$ie&%tabela'7 this.add%scroll'7 Como podemos ver criamos um ob+eto DefaultTableModel%linha :', com os dados da tabela e os nomes das colunas em veA de passar para para o construtor de JTable, e depois adicionamos o model criado atravs do mtodo setModel, devemos faAer assim !uando !uisermos criar nossos pr.prios models. Adicionando uma linha( Default*able#odel model 2 %Default*able#odel' tabela.get#odel%'7
/tring01 linha 2 ne& /tring0134)o"o4, 4?E4 , 4#asculino467 model.add8o&%linha'7 Como vimos, para manipular os dados de um JTable devemos utiliAar o ob+eto model !ue ela possui, ent"o primeiro devemos pegar o model atravs do mtodo getModel(), ap.s isto basta criar um arra@ de /trings com os valores correspondentes a cada coluna e adicionaFlo atravs do mtodo addRow(), do ob+eto model. Removendo uma linha da tabela Default*able#odel model 2 %Default*able#odel' tabela.get#odel%'7 model.remove8o&%<'7 >ara remover uma linha devemos primeiro pegar o model do JTable como antes e depois chamar o mtodo removeRow() !ue recebe como parGmetro um inteiro !ue ser o nHmero da linha !ue ele deve excluir, lembrando !ue as linha s"o contadas iniciando em <. 5a maior parte dos caso !ueremos remover um linha do JTable !ue esta selecionada, para isso devemos pegar o nHmero desta linha. int linha 2 tabela.get/elected8o&%'7
if% linha I2 F?'3 tabela.remove8o&% linha '7 6 Como vemos na linha ?, para descobrir !ual linha est selecionada utiliAamos o mtodogetSelectedRow() da JTable, !ue retorna o numero da linha selecionada ou -1 se n"o tiver nenhuma linha selecionada. Jom n"o adianta nada ter uma tabela se n"o podemos manipular os valores dela, veremos abaixo como pegar um valor de uma clula do JTable int linha 2 tabela.get/elected8o&%'7KKpegando linha selecionada /tring nome 2 tabela.get$alueAt%linha , <' '7 /tring idade 2 tabela.get$alueAt%linha , ?' '7 /tring sexo 2 tabela.get$alueAt%linha , 9' '7 B modo mais fcil de pegar um valor de uma clula de uma JTable atravs do mtodo getValueAt(int ! int), !ue recebe como primeiro parGmetros o nHmero da linha e como segundo o nHmero da coluna, lembrando !ue como as linhas a numera-"o das colunas come-a em <. >ara colocar um valor especifico em uma clula podemos utiliAar o mtodo setValueAt("b#ect! int! int)( int linha 2 tabela.get/elected8o&%'7KKpegando linha selecionada tabela.set$alueAt%45ome alterado4 , linha , <'7 tabela.set$alueAt%4<4 , linha , ?'7 tabela.set$alueAt%4indefinido4 , linha , 9'7 Ao utiliAar getValueAt(int ! int) e setValueAt("b#ec ! int ! int ) vocL pode !uerer percorrer todas as linhas ou colunas da JTable e para isso os mtodos getRowCount() e getColumnCount() !ue retornam respectivamente o nHmero de linhas e colunas. *ambm podemos pegar todos os dados da tabela pegando o ob+eto $ector !ue representa os dados da tabela atravs do mtodo getDataVector() Iterator iterator 2 model.getData$ector%'.iterator%'7 &hile % iterator.has5ext%' ' 3 $ector ro& 2 %$ector' iterator.next%'7 /@stem.out.println%ro&.get%<''7 /@stem.out.println%ro&.get%?''7 /@stem.out.println%ro&.get%9''7 6 Como vimos na linha ? pegamos o Vector do model e utiliAamos um iterator para percorrer as linhas, sendo !ue cada linha tambm armaAenada como um Vector, sendo cada um dos ob+etos armaAenados nele o valor de uma clula. /. lembrando, se vocL modificar o Vector retornado pelo mtodo getDateVector() os dados visualiAados na JTable ser"o modificados. sta a maneira mais simples de trabalhar com JTable, para customiAarmos mais ela teremos criar o nosso pr.prio TableModel e CellRenderer !ue veremos em pr.ximos posts, eu espero. Instanciando um )*able, + inserindo dentro de um )/croll, !ue desabilita o usurio poder editar suas clulas( int linhas 2 ?<7 int colunas 2 97 )*able table 2 ne& )*able%linhas, colunas' 3 public boolean isCellditable%int ro&Index, int vColIndex' 3 return false7 6 67 )/croll>ane scroll>ane 2 ne& )/croll>ane%table'7 Bloqueia o uu!rio de redimenionar a coluna da tabela: table.get*ableMeader%'.set8esiAingAllo&ed%false'7 Bloqueia o uu!rio de trocar a "oi#$o da coluna via dra" and dro"% table.get*ableMeader%'.set8eorderingAllo&ed%false'7 <erando o nome da dua "rimeira coluna da tabela din'micamente: table.getColumn#odel%'.getColumn%<'.setMeader$alue%4Coluna ?4'7 table.getColumn#odel%'.getColumn%?'.setMeader$alue%4Coluna 94'7 (e)inindo um tamanho )i*o "ara largura da dua "rimeira coluna: table.getColumn#odel%'.getColumn%<'.set>referredNidth%??E'7 table.getColumn#odel%'.getColumn%?'.set>referredNidth%OO?'7 (eativando o auto redimenionamento da tabela: table.setAuto8esiAe#ode%)*able.AU*BP8/IQPB=='7 +ermite a"ena ele#$o im"le (omente 1 linha): table.set/election#ode%Rist/election#odel./I5GRP/RC*IB5'7 Tratando evento de doi clic, do moue em cima de uma linha da Tabela: table.add#ouseRistener%ne& #ouseAdapter%' 3 public void mouseClicSed%#ousevent e' 3 if %e.getClicSCount%' 22 9' 3 )*able target 2 %)*able'e.get/ource%'7 int linha 2 target.get/elected8o&%'7 KK linha selecionada int coluna 2 target.get/electedColumn%'7 KK coluna selecionada
/@stem.out.println%4Rinha( 4 T linha'7 /@stem.out.println%4Coluna( 4 T coluna'7 6 6 6'7 spero !ue essas dicas possam a+udar vocL de alguma forma. *odas elas foram Hteis para mim em algum momento, portanto achei importante compartilhar. Bloqueando a ele#$o de linha-coluna baeado em uma determinada condi#$o% int linhas 2 ?<7 int colunas 2 ;7 )*able table 2 ne& )*able%linhas, colunas' 3 public void change/election%int ro&, int column, boolean toggle, boolean extend' 3 Default*able#odel m 2 %Default*able#odel' get#odel%'7
KU n"o permite a sele-"o !uando o valor da coluna ; for igual fechado UK if %m.get$alueAt%ro&, 9' I2 null VV m.get$alueAt%ro&, 9'.to/tring%'.toRo&erCase%'.e!uals%4fechado4'' 3 return7 6 super.change/election%ro&, column, toggle, extend'7 6 67 <erando a cor de )undo-"rimeiro "lano de acordo com uma determinada condi#$o% Determina tambm a cor de fundoKprimeiro plano da linha selecionada. $ocL esta livre para inserir outras l.gicas !ue achar necessrio alm desse exemplo bsico !ue verifica somente o valor de uma determinada coluna. int linhas 2 E7 int colunas 2 ;7 )*able table 2 ne& )*able%linhas, colunas' 3 public Component prepare8enderer%*ableCell8enderer renderer, int ro&Index, int vColIndex' 3
Default*able#odel m 2 %Default*able#odel' get#odel%'7 Component c 2 super.prepare8enderer%renderer, ro&Index, vColIndex'7
KK altera a cor de bacSground da linha para vermelho e foreground para branco KK !uando o valor da coluna ; for igual a fechado if %m.get$alueAt%ro&Index, 9'.to/tring%'.toRo&erCase%'.e!uals%4fechado4'' 3 c.setJacSground%ne& Color%?C9, <, <''7 c.set=oreground%Color.&hite'7 6 else 3 KK mantem a cor padr"o de foreground c.set=oreground%get=oreground%''7
KK determina a cor de bacSground da linha selecionada if%isCell/elected%ro&Index, vColIndex'' 3 c.setJacSground%ne& Color%?:W, 9<X, 99C''7 6 else 3 KK linhas n"o selecionadas, manter cor de bacSground padr"o c.setJacSground%getJacSground%''7 6
6 return c7 6 67 .or#ar a renderi/a#$o do JTable B c.digo abaixo pode ser utiliAado para renderiAar o )*able novamente !uando for preciso. 5o caso de mudan-a de dados !ue influencie na l.gica usada em algum dos mtodos anteriores. table.updateUI%'7 #anipulando o conteHdo da tabela KK inserindo dados em uma tabela com W colunas Default*able#odel table#odel 2 %Default*able#odel' minha*abela.get#odel%'7 table#odel.insert8o&%table#odel.get8o&Count%', ne& Bb+ect013 4Douglas4, 4$illanacci4, 4douglas.pas!uaYgmail.com4, 4????????46'7 table#odel.insert8o&%table#odel.get8o&Count%', ne& Bb+ect013 4=ulano4, 4da /ilva4, 4fulano.silvaYblalbla.com4, 4????????46'7
KK limpando todo o conteHdo da tabela Default*able#odel table#odel 2 %Default*able#odel' minha*abela.get#odel%'7 table#odel.getData$ector%'.removeAlllements%'7 minha*abela.updateUI%'7
KK alterando o valor de determinada linha e coluna da tabela( Rinha ?, Coluna ? KK linha e coluna come-am com valor < *able#odel model 2 %*able#odel' minha*abela.get#odel%'7 model.set$alueAt%4)osefina4, <, <'7
KK obtendo valor de determinado campo na tabela, informando Rinha%9' e Coluna%?' KK linha e coluna come-am com valor < *able#odel model 2 %*able#odel' minha*abela.get#odel%'7 /tring value 2 %/tring' model.get$alueAt%?, <'7 /@stem.out.println%value'7 Tratando evento de mudan#a de dado na tabela Caso vocL tenha campos editveis na sua tabela, vocL pode em algum momento !uerer executar alguma a-"o !uando um valor de um campo da sua tabela sofrer altera-Zes. >ara !ue vocL possa controlar as mudan-as realiAadas na edi-"o da sua tabela, necessrio monitorar o evento de altera-"o atravs do listener *able#odelRistener. KK monitorando o evento atravs de *able#odelRistener minha*abela.get#odel%'.add*able#odelRistener%ne& *able#odelRistener%' 3 YBverride public void tableChanged%*able#odelvent e' 3 int linha 2 e.get=irst8o&%'7 int coluna 2 e.getColumn%'7
*able#odel model 2 %*able#odel' e.get/ource%'7
/@stem.out.println%4$ocL alterou a linha 4 T linha T 4, coluna 4 T coluna'7 /@stem.out.println%4$alor da clula alterada( 4 T model.get$alueAt%linha, coluna''7 6 6'7 0ando ComboBo* (JcomboBo*) na c1lula da ua tabela , possvel associar um )ComboJox %caixa de sele-"o' [ uma coluna da sua tabela. , uma forma de facilitar a vida do usurio. Ao invs do usurio digitar um valor para a clula, ele simplesmente escolhe um valor dentre vrios, atravs de uma caixa de sele-"o. 8ecurso bem interessante e elegante. 5o exemplo abaixo, vamos associar um combo box para a !uinta coluna da tabela. %RembreFse !ue a numera-"o das colunas come-a por <'. B usurio poder escolher entre \#asculino] ou \=eminino]( KK Bbtendo [ referencia para a E coluna da tabela *ableColumn column 2 minha*abela.getColumn#odel%'.getColumn%W'7 KK Criando o ComboJox )ComboJox combo/exo 2 ne& )ComboJox%'7 KK Definindo os valores para o ComboJox DefaultComboJox#odel combo#odel 2 ne& DefaultComboJox#odel%ne& /tring01 3 4#asculino4, 4=eminino4 6'7 combo/exo.set#odel%combo#odel'7 KK Associando o ComboJox para a coluna column.setCellditor%ne& DefaultCellditor%combo/exo''7 2ele#3e do uu!rio 5a sua configura-"o padr"o, uma mesa de suporte de uma selec-"o, !ue consiste em uma ou mais linhas. B usurio pode selecionar um intervalo contguo de linhas ou um con+unto arbitrrio de linhas. A Hltima clula !ue o usurio indicado recebe uma indica-"o especial, no olhar do metal e sentir, a clula est delineado. sta clula conhecida como a selec-"o de chumbo , !ue por veAes chamado de 4clula com o foco4 ou 4a clula corrente4. B utiliAador utiliAa o rato e K ou o teclado para faAer selec-Zes, tal como descrito na seguinte tabela( 4"era#$o &#$o do moue &#$o teclado /elecione uma Hnica linha. Cli!ue. /eta para cima ou /eta para baixo. stender a sele-"o contgua. /hift T cli!ue ou arraste sobre linhas. /eta ou /hift T /eta para baixo /hiftFUp. Adicionar linha para sele-"o K sele-"o de linha de alternGncia. ControlFClicS #ova levar a sele-"o com ControlF/eta para cima ou ControlF/eta para baixo, em seguida, usar a barra de espa-o para adicionar [ sele-"o ou Control T Jarra de spa-o para mudar a selec-"o de linha. ste programa de exemplo apresenta a mesa familiar, e permite ao usurio manipular certas op-Zes )*able. M tambm um painel de texto !ue regista eventos de selec-"o. 5a imagem abaixo, um usurio executar o programa, clicar na primeira linha, em seguida, controlar clicado na terceira fila. Bbserve o contorno ao redor da Hltima clula clicada, esta a forma como o metal olhar e sentir desta!ues da sele-"o principal. m 4#odo de selec-"o4 h um con+unto de botZes de rdio. Cli!ue na caixa 4/ele-"o /ingle4. Agora vocL pode selecionar apenas uma linha de cada veA. /e vocL clicar no bot"o 4/ingle Interval /election4 de rdio, vocL pode selecionar um con+unto de linhas !ue devem ser contguos. *odos os botZes de rdio em 4#odo /elec-"o4 invocar )*able.set/election#ode . ste mtodo recebe um Hnico argumento, !ue deve ser uma das seguintes constantes definidas na +avax.s&ing.Rist/election#odel ( #UR*I>RPI5*8$ARP/RC*IB5 , /I5GRPI5*8$ARP/RC*IB5 e /I5GRP/RC*IB5 . $oltando a *able/electionDemo , observe as trLs caixas de sele-"o de op-Zes em 4Bp-Zes de sele-"o4. Cada uma op-"o controla o estado de um boolean varivel ligada definido pela )*able ( 4/ele-"o 8o&4 controla ro&/electionAllo&ed !ue mtodo setter set8o&/electionAllo&ed mtodo e getter get8o&/electionAllo&ed . ^uando essa propriedade bound verdade %ea column/electionAllo&ed propriedade falso ', o usurio pode selecionar a linha. 4/ele-"o de coluna4 controla column/electionAllo&ed !ue mtodo setter setColumn/electionAllo&ed mtodo e getter getColumn/electionAllo&ed .^uando essa propriedade bound verdade %ea ro&/electionAllo&ed propriedade bound falso ', o usurio pode selecionar a coluna. 4/ele-"o de clula4 controles cell/electionnabled , !ue tem setter mtodo setCell/electionnabled e mtodo getter getCell/electionnabled .^uando essa propriedade bound verdadeiro , o usurio pode selecionar uma Hnica clula ou bloco retangular de clulas. 54T&: )*able usa um conceito muito simples de sele-"o, gerenciada como uma intersec-"o de linhas e colunas. le n"o foi pro+etado para lidar com as sele-Zes de clulas totalmente independentes. /e vocL desmarcar todas as trLs caixas de sele-"o %definindo todas as trLs propriedades ligadas a falsa ', n"o h nenhuma sele-"o, apenas a sele-"o principal mostrada. $ocL pode perceber !ue a op-"o 4celular /election4 desativado no modo de sele-"o mHltipla intervalo. Isso ocorre por!ue a sele-"o celular n"o compatvel com este modo na demonstra-"o. $ocL pode especificar a sele-"o de clula em modo de sele-"o mHltipla intervalo, mas o resultado uma tabela !ue n"o produA sele-Zes Hteis. $ocL tambm pode perceber !ue a mudan-a de !ual!uer uma das trLs op-Zes de sele-"o pode afetar os outros. Isso ocorre por!ue permite tanto a sele-"o de linha e coluna sele-"o exatamente o mesmo !ue permite a sele-"o de clulas. )*able atualiAa automaticamente as trLs variveis ligadas como necessrias para mantLFlos consistentes. 54T&: A+uste cell/electionnabled para um valor tem o efeito colateral de tambm definir tanto ro&/electionnabled e column/electionnableda esse valor. Definir tanto ro&/electionnabled e column/electionnabled para um valor tem o efeito colateral de tambm definircell/electionnabled a esse valor. /etting ro&/electionnabled e column/electionnabled a diferentes valores tem o efeito colateral de tambm definir cell/electionnabled para false . >ara recuperar a sele-"o atual, use )*able.get/elected8o&s !ue retorna uma matriA de ndices de linha e )*able.get/electedColumns !ue retorna um arra@ de ndices de coluna. >ara obter as coordenadas da sele-"o principal, referemFse aos modelos de sele-"o para a pr.pria mesa e para o modelo de coluna da tabela. Bs seguintes formatos de c.digo de uma string contendo a linha e coluna da sele-"o principal( /tring.format %4/ele-"o de execu-"o(._ D,_ d4, table.get/election#odel %'. getRead/electionIndex %' .. table.getColumn#odel %' get/election#odel %' getRead/electionIndex %''7 /ele-Zes do usurio gerar uma srie de eventos. >ara obter informa-Zes sobre estes, consulte Como escrever um Ristener /ele-"o Rista no Nriting vento Buvintesli-"o. 54T&: a sele-"o de dados, na verdade, descreve as clulas selecionadas no 4vista4 %dados da tabela !ue aparece depois de !ual!uer classifica-"o ou filtragem', e n"o no modelo de tabela. sta distin-"o n"o importa a menos !ue os dados vistos foi adaptada por classifica-"o, filtragem ou manipula-"o usurio de colunas. 5esse caso, vocL deve converter as coordenadas de sele-"o usando os mtodos de convers"o descritos na Classifica-"o e filtragem . Criando um Modelo de Tabela Cada ob+eto de tabela usa um ob+eto modelo de tabela para gerenciar os dados da tabela de reais. Um ob+eto de modelo de tabela deve implementar o *able#odelinterface. /e o programador n"o fornecer um ob+eto de modelo de mesa, )*able automaticamente cria uma instGncia de Default*able#odel . sta rela-"o ilustrada abaixo. B )*able construtor usado por /imple*ableDemo cria seu modelo de mesa com um c.digo como este( ne& Abstract*able#odel %' 3 getColumn5ame public /tring %int col' 3 voltar column5ames 0col1 to/tring %'.7 6 public int Get8o&Count %' 3ro&Data.length return76 public int getColumnCount %' 3column5ames.length return76 public Bb+ect get$alueAt %int ro&, int col' 3 voltar 8o&Data 0ro&1 0col17 6 public boolean isCellditable %int ro&, int col' 38eturn true76 set$alueAt public void %Bb+ect value, int ro&, int col' 3 8o&Data 0ro&1 0col1 2 valor7 fire*ableCellUpdated %ro&, col'7 66 Como o c.digo anterior mostra, a implementa-"o de um modelo de tabela pode ser simples. Geralmente, vocL implementar seu modelo de tabela em uma subclasse deAbstract*able#odel classe. /eu modelo pode manter seus dados em uma matriA, vetor, ou mapa de hash, ou pode obter os dados de uma fonte externa, como um banco de dados. >ode at gerar os dados em tempo de execu-"o. sta tabela diferente do /imple*ableDemo tabela das seguintes maneiras( *ableDemo 4modelo de tabela personaliAada s, embora se+a simples, pode facilmente determinar o tipo dos dados, a+udando a )*able exibir os dados no melhor formato. /imple*ableDemo criado automaticamente modelo de tabela, por outro lado, n"o sabe !ue o 6 &no de coluna contm nHmeros %!ue geralmente devem ser alinhados [ direita e tem um formato particular'. le tambm n"o sabe !ue a $egetarian coluna contm valores booleanos, !ue podem ser representados por caixas de sele-"o. B modelo de tabela personaliAada implementado em *ableDemo n"o permite !ue vocL edite as colunas de nome, mas, no entanto, permitem !ue vocL edite as outras colunas. m /imple*ableDemo , todas as clulas s"o editveis. #ais abaixo feita a partir do c.digo *ableDemo.+ava !ue diferente do /imple*ableDemo.+ava . 5egrito indica o c.digo !ue faA com !ue este modelo de mesa diferente do modelo de tabela definida automaticamente para /imple*ableDemo . pHblico *ableDemo %' 3 ... #esa )*able 2 ne& )*able %ne& #@*able#odel %''7 ...6 #@*able#odel classe estende Abstract*able#odel 3 private /tring 01 column5ames 2 ... $ $ mesmo %ue antes ... private Bb+ect 01 01 data 2 ... $ $ mesmo %ue antes ... pHblico getColumnCount int %' 3 voltar column5ames.length7 6 pHblico Get8o&Count int %' 3 voltar data.length7 6 getColumn5ame public /tring %int col' 3 voltar column5ames 0col17 6 public Bb+ect get$alueAt %int ro&, int col' 3 retornar dados 0ro&1 0col17 6 getColumnCla Clae "7blica (int c) 8 voltar getValue&t (9: c) getCla ()%; < K U U 5"o precisa implementar este mtodo, a menos de sua mesa U ditvel. U K public boolean isCellditable %int ro&, int col' 3 K K 5ote !ue o endere-o de dados K clula constante, K K 5"o importa onde a clula aparece na tela. i) (col =>) 8 return )ale; < ?le 8 return true; < 6 K U U 5"o precisa implementar este mtodo, a menos de sua mesa U Dados pode mudar. U K set$alueAt public void %Bb+ect value, int ro&, int col' 3 dados 0ro&1 0col1 2 valor7 fire*ableCellUpdated %ro&, col'7 6 ...6 4uvir "ara altera#3e de dado Um modelo de tabela pode ter um con+unto de ouvintes !ue s"o notificados sempre !ue as altera-Zes de dados de tabela. Buvintes s"o instGncias de*able#odelRistener . 5o seguinte exemplo de c.digo, /imple*ableDemo estendido para incluir tal ouvinte. 5ovo c.digo est em negrito. im"ortar @ava*%wing%event A%;im"ortar @ava*%wing%table%TableModel; public class /imple*ableDemo ... im"lementa TableModelBitener 3 ... pHblico /imple*ableDemo %' 3 ... % table%getModel () addTableModelBitener (thi); ... 6 "ublic void tableChanged (TableModel?vent e) 8 int row C e%get.irtRow (); int column C e%getColumn (); Modelo TableModel C (TableModel) e%get2ource (); Corda column5ame C model%getColumn5ame (coluna); 4b@eto de dado C model%getValue&t (linha: coluna); ... / / Faz alguma coisa com os dados ... 6 ...6 .iring Change (ata ?vento A fim de eventos de altera-"o de dados de incLndio o modelo de tabela deve saber como construir um *able#odelvent ob+eto. Isto pode ser um processo complexo, mas + se encontra implementado em Default*able#odel . $ocL pode permitir )*able usar sua instGncia padr"o do Default*able#odel , ou criar sua pr.pria subclasse personaliAada de Default*able#odel . /e Default*able#odel n"o uma classe base ade!uada para sua classe de modelo de tabela personaliAado, considere subclassifica-"o Abstract*able#odel . ssa classe implementa uma estrutura simples para a constru-"o de *able#odelvent ob+etos. /ua classe personaliAada simplesmente precisa invocar uma das seguintesAbstract*able#odel mtodos cada dados da tabela de tempo alterado por uma fonte externa. M1todo Mudar fire*ableCellUpdated AtualiAa-"o da clula especificada. fire*able8o&sUpdated AtualiAa-"o das linhas especificadas fire*ableDataChanged AtualiAa-"o da tabela inteira %somente dados'. fire*able8o&sInserted 5ovas linhas inserido. fire*able8o&sDeleted Rinhas existentes xcludos fire*able/tructureChanged Invalidar tabela inteira, tanto de dados e estrutura. Conceito: ?ditore e "retadore de Antes de ir para as pr.ximas tarefas, vocL precisa entender como as tabelas desenhar suas celas. $ocL pode esperar !ue cada clula em uma tabela a ser um componente. 5o entanto, por motivos de desempenho, tabelas de /&ing s"o implementados de forma diferente. m veA disso, uma Hnica clula de processador geralmente usado para desenhar todas as clulas !ue contLm o mesmo tipo de dados. $ocL pode pensar o processador como um selo de tinta configurvel !ue a tabela usa para carimbar dados ade!uadamente formatados para cada clula. ^uando o usurio come-a a editar os dados de um celular, um editor clula assume a clula, controlando o comportamento de edi-"o da clula. >or exemplo, cada clula na ` Anos de coluna em *ableDemo contm 5Hmero de dados F concretamente, um nHmero inteiro de ob+eto. >or padr"o, o renderiAador de clula para um nHmero de coluna contendo usa um Hnico )Rabel exemplo, para desenhar os nHmeros apropriados, alinhado [ direita, em clulas da coluna. /e o usurio come-a a editar uma das clulas, o editor de clula padr"o utiliAa uma alinhado [ direita )*ext=ield para controlar a edi-"o de clulas. >ara escolher o representante !ue mostra as clulas em uma coluna, uma mesa primeiro determina se vocL especificou um renderiAador para a coluna particular. /e vocL n"o feA, ent"o a tabela invoca o modelo de tabela getColumnClass mtodo, !ue recebe o tipo de clulas da coluna de dados. m seguida, a tabela compara o tipo de dados da coluna com uma lista de tipos de dados para !ue renderiAadores de clula s"o registrados. sta lista inicialiAado pela tabela, mas vocL pode completFlo ou alterFlo. Atualmente, mesas de colocar os seguintes tipos de dados na lista( Joolean F rendido com uma caixa de sele-"o. 5Hmero F rendido por um r.tulo alinhado [ direita. Duplo , =loat F mesmo nHmero , mas a tradu-"o ob+ectFtoFtext realiAada por um 5umber=ormat exemplo %usando o formato de nHmero padr"o para a localidade atual'. Data F rendido por um r.tulo, com a tradu-"o ob+eto para texto realiAado por um Date=ormat instGncia %usando um estilo curto a data ea hora para'. ImageIcon , acone F rendido por um r.tulo centraliAado. Bb+eto F rendido por um r.tulo !ue exibe valor de string do ob+eto. ditores celulares s"o escolhidos utiliAando um algoritmo semelhante. RembreFse !ue se vocL deixar uma mesa de criar o seu pr.prio modelo, ele usa ob+etos como o tipo de cada coluna. >ara especificar os tipos de colunas mais precisos, o modelo de tabela deve definir o getColumnClass mtodo ade!uadamente, como demonstrado por *ableDemo.+ava . *enha em mente !ue, apesar de processadores de determinar como cada clula ou cabe-alho da coluna olha e pode especificar o texto de dica de ferramenta, um renderiAador n"o manipular eventos. /e vocL precisa pegar os eventos !ue ocorrem dentro de uma tabela, a tcnica !ue vocL usa varia de acordo com o tipo de evento !ue vocL est interessado em( 2itua#$o Como Chegar ?vento >ara detectar os eventos de uma clula !ue est sendo editado ... Use o editor de clula %ou registarFse um ouvinte sobre o editor da clula'. >ara detectar linha K coluna K sele-Zes celulares e desmarca-Zes ... Use um ouvinte de sele-"o conforme descrito na usurio . >ara detectar eventos do mouse no cabe-alho da coluna ... 8egistre o tipo apropriado de )*ableMeader ob+eto. %$e+a >ara detectar outros eventos ... 8egistrar o ouvinte apropriado no )*able ob+eto. As pr.ximas se-Zes diAerFlhe como personaliAar a exibi-"o e edi-"o especificando representantes e editores. $ocL pode especificar renderiAadores de clula e editores ou por coluna ou tipo de dados. 0ando Renderer "eronali/ado sta se-"o descreve como criar e especificar um renderiAador de clula. $ocL pode definir uma clula especfica, tipo de processador usando o )*able mtodosetDefault8enderer . >ara especificar !ue as clulas em uma determinada coluna devem usar um renderiAador, vocL usa o *ableColumn mtodo setCell8enderer .$ocL pode at mesmo especificar um processador especfico de clula, criando uma )*able subclasse. , fcil personaliAar o texto ou imagem processada pelo renderiAador padr"o, Default*ableCell8enderer . $ocL acabou de criar uma subclasse e implementar oset$alue mtodo para !ue ele invoca set*ext ou setIcon com a corda ou a imagem apropriada. >or exemplo, a!ui a forma como a data renderiAador default implementado( Date8enderer classe esttica estende Default*ableCell8enderer 3 Date=ormat formatador7 Date8enderer pHblica %' 3super %'76 set$alue public void %Bb+ect value' 3 if %formatador 22 null' 3 formatador 2 Date=ormat.getDateInstance %'7 6 set*ext %%valor 22 null' 44(b formatter.format %valor''7 66 /e estendendo Default*ableCell8enderer insuficiente, vocL pode construir um processador usando outra superclasse. A maneira mais fcil criar uma subclasse de um componente existente, faAendo com !ue sua subclasse implementar o *ableCell8enderer interface. *ableCell8enderer re!uer apenas um mtodo(get*ableCell8endererComponent . A implementa-"o deste mtodo deve configurar o componente de renderiAa-"o para refletir o estado passedFin e, em seguida, retornar o componente. 5o instantGneo de *ableDialogditDemo , o representante usado para cor favorita clulas uma subclasse de )Rabel chamado Color8enderer . A!ui est"o trechos de Color8enderer.+ava !ue mostram como ele implementado. public class Color8enderer estende )Rabel implementa *ableCell8enderer 3 ... pHblico Color8enderer %boolean isJordered' 3 this.isJordered 2 isJordered7 setBpa!ue %true' K K deve faAer isso para o fundo para aparecer. 6 pHblico Componente get*ableCell8endererComponent % #esa )*able, cor Bb+ect, is/elected boolean, boolean Mas=ocus, int linha, int coluna' 3 Cor novaCor 2 %colorida'7 setJacSground %novaCor'7 if %isJordered' 3 if %is/elected' 3 ... K K /electedJorder uma borda s.lida na cor K K *able.get/electionJacSground %'. setJorder %selectedJorder'7 6 lse 3 ... K K UnselectedJorder uma borda s.lida na cor K K *able.getJacSground %'. setJorder %unselectedJorder'7 6 6 set*ool*ip*ext %...'7 $ $ discutidos na se&'o seguinte devolver este7 66 A!ui est o c.digo de *ableDialogditDemo.+ava !ue registra um Color8enderer instGncia como o renderiAador padr"o para todas as cores de dados( table.setDefault8enderer %Color.class, novo Color8enderer %true''7 >ara especificar um processador especfico de clula, vocL precisa definir uma )*able subclasse !ue substitui o getCell8enderer mtodo. >or exemplo, o c.digo a seguir faA a primeira clula na primeira coluna da tabela de usar um renderiAador personaliAado( *ableCell8enderer &eird8enderer 2 ne& Neird8enderer %'7table 2 ne& )*able %...' 3 getCell8enderer *ableCell8enderer pHblico %int linha, int coluna' 3 if %%ro& 22 <' VV %coluna 22 <'' 3 voltar &eird8enderer7 6 K K lse ... voltar super.getCell8enderer %linha, coluna'7 667 ?"eci)icando dica de )erramenta "ara c1lula >or padr"o, o texto de dica de ferramenta exibida por uma clula da tabela determinada pelo renderiAador da clula. 5o entanto, [s veAes pode ser mais simples para especificar o texto de dica de ferramenta, substituindo )*able implementa-"o cs do get*ool*ip*ext %#ousevent' mtodo. sta se-"o mostra como usar ambas as tcnicas. >ara adicionar uma dica de ferramenta para um celular usando seu processador, vocL primeiro precisa obter ou criar o renderiAador de clula. nt"o, depois de ter certeAa !ue o componente de renderiAa-"o um )Component , chamar a set*ool*ip*ext mtodo nele. B c.digo fonte est em *able8enderDemo.+ava . Acrescenta dicas de ferramentas para as clulas do sporte coluna com o seguinte c.digo( K K DefineFse dicas de ferramentas para as clulas do esporte.Default*ableCell8enderer renderiAador 2 novo Default*ableCell8enderer %'7 renderer%etToolTi"Te*t (DClic, "ara cai*a de combina#$oD);sportColumn.setCell8enderer %processador'7 mbora o texto de dica de ferramenta no exemplo anterior esttico, vocL tambm pode implementar dicas de ferramentas cu+o texto muda de acordo com o estado da clula ou programa. A!ui est"o algumas maneiras de faAer isso( Adicione um pouco de c.digo para a implementa-"o do processador do get*ableCell8endererComponent mtodo. /ubstituir o )*able mtodo get*ool*ip*ext %#ousevent' . *ableDialogditDemo usa um processador de cores, implementado em Color8enderer.+ava , !ue define o texto de dica de ferramenta usando o c.digo em negrito no seguinte trecho( public class Color8enderer estende )Rabel implementa *ableCell8enderer 3 ... pHblico Componente get*ableCell8endererComponent % #esa )*able, cor Bb+ect, is/elected boolean, boolean Mas=ocus, int linha, int coluna' 3 Cor novaCor 2 %colorida'7 ... etToolTi"Te*t (Dvalor REB:D F newColor%getRed () F D:D 5ewColor%getEreen F () F DD 5ewColor%getBlue F ()); devolver este7 66 A!ui est um exemplo do !ue a ponta da ferramenta se parece com( As clulas com dicas de ferramentas s"o no esporte e $egetariana colunas. A!ui est uma foto de sua dica de ferramenta( A!ui est o c.digo de *able*ool*ipsDemo.+ava !ue implementa as dicas de ferramentas para clulas do sporte e $egetariana colunas( #esa )*able 2 ne& )*able %ne& #@*able#odel %'' 3 K K Implementar as dicas de ferramentas de clula da tabela. public /tring get*ool*ip*ext %#ousevent e' 3 Cordas ponta 2 null7 +ava.a&t.>oint e.get>oint p 2 %'7 int ro&Index 2 ro&At>oint %p'7 int colIndex 2 columnAt>oint %p'7 int realColumnIndex 2 convertColumnIndex*o#odel %colIndex'7 if %realColumnIndex 22 9' 3coluna K K Desporto tip 2 4esporte favorito de esta pessoa4 T 4>articipar (4 T Get$alueAt %ro&Index, colIndex'7 6 lse if coluna %realColumnIndex 22 W' 3K K $eggie #odelo *able#odel 2 get#odel %'7 Cordas nome 2 %/tring' model.get$alueAt %ro&Index, <'7 Rast5ame /tring 2 %/tring' model.get$alueAt %ro&Index, ?'7 Joolean vegetariano 2 %Joolean' model.get$alueAt %ro&Index, W'7 if %Joolean.*8U.e!uals %vegetariano'' 3 tip 2 nome T 44 T last5ame T 4, um vegetariano47 6 lse 3 tip 2 nome T 44 T last5ame T 45"o um vegetariano47 6 6 lse 3K K outra coluna K K $ocL pode omitir esta parte se vocL sabe !ue n"o K K *emos processadores !ue fornecem sua pr.pria ferramenta K K Dicas. tip 2 super.get*ool*ip*ext %e'7 6 voltar ponta7 6 ...6 B c.digo bastante simples, exceto, talveA, para a chamada para convertColumnIndex*o#odel . ssa chamada necessria por!ue se o usurio move as colunas ao redor, o ndice da vista para a coluna n"o ir coincidir com o ndice do modelo para a coluna. >or exemplo, o usurio pode arrastar o $egetarian coluna %!ue o modelo considera no ndice W', por isso apresentado como a primeira coluna F em vista de ndice <. Desde prepare8enderer fornece o ndice de vista, preciso traduAir o ndice vista a um ndice de modelo, de modo !ue vocL pode ter certeAa !ue a coluna destinada foi selecionado. ?"eci)icando (ica de )erramenta "ara cabe#alho de coluna $ocL pode adicionar uma dica de ferramenta para um cabe-alho de coluna, definindo o texto de dica de ferramenta para a tabela do )*ableMeader . #uitas veAes, diferentes cabe-alhos de coluna re!uerem diferentes texto dica de ferramenta. $ocL pode mudar o texto, substituindo o cabe-alho da tabela get*ool*ip*ext mtodo.Alternativamente, vocL pode invocar *ableColumn.setMeader8enderer para fornecer um renderiAador personaliAado para o cabe-alho. Um exemplo de como usar o mesmo texto dica de ferramenta para todos os cabe-alhos de coluna *able/orterDemo.+ava . A!ui est como ele define o texto de dica de ferramenta( table.get*ableMeader %'. set*ool*ip*ext % 4Cli!ue para classificar7 /hiftF Cli!ue para classificar em ordem inversa4'7 $ocL vai ver as dicas de ferramentas !uando vocL passa o mouse sobre o cabe-alho de !ual!uer coluna, exceto para os dois primeiros. 5"o h dicas de ferramentas foram suppled para as colunas de nome, uma veA !ue parecia autoF explicativo. A!ui est uma foto de uma das dicas de ferramentas de cabe-alho de coluna( B c.digo a seguir implementa as dicas de ferramentas. Jasicamente, ele cria uma subclasse de )*ableMeader !ue substitui o get*ool*ip*ext %#ousevent' mtodo para !ue ele retorne o texto para a coluna atual. >ara associar o cabe-alho da tabela revista com a tabela, o )*able mtodo createDefault*ableMeader substitudo assim !ue ele retorna uma instGncia da )*ableMeader subclasse. protected /tring 01 2 3column*ool*ips null, K K 45ome4 assumiu .bvio null, K K 4Rast 5ame4 assumiu .bvio 4sporte favorito da pessoa para participar de4, 4B nHmero de anos !ue a pessoa tem desempenhado o esporte4, 4/e marcado, a pessoa n"o come carne467... #esa )*able 2 ne& )*able %ne& #@*able#odel %'' 3 ... K K Implementar tabela de dicas de ferramentas de cabe-alho. createDefault*ableMeader )*ableMeader protegido %' 3 return ne& )*ableMeader %column#odel' 3 public /tring get*ool*ip*ext %#ousevent e' 3 Cordas ponta 2 null7 +ava.a&t.>oint e.get>oint p 2 %'7 int index 2 column#odel.getColumnIndexAtd %px'7 int realIndex 2 . column#odel.getColumn %index' get#odelIndex %'7 voltar column*ool*ips 0realIndex17 6 67 667 Clai)icando e )iltrando *abela de classifica-"o e filtragem gerido por um classificador ob+eto. A maneira mais fcil para fornecer um ob+eto classificador definir autoCreate8o&/orterpropriedade acoplada a verdade ( )*able table 2 ne& )*able %'7table.setAutoCreate8o&/orter %true'7 ssa a-"o define um classificador de linha !ue uma instGncia de +avax.s&ing.table.*able8o&/orter . Isso fornece uma tabela !ue faA uma simples espcie especfica de localidade, !uando o usurio clica em um cabe-alho da coluna. Isso demonstrado no *able/ortDemo.+ava , como se vL nesta captura de tela( >ara ter mais controle sobre a triagem, possvel construir uma instGncia de *able8o&/orter e especificar !ue o ob+eto classificador para a sua mesa. *able8o&/orter e*able#odelf classificador 2 5e& *able8o&/orter e*able#odelf %table.get#odel %''7table.set8o&/orter %classificador'7 *able8o&/orter usa +ava.util.Comparator ob+etos para classificar suas linhas. Uma classe !ue implementa essa interface deve fornecer um mtodo chamadocomparar !ue define como dois ob+etos s"o comparados com a finalidade de classifica-"o. >or exemplo, o c.digo a seguir cria um comparador !ue classifica um con+unto de cordas pela Hltima palavra em cada string( Comparador e/tringf comparador 2 ne& e/tringf Comparator %' 3 public int compare %/tring s?, /tring s9' 3 /tring 01 2 strings? s?.split %4g g s4'7 /tring 01 2 /trings9 s9.split %4g g s4'7 voltar strings? 0strings?.length F ?1 . Compare*o %/trings9 0strings9.length F ?1'7 667 ste exemplo bastante simplista, mais tipicamente, um comparador de implementa-"o uma subclasse de +ava.text.Collator . $ocL pode definir sua pr.pria subclasse, use os mtodos de fbrica em Collator para obter um comparador para um local especfico, ou usar +ava.text.8uleJasedCollator . >ara determinar !ual Comparador de usar para uma coluna, *able8o&/orter tenta aplicar cada uma das seguintes regras, por sua veA. 8egras se+am seguidas na ordem listada abaixo, a primeira regra !ue fornece o classificador com um comparador usado, e as regras remainining ignorado. I. /e a compara-"o for especificado, invocando setComparator , usar essa compara-"o. II. /e os relat.rios modelo de tabela !ue os dados da coluna composta de cordas % *able#odel.getColumnClass retornos /tring.class para essa coluna', use um comparador !ue classifica as cordas com base na localidade atual. III. /e a classe coluna retornado por *able#odel.getColumnClass implementa comparveis , o uso de um comparador, !ue classifica as cordas com base nos valores devolvidos por Comparable.compare*o . I$. /e um conversor corda foi especificado para a tabela invocando set/tringConverter , use um comparador !ue classifica as representa-Zes string resultante com base na localiAa-"o atual. $. /e nenhuma das regras anteriores aplicar, use um comparador !ue invoca to/tring sobre os dados da coluna e classifica as se!hLncias resultantes com base na localiAa-"o atual. >ara os tipos mais sofisticados de triagem, subclasse *able8o&/orter ou sua classe pai +avax.s&ing.Default8o&/orter . >ara especificar a ordem de classifica-"o e tipo de precedLncia para as colunas, invocar set/ortie@s . A!ui um exemplo !ue classifica a tabela utiliAada nos exemplos por as duas primeiras colunas. A precedLncia das colunas do tipo indicado pela ordem das chaves de classifica-"o na lista de chave de ordena-"o. 5este caso, a segunda coluna tem a primeira chave de classifica-"o, de modo !ue as linhas s"o ordenadas pelo primeiro nome, depois o sobrenome. Rista /B8*ij/ e8o&/orter./ortie@f e8o&/orter./ortie@f 2 5e& Arra@Rist %'7sortie@s.add %novo 8o&/orter./ortie@ %?, /ortBrder.A/C5DI5G''7sortie@s.add %novo 8o&/orter./ortie@ %<, /ortBrder.A/C5DI5G''7sorter.set/ortie@s %/B8*ij/'7 Alm de reordenar os resultados, uma mesa de classificador tambm pode especificar !uais linhas ser"o exibidas. Isto conhecido como filtragem . *able8o&/orterimplementa filtragem utiliAando +avax.s&ing.8o&=ilter ob+ectos. 8o&=ilter implementa vrios mtodos de fabrica-"o !ue criam os tipos comuns de filtros. >or exemplo, regex=ilter retorna um 8o&=ilter !ue os filtros com base em uma express"o regular . 5o c.digo a seguir exemplo, vocL criar explicitamente um ob+eto classificador para !ue vocL possa mais tarde usFlo para especificar um filtro( #odelo #@*able#odel 2 ne& #@*able#odel %'7classificador 2 ne& *able8o&/orter e#@*able#odelf %modelo'7table 2 ne& )*able %modelo'7table.set8o&/orter %classificador'7 m seguida, filtrar com base no valor atual de um campo de texto( vaAio 5e&=ilter privada %' 3 8o&=ilter e#@*able#odel, Bb+ectf rf 2 null7 K K /e a express"o atual n"o analisa, n"o atualiAe. tr@ 3 rf 2 8o&=ilter.regex=ilter %filter*ext.get*ext %', <'7 6 Catch %+ava.util.regex.>attern/@ntaxxception e' 3 voltar7 6 sorter.set8o&=ilter %8='76 m um exemplo subse!hente, 5e&=ilter %' invocado toda veA !ue o texto muda de campo. ^uando o usurio digita expressZes regulares complicado, o tr@ ... catch impede a exce-"o de sintaxe de interferir com a entrada. ^uando uma tabela utiliAa um classificador, os dados dos utiliAadores vL pode estar em uma ordem diferente do !ue a especificada pelo modelo de dados, e podem n"o incluir todas as linhas especificadas pelo modelo de dados. Bs dados !ue o usurio realmente vL conhecida como a vis"o , e tem seu pr.prio con+unto de coordenadas.)*able fornece mtodos !ue convertem a partir do modelo coordena para ver as coordenadas F convertColumnIndex*o$ie& e convert8o&Index*o$ie& F e !ue converter de vista para as coordenadas modelo F convertColumnIndex*o#odel e convert8o&Index*o#odel . 54T&: Ao usar um classificador, lembreFse sempre de traduAir as coordenadas da clula. B exemplo a seguir reHne as idias discutidas nesta se-"o. *able=ilterDemo.+ava acrescenta um pe!ueno nHmero de mudan-as para *ableDemo . stes incluem os trechos de c.digo anteriores nesta se-"o, !ue fornecem um classificador para a mesa principal, e usar um campo de texto para fornecer a express"o regular de filtragem.A tela a seguir mostra *able=ilterDemo antes de !ual!uer classifica-"o ou filtragem foi feito. Bbserve !ue a linha ; do modelo ainda o mesmo !ue a linha ; na vis"o( /e o utiliAador clicar duas veAes sobre a segunda coluna, a !uarta linha tornaFse a primeira fila F mas apenas no modo de exibi-"o( Como observado anteriormente, o texto !ue o usurio digita no 4=iltro de *exto4 campo de texto define um filtro !ue determina !uais linhas s"o mostradas. *al como acontece com a classifica-"o, filtragem pode causar coordenadas vista a divergir coordenadas modelo( A!ui est o c.digo !ue atualiAa o campo de status para refletir a sele-"o atual( table.get/election#odel %'. addRist/electionRistener % novo Rist/electionRistener %' 3 public void valueChanged %evento Rist/electionvent' 3 int vie&8o& 2 table.get/elected8o& %'7 if %vie&8o& e<' 3 K K /ele-"o foi filtrada distGncia. status*ext.set*ext %44'7 6 lse 3 int model8o& 2 table.convert8o&Index*o#odel %vie&8o&'7 status*ext.set*ext % /tring.format %4linha selecionada em vista(._ D4 T 4Rinha selecionada no modelo(_ d.4 vie&8o&, model8o&''7 6 6 6'7 0ando uma cai*a de combina#$o como um editor Configurar uma caixa de combina-"o como um editor simples, como mostra o seguinte exemplo. A linha em negrito do c.digo configura a caixa de combina-"o como o editor de uma coluna especfica. *ableColumn sportColumn table.getColumn#odel 2 %' GetColumn %9'.7...)ComboJox comboJox 2 ne& )ComboJox %'7comboJox.addItem %4/no&boarding4'7comboJox.addItem %48emo4'7comboJox.addItem %4Chasing crian-as4'7comboJox.addItem %4$elocidade de leitura4'7comboJox.addItem %4high school nsino4'7comboJox.addItem %45one4'7 "ortColumn%etCell?ditor (novo (e)aultCell?ditor (comboBo*)); A!ui est uma foto do editor de caixa de combina-"o em uso( Usando outros editores /e vocL estiver configurando o editor para uma Hnica coluna de clulas %utiliAando o *ableColumn setCellditor mtodo' ou para um tipo especfico de dados %usando o )*able setDefaultditor mtodo', vocL pode especificar o editor usando um argumento !ue adere ao *ableCellditor interface. =eliAmente, oDefaultCellditor classe implementa essa interface e fornece construtores para !ue vocL especifi!ue um componente de edi-"o !ue um )*ext=ield , )ChecSJox , ou )ComboJox . 5ormalmente vocL n"o precisa especificar explicitamente uma caixa de sele-"o como um editor, uma veA !ue as colunas com booleanos dados usar automaticamente uma caixa de sele-"o renderer e editor. se vocL !uiser especificar um editor !ue n"o se+a um campo de texto, caixa ou caixa de combina-"o verificarb Como DefaultCellditor n"o suporta outros tipos de componentes, vocL deve faAer um pouco mais de trabalho. $ocL precisa criar uma classe !ue implementa a *ableCellditor interface. B AbstractCellditorclasse uma boa superclasse de usar. le implementa *ableCellditor cs superinterface, Cellditor , salvandoFlhe a dificuldade de implementar o evento de disparo c.digo necessrio para editores celulares. /ua classe editor clula precisa definir pelo menos dois mtodos F getCellditor$alue e get*ableCellditorComponent . B getCellditor$alue mtodo, exigido por Cellditor , retorna o valor atual da clula. B get*ableCellditorComponent mtodo, exigido por *ableCellditor , deve configurar e retornar o componente !ue vocL dese+a usar como o editor. A!ui est uma foto de uma mesa com um dilogo !ue serve, indiretamente, como um editor de celular. ^uando o usurio come-a a editar uma clula na cor favorita da coluna, um bot"o %o editor da clula true' aparece e traA o dilogo, com o !ual o usurio pode escolher uma cor diferente. A!ui est o c.digo, tirada Colorditor.+ava , !ue implementa o editor celular. public class Colorditor estende AbstractCellditor implementa *ableCellditor, ActionRistener 3 Cor currentColor7 Jot"o )Jutton7 )ColorChooser ColorChooser7 Dilogo )Dialog7 estticos DI* final /tring protegidos 2 4ditar47 Colorditor pHblica %' 3 bot"o 2 ne& )Jutton %'7 button.setActionCommand %DI*'7 button.addActionRistener %this'7 button.setJorder>ainted %false'7 K K Configure o dilogo !ue o bot"o abre. ColorChooser 2 ne& )ColorChooser %'7 dilogo 2 )ColorChooser.createDialog %bot"o, 4scolha uma cor4, true, K K modal ColorChooser, esta, K K manipulador do bot"o Bi null' K K 5"o Cancelar manipulador de bot"o 6 public void action>erformed %Actionvent e' 3 if %%DI*.e!uals e.getActionCommand %''' 3 K K B usurio clicou na clula, de modo K K Abrir o dilogo. button.setJacSground %currentColor'7 colorChooser.setColor %currentColor'7 dialog.set$isible %true'7 firediting/topped %' K K =aA o renderiAador reaparecer. 6 lse 3K K Usurio bot"o 4Bi4 da caixa de dilogo pressionado. currentColor colorChooser.getColor 2 %'7 6 6 K K Implementar o mtodo Cellditor !ue AbstractCellditor n"o. getCellditor$alue public Bb+ect %' 3 voltar currentColor7 6 K K Implementar o mtodo definido pela *ableCellditor. Componente pHblico get*ableCellditorComponent %tabela )*able, $alor do ob+eto, boolean is/elected, linha int, int coluna' 3 currentColor 2 valor %Cor'7 bot"o voltar7 66 Como vocL pode ver, o c.digo muito simples. A Hnica parte !ue um pouco complicado a chamada para firediting/topped no final do manipulador de a-"o do bot"o editor. /em essa chamada, o editor iria permanecer ativo, embora o dilogo modal n"o mais visvel. A chamada para firediting/topped deixa a mesa sabe !ue ele pode desativar o editor, permitindo !ue a clula ser tratado pelo renderiAador novamente. 0ando um editor de te*to "ara validar uu!rio Gntrodu/ido /e o editor padr"o de uma clula permite entrada de texto, vocL tem algum erro de verifica-"o de gra-a se o tipo da clula especificado como algo diferente de cordasou ob+eto . A verifica-"o de erros um efeito colateral de converter o texto digitado em um ob+eto do tipo ade!uado. A verifica-"o automtica de strings introduAidos pelo utiliAador ocorre !uando o editor padr"o tenta criar uma nova instGncia da classe associada com a coluna da clula.B editor padr"o cria este exemplo usando um construtor !ue leva uma se!hLncia como um argumento. >or exemplo, em uma coluna cu+as clulas tLm o tipo Integer , !uando o usurio digita em 4?9;4, o editor padr"o cria o correspondente Integer usando o c.digo e!uivalente a ne& Integer %4?9;4' . /e o construtor lan-a uma exce-"o, o contorno da clula fica vermelha e se recusa a deixar o foco se mover para fora da clula. /e vocL implementar uma classe usada como um tipo de dados da coluna, vocL pode usar o editor padr"o se sua classe fornece um construtor !ue recebe um Hnico argumento do tipo Cadeia . /e vocL gosta de ter um campo de texto como o editor de uma clula, mas !uer personaliAFlo F talveA para verificar introduAidos pelo utiliAador texto mais rigoroso ou reagem de forma diferente !uando o texto invlido F vocL pode alterar o editor clula para usar um texto formatado campo . B campo de texto formatado pode verificar o valor se+a continuamente en!uanto o usurio est digitando ou ap.s o usurio ter indicado o fim da digita-"o %como pressionando nter'. B c.digo a seguir faA com !ue o campo de texto formatado no editor para todas as colunas !ue contLm dados do tipo Integer . table.setDefaultditor %Integer.class, novo Integerditor %<, ?<<''7 B Integerditor classe implementada como uma subclasse de DefaultCellditor !ue utiliAa um )=ormatted*ext=ield veA do )*ext=ield !ueDefaultCellditor suporta. le faA isso em primeiro lugar a cria-"o de um campo de texto formatado para usar um formato inteiro e tLm os valores mnimo e mximo especificado, usando a A>I descrita em Como usar campos de texto formatados . m seguida, ele substitui a DefaultCellditor implementa-"o doget*ableCellditorComponent , getCellditor$alue e stopCellditing mtodos, acrescentando !ue as opera-Zes !ue s"o necessrias para os campos de texto formatados. A substitui-"o de get*ableCellditorComponent define o campo de texto formatado valor da propriedade %e n"o apenas o texto da propriedade !ue herda de)*ext=ield ' antes do editor mostrado. A substitui-"o de getCellditor$alue mantm o valor da clula como um Integer , em veA de, digamos, a longo valor !ue parser do campo de texto formatado tende a voltar. =inalmente, substituindo stopCellditing permite !ue vocL verifi!ue se o texto vlido, possivelmente parando o editor de serem demitidos. /e o texto n"o vlido, sua implementa-"o de stopCellditing colocaFse uma caixa de dilogo !ue d ao usurio a op-"o de continuar a editar ou reverter para o Hltimo valor bom. B c.digoFfonte um pouco longo demais para incluir a!ui, mas vocL pode encontrFlo em Integerditor.+ava. Gm"re$o )*able fornece uma A>I simples para mesas de impress"o. A maneira mais fcil de imprimir uma tabela invocar )*able.print sem argumentos( tr@ 3 if %I table.print %'' 3 /@stem.out.println %4cancelada impress"o do Usurio4'7 66 Catch %+ava.a&t.print.>rinterxception e' 3 /@stem.err.format %45"o possvel imprimir_ s_ n4, e.get#essage %''76 Invocando impress"o em um aplicativo normal balan-o traA uma caixa de dilogo de impress"o padr"o. %m uma aplica-"o sem cabe-a, a tabela simplesmente impresso.' B valor de retorno indica se o usurio foi adiante com o trabalho de impress"o ou cancelada. )*able.print pode +ogar+ava.a&t.print.>rinterxception , !ue uma exce-"o verificada , !ue por isso !ue o exemplo acima usa a tentar ... pegar . )*able fornece vrias sobrecargas de impress"o com vrias op-Zes. B seguinte c.digo de *able>rintDemo.+ava mostra como definir um cabe-alho de pgina( #essage=ormat cabe-alho 2 ne& #essage=ormat %4>gina 3<, number, integer64'7tr@ 3 table.print %)*able.>rint#ode.=I*PNID*M, header, null'76 Catch %+ava.a&t.print.>rinterxception e' 3 /@stem.err.format %45"o possvel imprimir_ s_ n4, e.get#essage %''76 >ara aplica-Zes de impress"o mais sofisticados, use )*able.get>rintable para obter uma impress"o ob+eto para a tabela. >ara mais informa-Zes sobre impress"o , consulte a impress"o li-"o no Grficos 9D trilha. Rimpando )*able DefaultTableModel.setNumRows(0); 0ando ComboBo* (JcomboBo*) na c1lula da ua tabela , possvel associar um )ComboJox %caixa de sele-"o' [ uma coluna da sua tabela. , uma forma de facilitar a vida do usurio. Ao invs do usurio digitar um valor para a clula 0ando ComboBo* (JcomboBo*) na c1lula da ua tabela , possvel associar um )ComboJox %caixa de sele-"o' [ uma coluna da sua tabela. , uma forma de facilitar a vida do usurio. Ao invs do usurio digitar um valor para a clula