You are on page 1of 28

Criando um grid em Java com JTable

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
&lterando 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
&lterando 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