Anda di halaman 1dari 17

DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...

Desenvolvimento de Aplicativos Desktop em Java


Utilizando Padrões - T5
◄ Seguir para... ►

P ro f. Anto nio P a s s o s ► DADP 05 ► R e curs o s ► Artig o - Ex p lo ra nd o e C us to m iza nd o o


JT a b le

Artigo Java Magazine 42 - Componentes Avançados do Swing

Componentes Avançados do Swing


Parte 2: Explorando e Customizando o JTable

A prenda a customizar um dos mais poderosos e flexíveis componentes do Swing

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.

A tela de Hosts / JTable


A te la de e x e m plo para e sta se gunda parte e x ibe um a re lação de hosts,
forne ce ndo inform açõe s com o o siste m a ope racional, o e nde re ço IP e o tota l de
m e m ória R AM. A re lação de hosts se rá arm aze nada e m um a cole ção, m ais
e spe cificam e nte um List, cujo conte údo se rá pré -fix ado pe lo código da aplicaçã o.
Para que o JTable se ja capaz de e x ibir e m linhas e colunas as inform açõe s
contidas ne sta cole ção, é ne ce ssário forne ce r um a classe de m ode lo que
im ple m e nta a inte rface TableModel. A Listagem 1 apre se nta a classe de m ode lo
criada e a aplicação de te ste s. O re sultado da sua e x e cução pode se r visto na
Figura 1.

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...

re turn host.ge tSo();


case 3:
re turn host.ge tMe m oriaR AM();
}
re turn null;
}
public List ge tHosts() {
re turn hosts;
}
public void se tHosts(List hosts) {
this.hosts = hosts;
}
}
JanelaPrincipal.java
pack age jtable ;
im port dados.Host;
im port java.util.*;
im port javax .swing.table .*;
public class Jane laPrincipal e x te nds javax .swing.JFram e {

private List hosts = ne w ArrayList();

public Jane laPrincipal() {


initC om pone nts();
}
public List ge tHosts() {
re turn hosts;
}
public void se tHosts(List hosts) {
tabe laHosts.se tMode l(ne w HostTable Mode l(hosts));
}

private void initC om pone nts() {


jScrollPane 1 = ne w javax .swing.JScrollPane ();
tabe laHosts = ne w JTable ();
se tDe faultC lose O pe ration(
java x .swing.W indowC onstants.DISPO SE_O N_C LO SE);
se tTitle ("Java Magazine - De m o do JTable ");
jScrollPane 1.se tVie wportVie w(tabe laHosts);
ge tC onte ntPane ().add(jScrollPane 1, java.awt.Borde rLayout.C ENTER );
pack ();
}

private javax .swing.JScrollPane jScrollPane 1;


private javax .swing.JTable tabe laHosts;
}
Principal.java

3 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...

pack age jtable ;


im port dados.Host;
im port dados.Siste m aO pe racional;
im port java.util.*;
public class Principal {
public static void m ain(String[] args) {
List hosts = ne w ArrayList();
hosts.add(ne w Host("se rvidor", "192.168.0.1", Siste m aO pe racional.LINUX, 2048));
hosts.add(ne w Host("fire wall", "192.168.0.2", Siste m aO pe racional.LINUX, 128));
hosts.add(ne w Host("contabilidade ", "192.168.0.11",
Siste m aO pe racional.W INDO W S, 256));
hosts.add(ne w Host("rh", "192.168.0.12", Siste m aO pe racional.W INDO W S, 512));
hosts.add(ne w Host("dire toria", "192.168.0.20", Siste m aO pe racional.W INDO W S,
512));
hosts.add(ne w Host("m ark e ting", "192.168.0.33", Siste m aO pe racional.MAC O SX,
1024));

Ja ne laPrincipal fram e = ne w Jane laPrincipal();


fram e .se tHosts(hosts);
fram e .se tVisible (true );
}
}

