Esta é parte final de um a sé rie que apre se nta conce itos e e x e m plos sobre o uso e
a custom ização de com pone nte s Swing avançados. Na prim e ira parte , foi
apre se ntado o com pone nte JComboBox, alé m dos conce itos de m ode los e cell
renderers do Swing. Vim os tam bé m com o re unir e ssas várias classe s para form ar
um com pone nte Swing custom izado. O s e x e m plos foram base ados e m um
protótipo de aplicação de m onitoração de re de , que e x ibe ícone s e spe cíficos pa ra
os siste m as ope racionais de cada host se ndo m onitorado, alé m de faze r uso de
vá ria s custom izaçõe s visuais dos com pone nte s.
Esta se gunda parte e nfoca o com pone nte JTable, utilizando o m e sm o protótipo
com o e x e m plo. O JTable re utiliza algum as das classe s do JComboBox e ne ce ssita
de vários m ode los e ce ll re nde re rs e spe cializados para lidar com a form atação de
cé lulas, colunas e cabe çalhos.
1 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
Para m ais de talhe s sobre a arquite tura do Swing e m ge ral e o re lacionam e nto e ntre
com pone nte s e os vários tipos de classe s que participam da sua im ple m e ntação,
consulte o quadro “C om pone nte s e classe s do Swing”. E no quadro “Dicas do
Ne tBe ans” apre se ntam os alguns re cursos ofe re cidos por e ste IDE livre para aux iliar
na custom ização de com pone nte s pe la criação de classe s e spe cializadas.
HostTableModel.java
pack age jtable ;
im port dados.Host;
im port dados.Siste m aO pe racional;
im port java.util.*;
im port javax .swing.table .*;
public class HostTable Mode l e x te nds AbstractTable Mode l {
private List hosts;
private String[] colunas = { "Nom e ", "Ende re ço IP", "S.O .", "R AM" };
public HostTable Mode l(List hosts) {
supe r();
se tHosts(hosts);
}
public int ge tC olum nC ount() {
re turn 4;
}
public int ge tR owC ount() {
re turn hosts.size ();
}
public String ge tC olum nNam e (int colum n) {
re turn colunas[colum n];
}
public O bje ct ge tValue At(int row, int colum n) {
Host host = hosts.ge t(row);
switch (colum n) {
case 0:
re turn host.ge tNom e ();
case 1:
re turn host.ge tIp();
case 2:
2 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
3 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
4 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
Alguns IDEs, por exemplo o NetBeans, criam o componente JTable já vinculado a uma
nova instância do DefaultTableModel, que é criada pelo próprio IDE para definir colunas e
valores iniciais para a tabela. Embora esta prática dê uma “sensação de programação
visual” mais forte ao JTable, ela interfere com o uso da classe de modelo customizada da
aplicação. Por isso, no nosso caso, a classe de modelo gerada pelo IDE deve ser
eliminada.
Para che gar ao re sultado visual de se jado da te la de hosts, ire m os passar por trê s
e ta pas:
Me
1. lhorar a aparê ncia das cé lulas da tabe la, inse rindo os ícone s de siste m a
ope racional e alinhando à dire ita a quantidade de m e m ória R AM;
C
2.onfigurar as larguras corre tas para as colunas;
Me
3. lhorar a aparê ncia dos cabe çalhos das colunas.
Para e nte nde r com o obte r e stas m e lhorias, pre cisam os conhe ce r m ais sobre a
arquite tura do JTable.
A rquitetura do JTable
Um JTable é form ado por um conjunto de cé lulas (cells) e um cabe çalho (header).
Ele re utiliza o ListSelectionModel do JList, m as de fine se us próprios m ode los (um
para colunas e o cabe çalho; outro para os dados no corpo). Tam bé m de fine um
tipo e spe cífico de ce ll re nde re r. A Figura 2 apre se nta um diagram a de classe s UML
com sua arquite tura sim plificada.
5 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
Figura 2. Arquite tura sim plificada do JTable do Swing. Fo ra m o m itida s a s cla sse s
de visã o do co m po ne nte . C la sse s e m a m a re lo sã o cria da s e spe cifica m e nte pa ra o
JTable, e nqua nto que a s cla sse s e m ro sa sã o re utiliza da s de o utro s co m po ne nte s
Swing.
Caso se deseje formatar o número inteiro com separadores de milhares, deve-se criar um
novo TableCellRenderer, associado à classe Integer (ou então a Number), que utiliza
um DecimalFormat (pacote java.text) para formatar o texto do JLabel.
6 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
FontMe trics fm ;
public HostJTable () {
se tAutoC re ate C olum nsFrom Mode l(false );
se tAutoR e size Mode (JTable .AUTO _R ESIZE_O FF);
}
7 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
De sta ve z, as larguras iniciais das colunas são pré -fix adas, e ntão não de se ja m os
que o JTable calcule as suas larguras. Por isto te m os a cham ada a
setA utoResizeMode(JTable.A UTO_RESIZE_OFF) tam bé m no construtor.
O re sultado até o m om e nto pode se r confe rido na Figura 4.
8 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
Caso se deseje que as colunas se auto-expandam para ocupar toda a largura da tabela, em
vez de deixar espaço vazio se a tabela for mais larga que suas células (ou uma barra de
rolagem caso ela seja mais estreita) deve-se manter a propriedade autoResizeMode com
o valor default e definir as propriedades maxWidth e minWidth das colunas que não se
deseja que sejam expandidas ou comprimidas.
MeuHederRenderer,java
pack age jtable ;
//... im ports om itidos
public class Me uHe ade rR e nde re r e x te nds De faultTable C e llR e nde re r {
public Me uHe ade rR e nde re r() {}
9 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
JLabe l labe l = (JLabe l)supe r.ge tTable C e llR e nde re rC om pone nt(
table , value , isSe le cte d, hasFocus, row, colum n);
labe l.se tBorde r(ne w Line Borde r(C olor.LIGHT_GR AY, 1));
labe l.se tFore ground(C olor.LIGHT_GR AY);
labe l.se tBack ground(C olor.DAR K_GR AY);
if (colum n == 3)
labe l.se tHorizontalAlignm e nt(JLabe l.R IGHT);
e lse
labe l.se tHorizontalAlignm e nt(JLabe l.C ENTER );
re turn labe l;
}
}
HostJTable.java
private Me uHe ade rR e nde re r he ade rR e nde re r;
Te m os e ntão um com pone nte custom izado, cham ado HostJTable, cuja arquite tura
10 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
é apre se ntada na Figura 6. É inte re ssante com parar e ste diagram a com a Figura 6
da prim e ira parte , que apre se nta a arquite tura do SistemaOperacionalJComboBox,
o com pone nte criado sobre o JComboBox. Fica visíve l que , ape sar do novo
com pone nte JTable te r m ais classe s e nvolvidas, os dois com pone nte s
custom izados se gue m a m e sm a arquite tura básica.
Conclusões
O uso dos com pone nte s visuais do Swing é be m dife re nte dos com pone nte s visuais
de IDEs R AD com o De lphi e VB. No Swing, e spe ra -se que o de se nvolve dor e scre va
código e crie novas classe s para custom izar o com portam e nto dos com pone nte s,
e m ve z de se lim itar à e dição de proprie dade s.
A ada ptação a e sta nova filosofia de trabalho não é im e diata, m as os re sultados
com pe nsam . No final das contas, um a aplicação Java com inte rface gráfica irá
conte r um a grande quantidade de com pone nte s custom izados, e o be ne fício se rá
se ntido pe la re utilização de código. As próx im as te las que ne ce ssitare m de
com pone nte s se m e lhante s pode rão se r construídas pe la sim ple s re fe rê ncias aos
com pone nte s criados ante riorm e nte , e m ve z de se re pe tir o proce sso m anual de
11 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
configuração das proprie dade s. Tam bé m ajuda o fato de que criar novos
com pone nte s e m Java é m uito m ais sim ple s do que e m outros am bie nte s de
progra m ação visual.
Se ria possíve l criar com pone nte s ge né ricos com alguns dos re cursos apre se nta dos
ne ste tutorial, utilizando os re cursos de re fle x ão do Java. Na ve rdade e x iste m
proje tos com e sta proposta, com o o SwingX e o SwingLabs do Java.Ne t (ve ja
re fe rê ncias), alé m de fram e work s de de se nvolvim e nto de aplicaçõe s visuais com o
os forne cidos pe la Plataform a Ne tBe ans (não confundir com o IDE) e o JGoodie s
Form s.
Infe lizm e nte a m aioria dos IDEs Java ainda não e stá be m adaptada à
custom ização de com pone nte s pe la criação de novas classe s. Afinal e le s não
pode m se guir os m ode los dos IDEs visuais não -Java, e com o foco da com unida de
Ja va ainda é m aior na e dição Ente rprise , os e sforços e m te rm os de fe rram e nta s
visuais de ix aram a de se jar. Mas a situação e stá m udando, com o pode m os ve r por
e x e m plo nas últim as ve rsõe s do Ne tBe ans.
Para o le itor que de se ja se aprofundar, o quadro “Para sabe r m ais” no final do
artigo indica alguns artigos e m e diçõe s ante riore s da Java Magazine que fala m
sobre de se nvolvim e nto Swing e sobre o Ne Be ans.
Dicas do NetBeans
O Ne tBe ans possui um a sé rie de re cursos que facilitam o de se nvolve dor a lidar com
o código de custom ização de com pone nte s Swing de ntro do e ditor visual. Aqui
re la cionam os alguns de sse s re cursos:
l É possíve l substituir um com pone nte Swing qualque r por um a subclasse ,
e ntrando na aba “C ode ” das proprie dade s do com pone nte e m odificando a
proprie dade “C ustom C re ation C ode ” (Figura Q2).
l O de se nvolve dor que não gosta de “re m e ndar” o m é todo construtor das
12 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
classe s visuais, inse rindo código após a cham ada a initComponents() criada
pe lo Ne tBe ans, pode usar as proprie dade s “Post-C re ation C ode ” e “Post-Init
C ode ”, que tam bé m pode m se r vistas na Figura Q2.
l Todas as proprie dade s de qualque r com pone nte pe rm ite m o ace sso ao e ditor
de proprie dade s no m odo “Form C onne ction” (Figura Q3) pe lo botão de
re ticê ncias à dire ita do valor da proprie dade .
Ne ste e ditor, e stá disponíve l o auto -com ple tam e nto de código e o re a lce de
sintax e , com o no e ditor de código do Ne tBe ans. Mas não são apontados
e rros de sintax e ou re fe rê ncias a ide ntificadore s não de finidos, que só se rão
apontados durante a com pilação.
Ironicam e nte , um clique na m e nsage m de e rro de com pilação irá abrir o
e ditor de código do Ne tBe ans na linha que conté m o e rro. Mas com o e la foi
e ditada pe lo e ditor visual, não se rá possíve l m odificá -la (e corrigir o e rro)
pe lo e ditor de código.
l C aso o valor de um a proprie dade te nha sido m odificado inadve rtidam e nte por
você (ou e ntão pe lo próprio IDE), é possíve l re tornar ao se u valor de fa ult,
qualque r que se ja e le , pe lo m e nu de conte x to (botão dire ito) da proprie da de
(Figura Q4).
13 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
14 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
Um de talhe im portante é que m uitos dos com pone nte s do Swing e spe ram que o
de se nvolve dor crie suas próprias classe s de m ode lo. Ao contrário do que aconte ce
e m outros am bie nte s, onde todos os dados são re duzidos a strings e núm e ros
para e x ibição e e dição pe los com pone nte s visuais, o Swing e spe ra lidar com os
próprios obje tos de dom ínio da aplicação.
No ca so de com pone nte s que re pre se ntam ape nas dados sim ple s, por e x e m plo
JCheckBox, JLabel ou um JTextField (ou m e sm o um JFormattedTextField), as
classe s de m ode lo padrão do Swing se rão suficie nte s para o de se nvolve dor, que
ne m irá tom ar conhe cim e nto de sua e x istê ncia.
Ma s a situação m uda quando se utilizam com pone nte s que re pre se ntam cole çõe s
de valore s, com o um JList, JComboBox ou JTree, ou de com pone nte s que
pe rm ite m a visualização de várias proprie dade s de um m e sm o obje to, com o um
JTable. Ne ste s casos, é e sse ncial a criação de classe s de m ode lo para faze r o
m a pe am e nto e ntre as proprie dade s dos obje tos e a sua e x ibição visual pe lo
com pone nte .
Quanto mais complexo o componente, menor a utilidade das classes de modelo padrão do
Swing, como DefaultTableModel. Isto porque o uso destas classes exige a conversão dos
dados do modelo de dados da aplicação para o modelo do Swing. O consumo de memória e
o tempo de processamento podem ser significativos.
15 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
custom izar todo o com portam e nto dos com pone nte s visuais pe la sim ple s e dição de
proprie dade s. Se algo não pode se r fe ito por m e io de las, o de se nvolve dor busca
um outro com pone nte no m e rcado que te nha a opção de se jada, ou conside ra que
a custom ização se ja im possíve l. Mas os com pone nte s Swing e spe ram se r
custom izados pe la substituição ou e spe cialização dos se us obje tos de apoio. O
Swing de fine inúm e ras inte rface s e classe s abstratas com e ste propósito. O
re sultado é que , para tirar prove ito de todo o pote ncial do Swing, o de se nvolve dor
pre cisará sair do e ditor visual de inte rface s e voltar ao e ditor de código.
O foco do Swing e m código e de sign patte rns e m ve z da de finição visual por m e io
de proprie dade s ge ra a fam a de “difícil” Java no de sk top e m re lação a outra s
fe rra m e ntas de de se nvolvim e nto visuais. Por outro lado, traz o be ne fício de que o
de se nvolve dor não fica pre so aos re cursos de um IDE e m particular. É possíve l
m igra r o código para outro IDE se m ne ce ssidade de re trabalho; ou até m e sm o
m e sclar com pone nte s construídos e m dife re nte s IDEs.
Para Saber Mais
Componentes Avançados do Swing, Fernando Lozano, Ed. 41
Apre se nta a custo m iza çã o de um co m po ne nte JC o m bo Bo x e o s co nce ito s de
m o de ls e re nde re s do Swing
Explorando o NetBeans 5, Fernando Lozano, Ed. 32
De scre ve o s no vo s re curso s de e diçã o visua l de inte rfa ce s do Ne tBe a ns 5, a tra vé s
de um a a plica çã o co m ple ta
Aplicação Completa com NetBeans, Fernando Lozano, Ed. 25, 26 e 27
De scre ve pa sso a pa sso a co nstruçã o de um a a plica çã o de “Lista de T a re fa s”
usa ndo o s re curso s do Ne tBe a ns e o ba nco de da do s HSQ LDB
Datas com Swing, Fernando Lozano, Ed. 28
De scre ve o uso do s co m po ne nte s do Na cho C a le nda r pa ra Swing, inclusive co m o
a dicio na -lo s a o pa lle te do Eclipse VE e do Ne tBe a ns
Formulários com Swing, Bruno Souza, Ed.14
Ex plica o s co nce ito s re la cio na do s co m o s La yo ut Ma na ge rs do AW T /Swing
Links
j ava.sun.com/docs/books/tutorial/uiswing/components
T rilha do Ja va T uto ria l so bre co m po ne nte s Swing
muntj ak.de/hans/j ava/tinylaf
P á gina o ficia l do T inyLAF
j goodies.dev.j ava.net
P á gina o ficia l do JGo o die s
napkinlaf.sf.net
P á gina o ficia l do Na pk in LAF
swinglabs.org
P á gina o ficia l do SwingX, co njunto de co m po ne nte s custo m iza do s pa ra Swing
netbeans.org
P á gina o ficia l do Ne tBe a ns IDE e da P la ta fo rm a Ne tBe a ns
16 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...
[1] No có digo e sta m o s supo ndo que o íco ne se m pre se rá m a is a lto do que a fo nte
de te x to do co m po ne nte , o que po de rá nã o se r ve rda de e m a lgum LAF
custo m iza do , o u ca so o usuá rio custo m ize o se u te m a de á re a de tra ba lho pa ra
usa r fo nte s m uito gra nde s.
[2] O m é to do a ddC o lum n() de JT a ble de le ga pa ra o m é to do co rre spo nde nte e m
T a ble C o lum nMo de l, que po r de fa ult é um a instâ ncia de De fa ultT a ble C o lum nMo de l
[3] O le ito r co m co nhe cim e nto de de sign pa tte rns irá re co nhe ce r vá rio s o utro s
pa drõ e s a lé m do MVC na im ple m e nta çã o do s co m po ne nte s do Swing,
e spe cia lm e nte Fa ca de , Ada pto r, De le ga te e Stra te gy. Ma s, pa ra to rna r e sta sé rie
m a is sim ple s pa ra o inicia nte s, o m itim o s a a pre se nta çã o fo rm a l de ste s de sign
pa tte rns.
17 de 17 07-08-2010 10:21