Figura 1. Prim e ira ve rsão do e x e m plo de JTable

A cla sse de m ode lo do JTable (HostTableModel) faz o m ínim o ne ce ssário para


m a pe ar as quatro proprie dade s da classe Host para as colunas da tabe la. De ta lhe s
visuais com o alinham e nto à e sque rda ou se paradore s de m ilhare s e m núm e ros
nã o são de pe nde nte s da classe de m ode lo (e m bora pude sse m se r facilm e nte
im ple m e ntados ne la). São de pe nde nte s da classe de visão, ou m ais
e spe cificam e nte , do re spe ctivo ce ll re nde re r.
Note que HostTableModel e ste nde A bstractTableModel, e não DefaultTableModel.
O m otivo é e vitar a ne ce ssidade de transform ar a lista de hosts e m um Vector de
Vectors de obje tos, com o e spe rado pe lo DefaultTableModel. C om classe s de
m ode lo, ao contrário do que aconte ce com classe s de cell renderers, e m ge ra l não
se e ste nde a classe padrão.
O s títulos das colunas são forne cidos pe la própria classe de m ode lo. E as
dim e nsõe s são calculadas autom aticam e nte pe lo JTable, que divide igualm e nte

4 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...

sua largura total e ntre e las.


A cla sse Principal (no pacote jtable) cria um a lista de Hosts e inicializa a classe
JanelaPrincipal (tam bé m e m jtable) para usar e ssa lista. A classe JanelaPrincipal,
ao re ce be r a lista de hosts (m é todo setHosts()) cria um HostsTableModel conte ndo
e sta lista. Todas as de m ais proprie dade s dos com pone nte s ficam com se us valore s
de fault.

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.

Configurando as colunas do JTable


A se gunda e tapa e nvolve de finir as dim e nsõe s das colunas de acordo com a
inform ação apre se ntada e m cada um a. A coluna “S.O .” só pre cisa se r larga o
suficie nte para e x ibir o ícone (e se u título, se e ste for m ais largo que o ícone ), e a
coluna “R AM” ne ce ssita te r e spaço para quatro ou cinco dígitos. A coluna “Nom e ”
ocupa o re stante da largura do com pone nte .
C alcular as larguras das colunas e m função da largura do te x to e x ige o uso da
classe java.awt.FontMetrics. Le m bre que a fonte utilizada pe la aplicação va ria
conform e a plataform a e o look -and-fe e l ativos, e ntão não daria ce rto fix ar a
dim e nsão e m pix e ls.
A Listagem 3 apre se nta as m odificaçõe s e m HostJTable para obte r o e fe ito
de se jado. Agora são criadas m anualm e nte várias instâncias de TableColumn, que

6 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...

são ane x adas ao DefaultTableColunModel[1] he rdado de JTable.

pack age jtable ;


//... im ports om itidos
public class HostJTable e x te nds JTable {

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);
}

public void se tHosts(List hosts) {


//... aqui e ntra o conte údo original do m é todo se tHosts()

fm = ge tFontMe trics(ge tFont());


adicionaC oluna(0, larguraEm Le tras(30), "Nom e ", true );
adicionaC oluna(1, larguraEm Digitos(16), "Ende re ço IP", true );
adicionaC oluna(2, ce llR e nde re r.ge tIconW idth(), "Sist.O pe r.", false );
adicionaC oluna(3, larguraEm Digitos(5), "R AM", false );
}
private void re calculaLarguraDasC olunas() {
if (ge tC olum nC ount() == 0)
re turn;
Table C olum n coluna;
coluna = ge tC olum nMode l().ge tC olum n(0);
coluna.se tW idth(larguraEm Le tras(30));
coluna = ge tC olum nMode l().ge tC olum n(1);
coluna.se tW idth(larguraEm Digitos(16));
coluna = ge tC olum nMode l().ge tC olum n(2);
coluna.se tW idth(ce llR e nde re r.ge tIconW idth());
coluna = ge tC olum nMode l().ge tC olum n(3);
coluna.se tW idth(larguraEm Digitos(5));
}

private void adicionaC oluna(int indice , int largura,


String titulo, boole an re size able ) {
int larguraTitulo = fm .stringW idth(titulo + " ");
if (largura < larguraTitulo)
largura = larguraTitulo;
Table C olum n colum n = ne w Table C olum n(indice , largura, null, null);
colum n.se tHe ade rValue (titulo);
colum n.se tR e sizable (re size able );
colum n.se tHe ade rR e nde re r(he ade rR e nde re r);
addC olum n(colum n);
}

7 de 17 07-08-2010 10:21
DADP05: Artigo - Explorando e Customizando o JTable http://www.antoniopassos.net/ead/mod/resource/vie...

private int larguraEm Le tras(int largura) {


int le tra = fm .stringW idth("M");
re turn largura * le tra;
}
private int larguraEm Digitos(int largura) {
int le tra = fm .stringW idth("0");
re turn largura * le tra;
}

public void se tFont(Font font) {


supe r.se tFont(font);
re calculaLarguraDasC olunas();
}
}
Fica e vide nte o cálculo da largura das colunas e m função da largura de se jada e da
largura dos títulos (para e vitar que um título longo se ja cortado e m um a coluna
e stre ita) na criação do com pone nte , m as o se u re cálculo e m setFont() não é tã o
claro. O m otivo é que , se um a aplicação configurar um a fonte alte rnativa para o
com pone nte (que não se ja o padrão do look -and-fe e l corre nte ), nada nos garante
que e sta fonte se rá configurada ante s ou de pois da cham ada a setHosts(). Se a
fonte for m odificada de pois de forne cida a lista de hosts, as larguras das colunas
pode rão de ix ar ile gíve l parte dos títulos ou das próprias cé lulas.
Agora que o com pone nte custom izado instancia se us próprios obje tos
TableColumn, o m é todo getColumnName() e o atributo colunas de HostTableModel
nã o se rão m ais utilizados e pode m se r de le tados. Alé m disso, é ne ce ssário
garantir que o JTable não irá criar autom aticam e nte as colunas base ando -se no
TableModel; por isso o construtor agora inclui a cham ada
setA utoCreateColumnsFromModel(false).

Caso seja configurado um TableCellRenderer como parte do TableColumn, serão


ignorados para esta coluna os TableCellRenderers associados a tipos de dados no
JTable.

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...

Figura 4. Te la de te ste de pois de configuradas as colunas do HostJTable

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.

Customizando os cabeçalhos do JTable


Finalizando e ste tutorial, vam os m odificar a aparê ncia dos cabe çalhos das colunas.
Para tal, de ve se r associado um TableCellRenderer ao obje to TableColumn
corre sponde nte . No e x e m plo se rá de finido um único ce ll re nde re r cham ado
MeuHeaderRenderer que configura as core s de fre nte e fundo do JLabel, dando
um m aior de staque ao cabe çalho. Esta classe tam bé m alinha o título da qua rta
coluna à dire ita, para que e le fique coe re nte com os valore s num é ricos da coluna.
O re sultado final pode se r visto na Figura 5 e o código na Listagem 4.

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() {}

public C om pone nt ge tTable C e llR e nde re rC om pone nt(


java x .swing.JTable table , O bje ct value ,
boole an isSe le cte d, boole an hasFocus, int row, int colum n)
{

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;

public void se tHosts(List hosts) {


headerRenderer = new MeuHeaderRenderer();
//...
}
private void adicionaC oluna(int indice , int largura, String titulo, boole an re size able )
{
Table C olum n colum n = ne w Table C olum n(indice , largura, null, null);
column.setHeaderRenderer(headerRenderer);
//...
}

Figura 5. R e sulta do da te rce ira e ta pa de custo m iza çã o so bre o JTable

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.

Figura 6. Arquite tura do co m po ne nte custo m iza do HostJTable.

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).

Figura Q2. C o m o tro ca r a cla sse de um co m po ne nte pa drã o do Swing pe la de um


co m po ne nte custo m iza do

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 .

Figura Q3. C o nfigura ndo um a pro prie da de via có digo Ja va

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...

Figura Q4. R e to rna ndo um a pro prie da de de um co m po ne nte a o se u va lo r de fa ult

O e fe ito é e lim inar, do código ge rado pe lo e ditor visual, a cham ada a


setNomeDaPropriedade(), de m odo que ne m o IDE ne m o usuário ne ce ssita
sabe r qual se ria o valor de fault.
Vale a pe na le m brar que as proprie dade s que foram m odificadas são
de stacadas e m ne grito na jane la de proprie dade s do e ditor visual.
Componentes e classes do Swing
Para e nte nde r o uso corre to de re cursos avançados do Swing, é im portante te r
claros os conce itos de classe e com pone nte no Java. Um com pone nte JavaBe a n,
se gundo a e spe cificação JavaBe ans, é “um componente reusável que pode ser
manipulado visualmente por uma ferramenta de desenvolvimento”. Poucas ve ze s é viáve l
inse rir toda a funcionalidade re que rida por um com pone nte de ntro de um a única
classe ; por isso a classe que o de se nvolve dor norm alm e nte ide ntifica com o se ndo
um “com pone nte ” é ape nas aque la que coorde na o trabalho de várias outra s para
forne ce r a funcionalidade de se jada.
As cla sse s que re pre se ntam obje tos visuais do Swing, com o javax.swing.JLabel,
javax.swing.JComboBox e javax.swing.JTable, na ve rdade são os “controladore s”
de ste s com pone nte s, de ntro da arquite tura MVC (Mode lo-Visão-C ontrolador).
C om pone nte s sim ple s com o um JButton pode m ne ce ssitar ape nas das re spe ctivas
classe s de visão e de m ode lo (no caso, javax.swing.plaf.ButtonUI e
javax.swing.ButtonModel). Mas com pone nte s com ple x os com o um JTable utilizam
um a sé rie de outras classe s de apoio [1], che gando ne ste caso a e x istir um pa cote
se pa rado javax.swing.table, ape nas para abrigar e ssas classe s.
A adoção da arquite tura MVC pe lo Swing (ve ja a Figura Q1) pe rm ite que
com pone nte s se jam adaptados a práticas de orie ntação a obje tos pre dom inante s,
pois o uso de classe s de m ode lo pe rm ite que várias e struturas de dados dife re nte s
se jam suportadas pe los com pone nte s. O de se nvolve dor não fica lim itado, por
e x e m plo, ao uso de bancos de dados re lacionais com o aconte ce com alguns
com pone nte s “data -aware ” de am bie nte s com o De lphi e VB.
O uso de MVC pe lo Swing tam bé m pe rm ite que os com pone nte s suporte m
m últiplas aparê ncias, com um a fle x ibilidade se m pre ce de nte s e m qualque r outro
am bie nte . Na ve rdade , pacote s de look -and-fe e ls alte rnativos, com o o TinyLAF e o
JGoodie s Look s (ve ja link s), forne ce m justam e nte classe s de visão alte rnativas
para os com pone nte s do Swing.

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.

Figura Q1. Uso da a rquite tura MVC pe lo Swing, e x e m plifica do pe lo co m po ne nte


JButto n

O de se nvolve dor vindo de am bie nte s visuais com o o De lphi ou o VB e spe ra

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.

Última atualização: domingo, 22 novembro 2009, 10:03


Vo cê a ce s s o u co m o He nriq ue d e P o nte s R ib e iro (Sa ir)

17 de 17 07-08-2010 10:21

Anda mungkin juga menyukai