You are on page 1of 76

Relatrios Eclipse Interfaces grficas JGoodies Struts AJAX

A Revista da Comunidade Java Brasileira

AJAX fcil com GWT


Usando o Google Web Toolkit para
a criao produtiva de aplicaes AJAX

Google Search API


Fazendo pesquisas no Google
a partir de suas aplicaes Java
Edio 38 - Ano V - R$ 9,90

Conversores no Struts
Estenda o framework para garantir
a converso e a formatao de dados

Datas com Swing

GUIs com Qualidade


Boas prticas para a criao de interfaces
grficas e uma introduo ao JGoodies

Usando componentes para


manipulao de datas e calendrios
em aplicaes desktop

Eclipse Callisto
Conhea o novo projeto do Eclipse.org
que simplifica a vida do desenvolvedor

Relatrios
&
Grcos

Usando o Eclipse BIRT para


criar relatrios completos
no Eclipse, passo a passo
jm38.indb 1

Agrupamentos,
totalizaes e grficos com
JasperReports e iReport
17/7/2006 14:07:33

jm38.indb 2

17/7/2006 14:07:45

Contedo

EXPLORANDO O CD
PRODUTOS ORACLE
Passos para instalao do JDeveloper
10g, Oracle Containers for J2EE e
Oracle Database Express Edition,
includos no CD-ROM.

Sees

10
CAFENA
LEONARDO GALVO
Aprendendo programao OO com Greenfoot; Shale
e Tapestry top-level; novos Groovy, Geronimo e WTK

08

BUSCAS COM A GOOGLE SEARCH API


JULIO FAERMAN

Google

Como usar a API do Google para realizar pesquisas na web, fazer


correes ortogrficas e obter pginas do cache

AJAX FCIL COM GOOGLE WEB TOOLKIT


DOUGLAS JOS RODRIGUES
Conhea as tecnologias e ferramentas do Google que tornam
extremamente produtivo o desenvolvimento de aplicaes AJAX

RELATRIOS E GRFICOS NO ECLIPSE


OSVALDO PINALI DOEDERLEIN
Usando o Eclipse BIRT para criar relatrios completos e grficos
comerciais dentro do IDE mais popular do mercado

60

64

22

Capa

MAIS RELATRIOS PASSO A PASSO


ANA ABRANTES E YARA SENGER
Definindo agrupamentos, calculando totais em vrios nveis
e criando grficos de resumo com JasperReports e iReport

DATAS NO DESKTOP

Desktop

FERNANDO LOZANO
Manipulao de datas em aplicaes Swing usando componentes de
calendrio do projeto NachoCalendar, e conceitos sobre JavaBeans e MVC

GUIS COM QUALIDADE, PARTE 1


HUGO VIDAL TEIXEIRA
Tcnicas e boas prticas para o projeto de interfaces grficas e
implementao com a API JGoodies Forms

Eclipse

Web

CONVERSO E FORMATAO NO STRUTS

jm38.indb 3

ARI DIAS NETO


Estendendo o framework para definir conversores personalizados e
garantir a formatao de nmeros e datas

PROJETO CALLISTO
FERNANDO LOZANO
Detalhes sobre o novo projeto da Fundao Eclipse, que simplifica a
instalao de dez plug-ins fundamentais do Eclipse.org

36

12

44

68

56

17/7/2006 14:09:05

Esp a

Ano V Edio 38 2006 ISSN 1676-8361

Direo
Diretor Editorial Leonardo Galvo
Diretor de Marketing Gladstone Matos
Diretor Comercial Casseano Filho

Edio
Publisher e Editor-Chefe
Leonardo Galvo (leonardo@javamagazine.com.br)
Editores-Adjuntos
Fernando Lozano (lozano@javamagazine.com.br)
Osvaldo Doederlein (osvaldo@javamagazine.com.br)
Colaboraram nesta edio
Ana Abrantes, Ari Dias Neto, Douglas Jos Rodrigues,
Fernando Lozano, Hugo Vidal Teixeira, Julio Faerman,
Leonardo Galvo, Osvaldo Doederlein, Yara Senger

Arte
Diretor de Arte Tarcsio Bannwart (phdesign@phdesign.com.br)
Diagramao Jaime Peters Junior, Lais Pancote e Tersis Zonato
Ilustraes Felipe Machado e Francisco Peixoto

Produo
Gerncia de Marketing Kaline Dolabella
Distribuio
Fernando Chinaglia Distribuidora S.A.
Rua Teodoro da Silva, 907, Graja - RJ
CEP 20563-900, (21) 3879-7766 - (21) 2577-6362

Atendimento ao leitor
A DevMedia possui uma Central de Atendimento on-line, onde voc pode
tirar suas dvidas sobre servios, enviar crticas e sugestes e falar com um
de nossos atendentes. Atravs da nossa central tambm possvel alterar
dados cadastrais, consultar o status de assinaturas e conferir a data de envio
de suas revistas. Acesse www.devmedia.com.br/central, ou se preferir
entre em contato conosco atravs do telefone 21 2283-9012.

Edies anteriores
Adquira as edies anteriores da revista Java Magazine ou de qualquer outra
publicao do Grupo DevMedia de forma prtica e segura, em
www.devmedia.com.br/anteriores.

Publicidade
publicidade@javamagazine.com.br, 21 2213-0940
Anncios Anunciando nas publicaes e nos sites do Grupo DevMedia,
voc divulga sua marca ou produto para mais de 100 mil desenvolvedores
de todo o Brasil, em mais de 200 cidades. Solicite nossos Media Kits, com
detalhes sobre preos e formatos de anncios.
Reprints Editoriais Se foi publicado na Java Magazine um artigo que
possa alavancar as suas vendas, multiplique essa oportunidade! Solicite a
reimpresso da matria junto com a capa da edio em que saiu, e distribua
esse reprint personalizado entre seus clientes.
Encarte de CDs Faa como nossos maiores anunciantes. Encarte um CD
com uma amostra de seus produtos na Java Magazine e atinja um pblico
segmentado e formador de opinio.
Realizao

t poucos anos atrs, o suporte a relatrios em Java se encontrava muito aqum


do oferecido em outras plataformas. Mas a tecnologia evoluiu muito, e hoje
nos deparamos com a situao oposta: h diversas opes de qualidade e at
mesmo dificuldade para escolher a melhor alternativa para cada caso. Esta edio traz
dois artigos com enfoque na criao de relatrios. Um tutorial completo com diversos
exemplos apresenta e explora o Eclipse BIRT, um conjunto de ferramentas que estende
o IDE Eclipse oferecendo uma soluo integrada para a criao de grficos e relatrios.
O segundo artigo destacado volta-se ao par de ferramentas iReport/JavaReports,
mostrando como criar totalizaes, agrupamentos e grficos. O texto demonstra
recursos mais avanados dessas ferramentas, tratando de necessidades comuns em
relatrios no-triviais.
Freqentemente dizemos aqui que a tecnologia Java est ganhando fora no segmento
de aplicaes desktop. Esse movimento continua firme, com vrias lacunas sendo preenchidas por ferramentas e APIs que no param de melhorar. So exemplos disso os
projetos do JGoodies: h desde look-and-feels bem projetados at solues completas
de binding, alm de um popular gerenciador de layouts includo na API JGoodies
Forms. Esta API o assunto de um artigo sobre criao de GUIs, que tambm trata de
tcnicas fundamentais para o projeto de interfaces grficas, passando gradualmente
da teoria prtica.
Ainda no desktop, voc ver como incrementar suas aplicaes Swing com os componentes NachoCalendar, que simplificam a entrada de datas, so muito configurveis
e podem dar um toque especial e profissional s suas aplicaes desktop. O artigo
apresenta detalhes sobre os componentes, e como fazer a instalao no Eclipse e no
NetBeans. Discute tambm questes importantes no desenvolvimento para o ambiente
desktop, como caractersticas dos JavaBeans e o modelo MVC no Swing.
Na edio anterior, o artigo 10 Mais do Eclipse 3.2 colocou na primeira posio o
Projeto Callisto, uma importante iniciativa que resolve problemas comuns de instalao
e versionamento no Eclipse. Nesta edio so mostrados mais detalhes sobre o projeto,
incluindo o processo de instalao e possveis problemas e solues.
Temos ainda um artigo que explica como estender o Struts, criando e registrando
conversores para processar a entrada de dados e garantir uma formatao apropriada.
Alm de conhecer o uso de converters no framework, voc aprende tcnicas que permitem mudar o funcionamento interno do Struts e resolver problemas sutis.
As tecnologias do Google aparecem aqui em dose dupla, com artigos sobre o Google
Web Toolkit e a Google Search API. Lanado durante o JavaOne 2006, o GWT torna
possvel a criao de aplicaes AJAX rapidamente usando cdigo Java. J a API de
pesquisas do Google permite integrar o maior mecanismo de busca mundial s suas
aplicaes.

Apoio

Boa leitura!
Leonardo Galvo
Parceiros

jm38.indb 4

17/7/2006 14:10:00

p ao do Leitor
Iniciando com Java

ostaria de orientaes sobre como iniciar com


Java, sem que o conhecimento de conceitos
fundamentais possa passar despercebido e
me faltar no futuro. Por onde devo comear?
William de Jesus Rende
A tecnologia Java tem vriassub-reas,com cada
uma formando um universo de conhecimentos
bastante independente. O caminho do aprendizado vai depender muito, portanto, da rea em
que voc pretende se especializar. Porm, alguns
conhecimentos e ferramentas sero essenciais em
todos os casos.
Comece fazendo o download do JDK (Java SE Development Kit) em java.sun.com/javase/downloads.
A verso estvel mais atual a 5.0. Somente com
o JDK, voc j poder criar aplicaes que usam
centenas de recursos, desde a leitura e escrita de
arquivos, a operaes avanadas de rede, passando pelo acesso a bancos de dados relacionais e a
criao de interfaces grficas completas.
Voc pode passar muito tempo apenas usando o
JDK, mas ter mais facilidade de evoluir no aprendizado se tiver instalado tambm um IDE um
ambiente integrado de desenvolvimento.Todo IDE
Java inclui pelo menos um editor de cdigo e um
depurador visual (para execuo passo a passo de
programas, inspeo de variveis e objetos etc.);
a maioria vem tambm com um editor visual de
interfaces e vrios recursos auxiliares que facilitam
o desenvolvimento, como funcionalidades para
manipulao de bancos de dados e integrao

com ferramentas e servidores.


H uma variedade imensa de IDEs disponveis.
Entre os open source, destacam-se o Eclipse
(eclipse.org) e o NetBeans (netbeans.org). Entre os
comerciais, h vrios populares, como o JDeveloper
da Oracle (oracle.com/technology/products/jdev;
gratuito para uso comercial e includo no CD desta
edio), o JBuilder da Borland (borland.com/jbuilder;
tambm com verso gratuita, mas com restries),
o Rational Application Developer da IBM (ibm.
com/software/awdtools/developer/application), e o
IntelliJ IDEA (jetbrains.com/idea). A maioria dos IDEs
j vem com tudo que necessrio para desenvolver com Java, mas vale a pena ter o JDK parte, por
exemplo, para executar e testar outras aplicaes
Java (alm disso, alguns IDEs, como o NetBeans,
exigem que um JDK esteja instalado).
Com o JDK e um IDE, voc est pronto para desenvolver praticamente qualquer tipo de aplicao
Java. O prximo passo conhecer a linguagem e
suas APIs. H vrios sites dedicados a desenvolvedores Java na web, inclusive em portugus, como
portaljava.com.br e devmedia.com.br/javamagazine. Em ingls, alguns portais se destacam, como
java.net, onjava.com, java.com e javaranch.com.
Outra fonte rica de informaes so as listas de
discusso do grupo de usurios SouJava (cadastrese em soujava.org.br).
Na Java Magazine, j publicamos dezenas de
artigos voltados ao desenvolvedor iniciante. A srie
Aplicao Java Completa nas Edies 25, 26 e 27,
por exemplo, citada e usada pelos leitores at

hoje e mostra como


criar uma
aplicao
com o NetBeans, do incio ao fim. Temos ainda
artigos identificados como Primeiros Passos em
vrias edies, e textos sobre vrias tecnologias
importantes do Java, como Swing, JSP, Servlets
e JDBC.
Quanto a livros, a srie Head First Javada OReilly,
j traduzida para portugus (com ttulo "Use a Cabea"), excelente para o aprendizado da linguagem. Comece comUse a Cabea! Java(Alta Books),
que cobre toda a sintaxe do Java e suas principais
APIs, de forma clara, prtica e inovadora.
Depois de conhecer a sintaxe da linguagem e
as APIs fundamentais, abre-se muito o leque de
opes de aprendizado. Voc poderia, por exemplo, decidir se especializar em programao web.
Neste caso, vale a pena conhecer Struts, JSP, JSF,
Servlets e AJAX. J se seu foco no Java corporativo (enterprise), ser importante conhecer EJB,
JMS, JNDI e outras tecnologias do Java Enterprise
Edition. Em ambos os casos, valer a pena dominar
ferramentas muito usadas, como Ant e Hibernate.
Se voc pretende desenvolver para celulares,
vai precisar conhecer o MIDP e suas muitas APIs,
como GCF, LCDUI e MMAPI, e instalar emuladores
para os dispositivos alvo. Neste ponto, como se
v, a deciso por qual caminho seguir depender
muito mais de suas necessidades, e talvez do que
o mercado pede em sua regio.

Edio 38 Java Magazine

jm38.indb 5

17/7/2006 14:10:09

Espao do Leitor
JDBC
Quero parabenizar toda a equipe de Java Magazine pelo excelente trabalho de contedo e de
visual da revista. Os artigos sobre JDBC nas edies
25 e 26 (Persistncia Turbinada) so excelentes, e
ajudaram a esclarecer muitas questes.
Carlos Eduardo Privati

Correo na Edio 36
Ao me deparar com um trecho de cdigo na pgina 22 da Ediao 36 (artigo Qualidade Aplicada),
no cdigo referente escolha de polimorfismo ao
switch, h uma linha desta forma:
public class Cliente { public abstract void venda(); }

Essa classe no deveria ser abstrata, e por conseqncia ela no poderia ser instanciada?
Fbio Jos Fernandes
Realmente, houve um erro neste trecho de
cdigo: Cliente deveria ser abstract. J a primeira
verso da classe Cliente mostrada no artigo,
com um atributo int tipo, concreta. Quanto a
no permitir instanciao, era essa a inteno

mesmo. Somente os subtipos concretos como


ClienteSimples e ClienteEspecial seriam instanciveis
no segundo exemplo. Mas note que isso no impede que a invocao cliente.venda() funcione.
Osvaldo Doederlein

Pools
Em aplicaes que processam vrias requisies
ao mesmo tempo e exigem mltiplas conexes
com o banco de dados, fica clara a necessidade
de um pool de conexes. Existem vrias APIs que
prometem resolver o problema, mas para quem
iniciante na tecnologia fica difcil avaliar o melhor
caminho. Vocs podem dar algumas sugestes?
Carlos Eduardo Privati
A princpio, voc no precisaria se preocupar
com isso, pois hoje em dia a grande maioria das
aplicaes Java que acessam SGBDs diretamente, se forem construdas segundo um paradigma
multicamadas, utilizam servidores Java EE para o
back-end (servidor). Em qualquer servidor Java
EE, desde um produto open source e limitado
web como o Tomcat at um servidor Java EE
completo como o JBoss ou Weblogic, voc pode
utilizar o recurso de DataSources, que encapsu-

lam conexes ao banco de dados e j incluem


o suporte a pools.
Somente se no quiser ou no puder usar
um servidor Java EE, voc precisar se preocupar com pools de conexes (e com outros
pools, como os de threads). Se for esse o caso,
d uma olhada no Jakarta Commons DBCP
(jakarta.apache.org/commons/dbcp). O DBCP
construdo sobre outro projeto do Jakarta, o
Commons Pool, que permite construir tipos de
pools adicionais.

Participe!
Envie sua dvida, comentrio, correo
ou sugesto, com nome completo,
cidade e estado, para:
cartas@javamagazine.com.br
Cartas publicadas podem ser editadas
por motivos de clareza ou extenso.

6 Java Magazine Edio 38


jm38.indb 6

17/7/2006 14:10:22

Edio 38 Java Magazine

jm38.indb 7

17/7/2006 14:10:27

Cafen a
News & Bits

Shale top-level
O framework web Shale foi aprovado como
um projeto top-level da Apache Software
Foundation. Com isso torna-se autnomo
na ASF, em vez de um subprojeto do Apache
Struts. Ter, assim, seu prprio website, listas

Geronimo 1.1

verso 1.1 do servidor Java EE da


Apache traz melhorias de performance e muitas correes de bugs.
Uma novidade de destaque o suporte
a plug-ins: agora aplicaes Geronimo,
recursos do servidor e produtos integrados podem ser distribudos como
plug-ins, que so fceis de instalar,
automaticamente fazem o download
de dependncias e no exigem a reinicializao do servidor. A verso 1.1 inclui
ainda recursos e visualizaes adicionais no console administrativo, como
grficos de utilizao de memria e um
wizard para a configurao remota do
servidor http. Outra novidade a distribuio leve do servidor, chamada
Little-G, que inclui um subconjunto das
funcionalidades do Geronimo. O LittleG vem com um gerenciador de transaes, um container web (que pode ser
Tomcat ou Jetty) e outros elementos do
Geronimo, mas no um servidor Java
EE completo. Ser til para usurios que
no precisam de todas as facilidades do
Java EE e desejam consumo menor de
memria e processamento. geronimo.
apache.org.

de discusso, espao de repositrio e Project


Management Committee (PMC). Desenvolvido pelo mesmo criador do Struts, Craig
McLanahan, o Shale um framework focado
na tecnologia JavaServer Faces (JSF) e est
chegando a seu primeiro release estvel.
shale.apache.org.

Graphics (JSR-226), Payment API (JSR-229),


Advanced Multimedia Supplements (JSR234) e Mobile Internationalization API (JSR238). O novo WTK inclui ainda a SNAP Mobile
API, da Nokia, que suporta a criao de jogos
multiusurio em rede. O WTK 2.5 exige um
JDK 1.5 ou superior.

Magnolia 3

Graduao do Tapestry

Um dos mais populares e maduros sistemas


de gerenciamento de contedo corporativos
(ECM), o Magnolia chega verso 3.0 com
muitos novos recursos. O Magnolia est
entre os primeiros a suportar a especificao
JSR-170, Java Content Repository, e inclui por
padro o Apache Jackrabbit (uma implementao open source desta JSR). Tambm so
suportadas implementaes comerciais do
repositrio de contedo.
Criado por uma empresa sua, a Obinary,
o projeto fornece uma interface administrativa baseada na web, uma API extensa e
bem documentada e taglibs para a criao
de templates.
Entre as novidades principais esto recursos
para versionamento, suporte a Portlets (JSR168), autenticao integrada (single sign-on)
e uma interface grfica renovada. O produto
tem trs edies, sendo a Community Edition
open source. As edies Enterprise e Business
Process completam as opes, oferecendo
suporte profissional e funcionalidades
adicionais. H localizaes para 15 idiomas.
www.magnolia.info.

O Tapestry se graduou para um projeto


top-level da Apache. Antes subprojeto do
projeto Jakarta, este framework web agora
tem site prprio e passa a se chamar Apache
Tapestry.
O Tapestry voltado criao de aplicaes web dinmicas em Java. Divide
as aplicaes em conjuntos de pginas,
sendo cada uma construda a partir de
componentes. Essa estrutura permite que
o framework cuide de tarefas comuns
como a construo de URLs, validao de
entradas do usurios, armazenamento de
estado e localizao/internacionalizao.
No Tapestry o desenvolvedor cria templates
em HTML puro e os combina com cdigo
Java, e opcionalmente descritores XML. As
aplicaes lidam com objetos, mtodos e
propriedades, e no com URLs e requisies/respostas HTTP (que so abstrados
do desenvolvedor). A distribuio do projeto inclui mais de 50 componentes, que
vo de simples objetos para sada de dados,
at componentes complexos como grades
e rvores de navegao.
Atualmente na verso 4.02, o Tapestry j
est com a verso 4.1 adiantada. Este novo
release incluir o dojo, um framework para
desenvolvimento com AJAX, que a base de
boa parte das funcionalidades adicionais. Entre os destaques est o novo suporte a JSON
(JavaScript Object Notation), widgets, novas
anotaes e validaes no lado do cliente.
tapestry.apache.org.

Novo WTK
Foi lanado o beta do Sun Wireless Toolkit
2.5 para CLDC, o popular kit de ferramentas para desenvolvimento de aplicaes
Java Micro Edition. Vrias novas APIs esto
implementadas, entre elas Mobile Service
Architecture (JSR-248), Scalable 2D Vector

8 Java Magazine Edio 38


jm38.indb 8

17/7/2006 14:10:34

n a
Leonardo Galvo
Groovy JSR-6
Est disponvel a ltima verso do Groovy
antes do lanamento da primeira verso
Release Candidate (RC). Segundo o lder
do projeto, Guillaume Laforge, esto sendo realizadas mudanas significativas no

corao da implementao, o chamado


Meta-Object Protocol, o que atrasou um
pouco o lanamento do primeiro RC. Em
compensao, as alteraes esto permitindo aumentar a performance para
nveis prximos do desempenho do Java.
As mudanas visveis na verso JSR-6 so

Aprendendo OO com Greenfoot

basicamente correes de bugs (incluindo


algumas submetidas pela Oracle), alm do
novo suporte a stored procedures e um
esquema mais simples de carregamento
de classes, bem como algumas outras
funcionalidades ainda no documentadas.
groovy.codehaus.org.

um mtodo sobre o mundo que afeta todos


os atores; e invocar mtodos de atores, por
exemplo fazendo-os se mover ou realizar
outras operaes mais complexas.
O Greenfoot est em desenvolvimento h
mais de dois anos, tendo inclusive sido apresentado em congressos, mas s recentemente teve liberada sua primeira verso pblica.
Como o BlueJ, o Greenfoot gratuito, mas
no open source. O site do projeto oferece
downloads e a documentao da API, alm
de um bom tutorial. greenfoot.org.

BlueJ, IDE voltado ao aprendizado cas de imagens. Por ser baseado no BlueJ, o
de orientao a objetos e Java, tem Greenfoot j vem com editor de cdigo Java,
um novo derivado o Greenfoot depurador e inspetor de objetos, incluindo
que cria um ambiente grfico bidimen- recursos que permitem atuar sobre o mosional altamente flexvel para estimular o delo de objetos criado (os atores e mundos
aprendizado de tcnicas OO. O novo am- so objetos Java comuns com mtodos,
biente, assim como o BlueJ, direcionado atributos e construtores). Pode-se, por
a estudantes que esto iniciando a progra- exemplo, criar um novo ator escolhendo um
mao, mas se diferencia por privilegiar um de seus construtores em um menu; executar
pblico mais jovem, do nvel colegial.
Com visual bem cuidado, o Greenfoot
se baseia em dois conceitos fundamentais: mundos e atores que so
representados por imagens e tm seus
comportamentos programados por
cdigo Java. Como mostram os vrios
exemplos includos na distribuio, atores
podem ser praticamente qualquer coisa,
desde pequenos mamferos australianos
at foguetes, formigas e rochas. Podem
tambm ser programados para interagir
com o mundo e com outros atores, permitindo a criao de simulaes sofisticadas
e at jogos.
Atravs de uma API simples, mas j
bastante extensa, o usurio pode definir
novos atores e mundos, e programar
rapidamente operaes comuns em
simulaes, como deslocamento na tela,
verificao de colises, animaes e tro- Greenfoot: Criao de simulaes e jogos para aprender Java e orientao a objetos

Edio 38 Java Magazine


jm38.indb 9

17/7/2006 14:10:36

Explorando
o CD

CD encartado nesta edio inclui trs produtos completos da


Oracle, que so especialmente
teis para o desenvolvedor Java: o IDE
Java Oracle JDeveloper, uma ferramenta
de desenvolvimento completa para a criao de aplicaes Java de diversos tipos; o
Oracle Containers for J2EE (ou OC4J), um
runtime J2EE que o corao do Oracle
Application Server 10g; e o Oracle Database 10g Express Edition, uma verso light
do SGBD da Oracle.

Incio da instalao
O CD inclui um arquivo Autorun.inf,
que, em alguns sistemas, far com que a
pgina inicial seja carregada automaticamente (veja a Figura 1). Caso no seja, abra
a pgina index.htm na raiz do CD.
Para iniciar a instalao, clique no boto
Install Now!. Ser mostrada uma lista
de restries; marque todas as checkboxes,
leia a licena a seguir e, se decidir aceit-la,
clique em I Accept. Na prxima pgina,
ser mostrada uma senha para instalao,
que ser sempre 10gJ2EE (para os trs
produtos). Ao final da pgina, voc ver
instrues para instalao, que detalhamos a seguir.

JDeveloper 10g

descompactar, ser pedida a senha fornecida no passo anterior. Isso conclui a


instalao. Para inicializar o JDeveloper
(no Windows), simplesmente execute
jdeveloper.exe.
Ao executar o JDeveloper pela primeira
vez, ser mostrada uma caixa de dilogo
perguntando se voc deseja migrar de uma
verso anterior do IDE. Responda No, e
o IDE ser aberto. ento mostrada outra
caixa de dilogo exclusiva para a primeira
execuo (veja a Figura 2); nela voc define
as extenses de arquivos que sero associadas ao JDeveloper. Vale a pena selecionar
pelo menos a segunda opo: .jpr.
A clssica janela de dicas a prxima a
ser exibida. Depois de fech-la, voc estar
com o IDE disponvel para criar aplicaes
Java de diversos tipos. Veja o JDeveloper
em ao na Figura 3.

OC4J
A instalao do OC4J igualmente simples. Descompacte o arquivo oc4j1013.zip,
localizado no diretrio oc4j do CD, para
uma pasta adequada do disco (exemplo:
c:\Java\oc4j). Para que seja possvel usar os
scripts de execuo do OC4J, sua varivel
de ambiente JAVA_HOME deve estar definida, apontando para o diretrio principal

Para instalar o IDE, expanda


o arquivo jdev1013.zip, localizado na pasta jdev do CD, para
um diretrio apropriado (por
exemplo c:\Java\jdev). Ao

Figura 1. Pgina inicial do CD-ROM.

Figura 2. Associao de extenses ao IDE JDeveloper.

10 Java Magazine Edio 38


jm38.indb 10

17/7/2006 14:10:42

Figura 3. O JDeveloper 10g especialmente forte no desenvolvimento de aplicaes com acesso a


banco de dados. O exemplo mostra o uso dos componentes ADF includos com o IDE.

de um JDK 1.4.2 ou 5.0. Tambm preciso definir a


varivel ORACLE_HOME para o diretrio onde o
OC4J foi descompactado.
Para executar o servidor, em um prompt de comandos entre no subdiretrio bin e execute o comando
oc4j start. Depois de algum processamento, ser solicitada uma senha de administrador. Fornea a senha
(note que ao digitar no sero mostrados caracteres,
nem mesmo asteriscos), e depois de mais alguns
passos o OC4J j estar em execuo, pronto para a
instalao de aplicaes J2EE.
Para testar a instalao, abra seu navegador web e
entre na URL http://localhost:8888/em. Isso carrega o
site de administrao do servidor. Na tela de login,
fornea a senha de administrao criada anteriormente. O site de administrao (veja a Figura 4) permite
instalar e desinstalar aplicaes Java EE, verificar o
desempenho e investigar web services disponveis,
entre outras operaes.

Oracle Express
O Oracle Database 10g Express Edition inclui um
instalador convencional (para Windows). Descompacte o arquivo OracleXE.zip para algum local do disco
e execute OracleXE.exe. Siga os primeiros passos do
wizard, defina uma senha para contas de sistema e
prossiga com a instalao.
Para testar a instalao, selecione a opo Ir Para a
Home Page de Banco de Dados no grupo de programas criado para o programa (ou visite diretamente a
URL http://127.0.0.1:8080/apex). Fornea o login system e a senha definida na instalao. A pgina inicial
de administrao ser exibida (veja a Figura 5).

Figura 4. Acompanhando o desempenho do OC4J no site de administrao do produto.

Se a pgina de administrao no for carregada, poder ter


havido problemas durante a instalao, causados por programas como o Google Desktop ou sistemas de antivrus. Desative
esses programas e refaa a instalao. Se mesmo assim a pgina
no carregar, um bom site para analisar outros erros possveis
orablogs.com/sergio/archives/001759.html.

A partir do site de administrao do Oracle XE, voc


pode criar e manipular bases de dados, visualizar estatsticas de execuo, e criar aplicaes para cadastro
de dados, e realizar muitas outras tarefas.

Figura 5. Administrao do Oracle XE: da navegao de dados criao de aplicaes.


Edio
Edio
38 38Java
Java
Magazine
Magazine
11 11
jm38.indb 11

17/7/2006 14:10:43

Java Livre

Datas no Desktop

Usando Componentes Swing para Manipular Da

Swing uma biblioteca de componentes


visuais muito rica e poderosa, permitindo
criar uma grande quantidade de aplicaes
com qualidade profissional, usando apenas os componentes padres inclusos no Java SE. Mas sempre
haver situaes em que o desenvolvedor poder se beneficiar de algum componente
adicional.
Um caso comum o de um date
picker, um componente que permite selecionar uma data num
calendrio. A maioria dos usurios prefere este tipo de
interface em vez da caixa de
texto formatada

oferecida pelo Swing (o componente


JFormattedTextField).
O termo tecnicamente correto para qualificar
componentes como um date picker em uma aplicao seria JavaBean, mas este termo ganhou usos
comuns fora do seu sentido original, por isso preferimos o termo componente. Para mais detalhes
sobre esta questo, veja o quadro Componentes,
JavaBeans e POJOs

Existem vrios componentes proprietrios e livres para a seleo de datas,


mas decidimos focar este artigo no
NachoCalendar (nachocalendar.sf.net) para
fornecer ao leitor um modelo de
como incluir componentes
Swi ng exter nos em
suas apl icaes.
Ve j a t a m b m o
quadro Outras bibliotecas Java para
calendrios.
E n q u a nt o e s t e
a r t igo apre s ent a
detalhes especficos
da instalao e uso do
NachoCalendar, os quadros que demonstram a
integrao deste componente com os IDEs NetBeans e
Eclipse sero teis tambm para
o desenvolvedor interessado em
outros componentes para aplicaes
Swing.

Sobre o NachoCalendar
O NachoCalendar um projeto open
source criado em meados de 2004 no
SourceForge. Como tem licena LGPL,
pode ser includo tambm em aplicaes
distribudas sob licenas de software
proprietrio, sem que isto exija a permisso dos desenvolvedores e sem obrigar a

12 Java Magazine Edio 38


jm38.indb 12

17/7/2006 14:10:51

lar Datas e Calendrios

Saiba como usar o


NachoCalendar em aplicaes
Swing, como integr-lo ao
NetBeans e Eclipse, e conhea
conceitos gerais sobre
componentes visuais em Java

Fernando Lozano
abertura do cdigo da aplicao que faz
uso do componente.
So fornecidos trs componentes principais, todos no pacote net.sf.nachocalendar.
components:
DateField Permite tanto a digitao
de datas quanto a seleo em uma janela pop-up, com estilo semelhante a um
combobox.
DatePanel basicamente o pop-up utilizado pelo DateField, mas fornecido como
uma subclasse de JPanel. Por isso pode ser
posicionado livremente dentro de uma
janela para formar telas de entrada de
dados customizadas (como numa agenda
de compromissos).
CalendarPanel Outra subclasse de JPanel,
que exibe mltiplos DatePanels simultaneamente, formando uma viso de calendrio
que exibe diversos meses, com navegao
e layout customizveis.
A Figura 1 apresenta a aplicao de demonstrao inclusa com o NachoCalendar.
Observe que o componente j est localizado para o portugus brasileiro, usando
recursos presentes no Java SE, por meio de
java.text.DateFormat e classes relacionadas.
Os trs componentes compartilham
muitos recursos, de modo que a maior
parte do que se aprende sobre o mais
simples vlida tambm para os mais
complexos. Assim o artigo inicia apresentando exemplos de uso do DateField, e
depois passa para o DatePanel. Para evitar
que o artigo fique muito longo, entretanto, no sero apresentados exemplos do
CalendarPanel. No entanto, a parte principal
da sua utilizao ser exatamente igual
do DatePanel.
A Edio 22 apresenta, na seo Primeiros
Passos, um artigo que detalha todas as APIs de
manipulao de datas do Java SE. Leitura reco-

mendada para os usurios do NachoCalendar e


componentes similares.

Instalao do NachoCalendar
Para obter o NachoCalendar, visite
nachocalendar.sf.net, siga o link Downloads
e baixe o arquivo nachocalendar- 0.23.
zip. Ento descompacte o ZIP em uma
pasta qualquer. Ser criado o diretrio
nachocalendar- 0.23 que contm, entre
outros, o arquivo manual-0.23.pdf, um
QuickStart para a utilizao do componente. A documentao JavaDoc pode
ser encontrada no subdiretrio doc. Em
lib est o arquivo nachocalendar-0.23.jar,
que deve ser adicionado ao classpath de
compilao e de execuo de qualquer
aplicao que utilize os componentes do
NachoCalendar.
Para executar o programa de demonstrao do projeto, execute a seguinte linha
de comando, onde %NACHO% deve ser
substitudo pelo diretrio contendo o JAR
do NachoCalendar:

java -jar %NACHO%\lib\nachocalendar-0.23-demo.jar

Usurios Linux devem executar o comando:


java -jar $NACHO/lib/nachocalendar-0.23-demo.jar

Os quadros NachoCalendar no NetBeans 5 e NachoCalendar no Eclipse


VE apresentam instrues especficas de
instalao e uso para esses IDEs.
Agora veremos um exemplo de uso do
NachoCalendar em aplicaes Swing, para
depois estudarmos em mais detalhes a
arquitetura do NachoCalendar e exemplos
adicionais de aplicaes.

Exemplo de seleo de datas


A Listagem 1 apresenta um exemplo
bsico de uso do componente DateField do
NachoCalendar, e demonstra quase tudo
o que necessrio saber sobre ele para
utiliz-lo em uma aplicao real.
O exemplo modifica a instncia de
java.text.DateFormat do componente por meio
do mtodo setDateFormat(). A razo disso

Figura 1. Aplicao de demonstrao do NachoCalendar: observe no DatePanel que a data atual pode ser indicada por uma
elipse vermelha (os retngulos vermelhos indicam os componentes em si).

Edio 38 Java Magazine


jm38.indb 13

13

17/7/2006 14:10:52

Java Livre Datas no Desktop

Outros componentes Java


relacionados com calendrios

qui apresentamos uma breve relao de outros componentes e bibliotecas livres para Java,
que podem substituir ou complementar o NachoCalendar, agrupados em categorias de
acordo com suas finalidades.
Note que so todos projetos hospedados no SourceForge, mesmo que alguns tenham seus prprios domnios DNS independentes e em alguns casos sites independentes do SourceForge.

Componentes Swing para edio de datas e visualizao de calendrios


microba.sf.net
web.ukonline.co.uk/mseries
opensource.theotherbell.com/php/datepicker.php
Componentes web para edio de datas e visualizao de calendrios
calendartag.sf.net
jcal.sf.net
sf.net/projects/palooka
Interao com servios de calendrio, PIMs e Groupware
k5n.us/javacaltools.php
moonbird.sf.net
jpim.sf.net
web.mac.com/sebsto/iWeb/projects/JSCalendarSync.html
jical.sf.net
icalgrabber.sf.net
APIs alternativas para manipulao de datas e horas
joda-time.sf.net
recurrance.sf.net

que a configurao padro do componente


exibe anos com apenas dois dgitos (por
exemplo, 17/05/06), enquanto que o
formato padro MEDIUM de DateFormat utiliza
quatro dgitos.
O exemplo tambm ilustra como inicializar e como recuperar a data editada
pelo componente. Os mtodos getValue()
e setValue() so declarados para receber e
retornar um java.lang.Object em vez de um
java.util.Date ou java.util.Calendar. O motivo
disto tornar o componente um substituto
direto para o JFormattedTextField, que define
os mtodos get/setValue() da mesma forma.
Apesar de a assinatura dos mtodos indicar
um Object, passar qualquer coisa diferente
de um java.util.Date ir gerar uma exceo.
Para compilar e executar o exemplo,
antes acrescente o JAR com os componentes ao c lasspat h do si stema,
por exemplo:
set CLASSPATH=%CLASSPATH%;%NACHO%\lib\nachocalendar-0.23.jar

(Usurios Linux devem usar o comando


export em vez do comando set.) O resultado
da execuo do programa pode ser visto
na Figura2.

Arquitetura do NachoCalendar
O manual do NachoCalendar parece in-

Arquitetura MVC no Swing

o Swing, todos os componentes visuais


seguem a arquitetura MVC, pela qual
classes diferentes desempenham o papel de
Modelo, Visualizao e Controlador (Model,
View, Controller). Isto no significa que uma
aplicao Swing tenha necessariamente que
seguir a arquitetura MVC, nem que o uso do
Swing torne uma aplicao automaticamente
aderente arquitetura MVC. Veja a srie Uma
aplicao completa com o NetBeans, publicada nas Edies 25, 26 e 27 para mais detalhes
sobre como construir uma aplicao Swing na
arquitetura MVC.
Dentro do Swing, a classe com a qual normalmente o desenvolvedor interage (e que
para ele parece ser o prprio componente)
na verdade o controlador na arquitetura MVC.
A FiguraQ1 ilustra o relacionamento entre o
componente e as classes auxiliares utilizadas

por ele para formar a arquitetura MVC.


desenvolvedores, todo componente Swing
Em componentes simples como JButton e
instancia um Model e um UI Delegate padro.
JLabel, o desenvolvedor no tem necessidade
por isso que a maioria das aplicaes instande interagir com o Model, mas esta interao se
cia (por exemplo) apenas um JButton, e tudo
torna necessria em componentes mais comfunciona corretamente.
plexos como JList ou
JTree.
Component
UI Delegate
J a interao com
Model
(Controller)
(View)
a V iew ( chamada
pelo Swing de UI
Delegate) em geral
javax.swing
javax.swing.plaf
necessria apenas
para desenvolvedores de novos lookButtonModel
JButton
ButtonUI
and-feels, como o
TinyLAF (muntjak.
de/hans/java/
tinylaf ). Para tornar
FiguraQ1. Uso da arquitetura MVC na arquitetura do prprio Swing, exemplificada pelo
componente JButton
mais fcil a vida dos

14 Java Magazine Edio 38


jm38.indb 14

17/7/2006 14:10:54

Usando o NachoCalendar no NetBeans

FiguraQ2 mostra uma verso do


primeiro exemplo deste artigo sendo
construda visualmente no editor Matisse
do NetBeans 5.x. Observe que ele exibido
na rea de desenho com seu aspecto real, e
que suas propriedades aparecem na janela
de propriedades. Porm no ser possvel
expandir a seta para ver o calendrio em
tempo desenvolvimento (assim como no
seria possvel expandir um JComboBox).
Acrescentar este componente no NetBeans
fcil:
1. Execute o commando Tools|Palette
Manager>Swing/AWT Components.
2. Clique em Add from JAR.
3. Localize e selecione o arquivo
nachocalendar-0.23.jar.
4. Clique em Next para ver a lista de componentes disponveis (available components),
que lista todas as classes JavaBean encontradas no JAR selecionado.
5. Selecione (usando Ctrl+Shift+clique)
apenas os componentes CalendarPanel,
DateField e DatePanel. (As demais classes listadas, embora paream para o IDE
JavaBeans independentes, so na verdade
classes auxiliares para os trs componentes
citados.)
6. Clique em Next para ver as categorias
do Palette.
7. Escolha a categoria Beans e clique em
Finish.
Ser possvel ver imediatamente os novos
componentes na categoria Beans do Palette.
Todos tero, no entanto, um cone contendo
um ponto de interrogao. O motivo que
o NachoCalendar no inclui classes BeanInfo
para seus componentes. Estas classes seriam
responsveis por fornecer o cone para uma
ferramenta visual, alm de editores customizados para propriedades, como dateFormat ou
selectionMode, que fogem aos tipos usuais.
O NetBeans contorna a falta de um customizador para propriedades ao permitir que o
valor inicial de uma propriedade seja definido
por um trecho de cdigo Java. Basta clicar
no boto de reticncias ao lado do valor da
propriedade, e o resultado ser semelhante
FiguraQ3.

FiguraQ2. DateField do NachoCalendar no editor visual do NetBeans 5


Note, entretanto, que
este cdigo ser utilizado
exatamente da maneira
que foi digitado, podendo
gerar erros de compilao na classe por falta de
imports e por outros motivos. Havendo algum erro,
ele dever ser corrigido
dentro da prpria janela
de propriedades, pois o
trecho de cdigo correspondente no ser editvel pelo editor de cdigo
FiguraQ3. Editando a propriedade dateFormat de um DateField
Java do NetBeans.
Por outro lado, o desoportunidade. Um primeiro passo seria acrestaque de sintaxe e o auto-completamento
centar as classes BeanInfo ao NachoCalendar,
de cdigo estaro disponveis no editor de
de modo a incluir cones personalizados no
propriedades da mesma forma como no
Palette do NetBeans (ou de qualquer outro IDE
editor de cdigo.
Java com suporte edio visual Swing). S isto
No momento que um dos componentes
j seria um acrscimo apreciado pelos usurios
do NachoCalendar for inserido em qualquer
do projeto. Podem tambm ser criados editores
classe visual, o JAR correspondente ser
especializados para selectionMode e outras proacrescentado automaticamente s propriepriedades que exigem a digitao de cdigo
dades do projeto.
no NetBeans. Por fim, bastaria empacotar tudo
em um plug-in do NetBeans (.nbm) que na sua
Se o leitor est interessado em participar
instalao j acrescente automaticamente os
de um projeto de software livre, eis uma tima
componentes no Palette.

Edio 38 Java Magazine


jm38.indb 15

15

17/7/2006 14:10:55

Java Livre Datas no Desktop

Usando o NachoCalendar no Eclipse VE

Figura Q4 apresenta o primeiro exemplo


deste artigo sendo construdo visualmente
com o Visual Editor (VE) da Fundao Eclipse,
mostrando que o desenvolvedor no precisa
se limitar aos componentes fornecidos com o
Palette padro do VE.
O VE no fornece uma maneira direta de se
acrescentar componentes ao Palette; isto possvel apenas por meio de plug-ins que estendem o
prprio VE. Em compensao, fornecido o cone
Choose Bean ( ), que exibe uma pequena
variao de um dilogo bastante conhecido dos
usurios do Eclipse (veja a Figura Q5). Nele, digita-se o incio do nome de uma classe ou interface
e so exibidas todas as correspondncias visveis
para o projeto corrente.
Esta variao do dilogo permite limitar as
correspondncias a apenas os JavaBeans que estendem alguma classe ou interface definida pelo
Swing, o que permite encontrar rapidamente o
componente desejado.
Para que isto funcione, o JAR do NachoCalendar
deve ser adicionado manualmente s propriedades do projeto, como qualquer biblioteca Java.
Usurios experientes do Eclipse iro preferir
cadastrar o NachoCalendar como uma User
Library nas propriedades do IDE (Figura Q6),
o que torna mais simples, depois, acrescentar a
biblioteca a cada projeto que venha a utiliz-la.
O VE no fornece nenhum mecanismo que facilite a edio de propriedades como selectMode e
dateFormat dos componentes do NachoCalendar.
Em compensao, ele no restringe a edio de
nenhum bloco de cdigo gerado pelo editor. Ento possvel, por exemplo, editar manualmente
o mtodo getDateField() para modificar o formato

Figura Q5. Localizando o componente DateField do


NachoCalendar no Eclipse VE

de data, conforme o cdigo a seguir:

return dateField;
}

private DateField getDateField() {


if (dateField == null) {
dateField = new DateField();
dateField.setShowToday(false);
dateField.setDateFormat(
DateFormat.getDateInstance(
DateFormat.MEDIUM));
}

Esta mudana ser reconhecida pelo VE e incorporada rea de desenho em poucos segundos.
O VE um editor poderoso e flexvel, embora
ainda no seja to intuitivo nem eficiente quanto
o Matisse do NetBeans.

Figura Q4. DateField do NachoCalendar no editor visual do Eclipse 3.1.x/3.2

Figura Q6. Localizando o JavaBean DateField do NachoCalendar no Eclipse VE

16 Java Magazine Edio 38


jm38.indb 16

17/7/2006 14:10:57

dicar que o componente foge a especificao JavaBeans, ao indicar o uso de classes


de fbrica para a criao dos componentes,
por exemplo:
DateField datefield = CalendarFactory.createDateField();

As classes de fbrica so teis para reduzir a quantidade de cdigo necessria


para a configurao dos componentes,
em especial quando so utilizadas as
extenses de feriados e de tarefas, que
fazem parte do download padro do
NachoCalendar. O fato , no entanto, que
todos os componentes do NachoCalendar
so verdadeiros JavaBeans, perfeitamente
aderentes especificao, e podem ser
utilizados sem se recorrer aos mtodos
de fbrica, como foi mostrado no primeiro
exemplo deste artigo.
Alm disso, o NachoCalendar construdo segundo boas prticas do Swing,
mantendo-se a separao de papis. Se
voc no est habituado ao design de
componentes desse toolkit, veja o quadro
A arquitetura MVC no Swing. Os componentes do NachoCalendar delegam
sua renderizao para um UI Delegate e o
gerenciamento das suas informaes para

uma classe de Model, que o desenvolvedor


pode estender para fornecer funcionalidades adicionais.
O efeito imediato da obedincia do NachoCalendar arquitetura do Swing a
compatibilidade com vrios look-and-feels
(LAFs) alternativos.
Muitos componentes Swing de terceiros no
tm aspecto visual correto a no ser que sejam
utilizados com o LAF padro Metal ou o LAF nativo
do Windows. Felizmente este no o caso com o
NachoCalendar.

do NachoCalendar demonstrada pelas


extenses j inclusas no download padro,
por exemplo:
Uso integrado a um JTable:
net.sf.nachocalendar.table.DateFieldTableEditor.
Exibio de feriados dentro dos calendrios: net.sf.nachocalendar.holidays.HolidayModel
e HolidayRenderer dentro do mesmo pacote.
Suporte exibio diferenciada de
dias alocados para tarefas (pense em uma
aplicao de gerenciamento de projetos

Nos componentes DatePanel e CalendarPanel,


possvel fazer selees mltiplas de
datas, inclusive de faixas descontnuas.
Tambm possvel modificar a relao de
dias teis, para todos os componentes, e
tambm alterar o formato de datas utilizado no DateField.
O cuidado na elaborao do NachoCalendar foi tanto que os componentes padro so capazes at mesmo
de incluir as fases da Lua nas vises de calendrio.

Figura 2. Execuo do exemplo EscolheData.java, aps o


clique sobre o boto de seta.

A flexibilidade
dos componentes

Listagem 1. EscolheData.java exemplo bsico de uso do DateField do NachoCalendar


import
import
import
import
import

java.util.Date;
java.text.DateFormat;
java.awt.BorderLayout;
javax.swing.*;
net.sf.nachocalendar.components.*;

public class EscolheData extends JFrame {


private DateField dateField;
public EscolheData() throws Exception {
setTitle(Exemplo do NachoCalendar);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// ser um formato DD/MM/AAAA para o Brasil
DateFormat df = DateFormat.getDateInstance(
DateFormat.DEFAULT);
Date dia = df.parse(17/05/2006);
getContentPane().add(BorderLayout.NORTH,
new JLabel(Escolha uma data:));
dateField = new DateField();
dateField.setDateFormat(df);
dateField.setValue(dia);
//dateField.setPrintMoon(true);

getContentPane().add(BorderLayout.CENTER, dateField);
pack();

public static void main(String[] args) throws Exception {


JFrame frame = new EscolheData();
frame.setVisible(true);
}

Edio 38 Java Magazine


jm38.indb 17

1

17/7/2006 14:10:59

Java Livre Datas no Desktop

ou em um PIM Personal Information


Manager como os fornecidos em PDAs
e aplicativos de Groupware). E exibio de tooltips com a descrio
das tarefas associadas ao dia sob o
cursor (TaskDataModel e TaskRenderer,
no pacote net.sf.nachocalendar.task)
Como se v, estamos lidando
com um componente bastante
poderoso, capaz de fazer quase
tudo o que se espera de um
componente deste tipo, mesmo
nas aplicaes mais sofisticadas. Ao
Listagem 2. EventosData.java demonstra como responder ao evento de mudana da data armazenada no componente
//...imports omitidos
public class EventosData extends JFrame {
private DateField dateField;
public EventosData() throws Exception {
setTitle(Exemplo do NachoCalendar);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
getContentPane().add(BorderLayout.NORTH,
new JLabel(Escolha uma data:));
dateField = new DateField();
dateField.setDateFormat(DateFormat.getDateInstance(DateFormat.MEDIUM));
dateField.getDateFormat().setLenient(false);
dateField.addChangeListener(dataAlterada);

mesmo tempo, sua API bsica bastante


simples, como veremos em mais detalhes
nos exemplos.

Eventos de edio e mudana de data


Toda a navegao pelo calendrio, por
exemplo mudar de ano ou de ms, gera
eventos especficos (veja as interfaces em
net.sf.nachocalendar.event). fornecida uma
API genrica para configurao dos componentes, cujo uso demonstrado pelas
extenses padro de feriados e tarefas,
j citadas.
Na maioria das vezes, o nico listener
que interessa registrar em um DateField
um javax.swing.ChangeListener. Este listener
permite agir no momento em que ocorre
uma mudana de data, seja por digitao
direta ou pela escolha no pop-up de calendrio. Seu uso poderia ser validar dois
DateFields de modo que um deles aceite
apenas datas que sejam posteriores fornecida no outro.
A Listagem 2 demonstra como capturar

getContentPane().add(BorderLayout.CENTER, dateField);
pack();
}
private ChangeListener dataAlterada = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JOptionPane.showMessageDialog(EventosData.this,
A data escolhida foi: + dateField.getValue(),
Data alterada, JOptionPane.INFORMATION_MESSAGE);
}
};
//...mtodo main omitido
}

Figura 3. Execuo do exemplo ExibeCalendario.java


aps um pequeno aumento no tamanho da janela.

Listagem 3. ExibeCalendario.java mostra um calendrio para o ms corrente


//...imports omitidos
public class ExibeCalendario extends JFrame {
private DatePanel datePanel;
public ExibeCalendario() throws Exception {
setTitle(Exemplo do NachoCalendar);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
getContentPane().add(BorderLayout.NORTH,
new JLabel(Calendrio Swing));
datePanel = new DatePanel();
getContentPane().add(BorderLayout.CENTER, datePanel);
pack();
}
//...mtodo main omitido
}

Figura 4. ExibeCalendario.java aps a adio de um


DayRenderer customizado.

18 Java Magazine Edio 38


jm38.indb 18

17/7/2006 14:11:02

os eventos de mudana de data por meio


do ChangeListener.
Note que este exemplo quase igual ao
apresentado no incio deste artigo. A novidade o tratamento do evento, e tambm
ter deixado o DateField com o valor inicial
padro, que a data corrente. Experimente
ainda alterar o argumento da chamada
a setLenient(), fornecendo datas do tipo
30/13/2006.

Listagem 4. ExibeCalendario.java adio de um DayRenderer customizado para exibir linhas de grade no calendrio
//...imports omitidos
public class ExibeCalendario extends JFrame {
private DatePanel datePanel;
public ExibeCalendario() throws Exception {
setTitle(Exemplo do NachoCalendar);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
DefaultDayRenderer dayRenderer = new DefaultDayRenderer();
dayRenderer.setBorder(new MatteBorder(new Insets(1, 1, 1, 1),
Color.LIGHT_GRAY));

Exemplo de exibio de calendrio


A Listagem3 apresenta um exemplo de
uso do DatePanel, que simplesmente exibe
um calendrio para o ms corrente.
Observe que a janela pode ser redimensionada, e que o calendrio ser redimensionado proporcionalmente (mas note
que o tamanho de fonte utilizado no ir
aumentar para compensar o aumento da
rea do calendrio). A Figura3 ilustra a
aparncia deste exemplo, aps um pequeno aumento da janela.
Caso a aparncia padro do calendrio
no lhe agrade, o DatePanel fornece uma
forma poderosa de customizao que
bem coerente com outros componentes
Swing sofisticados, por exemplo o JTable.
Em vez de definir muitas propriedades que
alteram o aspecto visual do componente,
definida uma interface de renderer (renderizador) para cada parte. Por exemplo, existe
o net.sf.nachocalendar.components.DayRenderer,
que o responsvel pela exibio de cada
clula de ms no calendrio.
So fornecidas pelo NachoCalendar
vrias implementaes de DayRenderer, em
especial o DefaultDayRenderer, que uma
subclasse do JLabel do Swing. possvel
mudar a aparncia do renderizador da
mesma forma que se faz com um JLabel
padro, por exemplo adicionar uma borda. A Listagem4 ilustra como fazer esta
customizao simples, que tem o efeito de
inserir linhas de grade no calendrio. O
resultado pode ser visto na Figura4.
O mesmo modelo da Listagem4 pode
ser utilizado para mudar a fonte e as cores de texto e de fundo, bem como outros
atributos da exibio do calendrio. Caso
se deseje modificar os cabealhos com os
dias da semana, deve ser fornecido um
HeaderRenderer, que similar ao DayRenderer.
Para manter a compatibilidade com look-

getContentPane().add(BorderLayout.NORTH,
new JLabel(Calendrio Swing));
datePanel = new DatePanel();
datePanel.setRenderer(dayRenderer);

}
}

getContentPane().add(BorderLayout.CENTER, datePanel);
pack();

//...mtodo main omitido

Listagem 5. EscolheVariasDatas.java como lidar com selees mltiplas em um DatePanel


//...imports omitidos
public class EscolheVariasDatas extends JFrame {
private DatePanel datePanel;
public EscolheVariasDatas() throws Exception {
//...inicializao do JFrame e do DatePanel omitida
datePanel.addChangeListener(dataAlterada);

getContentPane().add(BorderLayout.CENTER, datePanel);
pack();

private ChangeListener dataAlterada = new ChangeListener() {


public void stateChanged(ChangeEvent e) {
Object[] datas = datePanel.getValues();
DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
String listaDatas = ;
for (Object d : datas)
listaDatas += df.format(d) + \n;

};
}

JOptionPane.showMessageDialog(EscolheVariasDatas.this,
As datas escolhidas foram:\n + listaDatas,
Datas alteradas, JOptionPane.INFORMATION_MESSAGE);

//...mtodo main omitido

and-feels personalizados, um renderizador deve


evitar fixar cores como foi feito no exemplo. Em
vez disso, deve usar preferencialmente alguma cor
dependente do ambiente do usurio, por exemplo
uma das definidas na classe java.awt.SystemColor.
No exemplo, em vez de Color.LIGHT_GRAY poderia
ser utilizado SystemColor.control.

Seleo de mltiplas datas


Com um DateField, no se pode selecionar
mltiplas datas no calendrio. Mas com
um DatePanel, possvel selecionar inter-

valos de datas utilizando Shift+clique ou


ento vrias datas no-contguas utilizando Ctrl+clique, da mesma forma que se
faz com JList e JTables. Na verdade, a configurao padro de um DatePanel permite
selees mltiplas desse tipo.
Para se restringir a seleo a uma
nica data, ou a uma nica faixa de
datas contguas, deve ser chamado
o mtodo setSelectionMode () do objeto
DateField. Este mtodo pode receber uma
de trs constantes definidas na interface
net.sf.nachocalendar.model.DateSelectionModel,

Edio 38 Java Magazine


jm38.indb 19

19

17/7/2006 14:11:03

Java Livre Datas no Desktop

cujos significados so auto-explicativos:


MULTIPLE_INTERVAL_SELECTION
SINGLE_INTERVAL_SELECTION
SINGLE_SELECTION
Um decorator uma classe que imita a interface de outra classe, por meio de especializao ou implementando a mesma interface, e tem por objetivo substituir esta
classe apenas acrescentando alguma funcionalidade.
Este design pattern muito usado em aplicaes grficas
para acrescentar algum elemento decorativo por cima de
outro elemento. Da o nome.
1

Caso seja configurada uma das duas


formas de seleo mltipla, o conjunto de
datas selecionadas pode ser obtido chamando o mtodo getValues(), que retorna
um array de Object.
A Listagem5 demonstra como lidar
com selees mltiplas de datas; uma
pequena modificao do exemplo na
Listagem4. Note que o ChangeListener ser
chamado vrias vezes (uma para cada

clique) caso seja utilizado Shift+clique


ou Ctrl+clique.

Exibio de feriados
Encerrando os exemplos de uso do NachoCalendar, ser visto como acrescentar
feriados ao DatePanel. O processo envolve
duas etapas:
1. Fornecer um decorator1 para o DayRenderer,

Componentes, JavaBeans e POJOs

reqentemente os termos componente


e JavaBean so usados como sinnimos
pelos desenvolvedores Java. Alm disso,
os termos POJO e JavaBean tambm costumam ser utilizados como equivalentes. Mas,
se um POJO (Plain Old Java Object) nada
mais do que um objeto/classe Java comum,
sem restries adicionais, ento o que seria um
componente?
H muitas definies de componente no
meio de TI, portanto em vez de discutir livremente o conceito, vamos ver o que diz a especificao JavaBeans 1.01, na seo 2.1:
A Java Bean is a reusable software component
that can be manipulated visually
in a builder tool.
Ou seja, de acordo com a especificao, um
JavaBean existe para ser manipulado por um
IDE visual. Um JavaBean seria portanto anlogo aos componentes fornecidos por IDEs
RAD (Rapid Application Development) como
Delphi ou VB.
Para que seja vivel a manipulao de
JavaBeans por uma ferramenta, a especificao
define conceitos como propriedades e eventos,
alm de duas maneiras pelas quais um IDE pode
relacionar propriedades, eventos e mtodos
fornecidos pelo componente:
1. Usando introspeco
2. Usando um BeanInfo.

Convenes e introspeco
O uso da introspeco em JavaBeans baseado na obedincia a algumas convenes,
como o uso de um construtor sem argumentos
e de mtodos de acesso getXxx()/setXxx() para
propriedades. Estas convenes bsicas se
tornaram bastante populares, ao ponto de se
confundir a obedincia a elas como sendo a

prpria definio de JavaBeans.


O recurso de introspeco uma caracterstica
nica aos JavaBeans, quando comparado com
os componentes fornecidos por ambientes
RAD no-Java. Nestes ambientes, limitaes da
linguagem e da plataforma exigem a construo
explcita e trabalhosa de tabelas de propriedades e eventos, de modo que a construo de
um componente um processo bem diferente
do processo de construo de uma classe
comum.
Mas em Java a maior parte das classes construdas seguindo apenas as melhores prticas
de desenvolvimento OO se tornam automaticamente JavaBeans. Assim o conceito de JavaBean
como componente construdo para uso num IDE
visual acaba sendo esquecido por muitos. O fato
de a maioria dos desenvolvedores estar trabalhando na construo de aplicaes focadas em
ferramentas como Ant e Maven, em vez de voltadas a recursos particulares de IDEs, tambm
ajuda a se perder o conceito de JavaBeans como
componentes para IDEs visuais.
Hoje em dia, comum que vrios frameworks,
como Hibernate, Struts e Spring usem o termo
JavaBean para indicar uma classe qualquer (um
POJO) que obedea a estas convenes.

BeanInfo
A outra forma de se relacionar atributos,
propriedades e eventos fornecidos por um
JavaBean fornecendo uma classe que implementa a interface java.beans.BeanInfo. Esta classe
deve ser nomeada acrescentando-se o sufixo
BeanInfo ao nome do JavaBean, e pode estar
tanto no mesmo pacote do JavaBean descrito
por ela quando num pacote em separado, configurado pelo IDE.
Ento o IDE pode oferecer suporte especializado para um dado componente, fornecendo uma
classe BeanInfo customizada, que pode substituir

ou estender a classe BeanInfo do componente


original. O IDE tambm pode fornecer classes
BeanInfo para JavaBeans que no incluem seus
prprios BeanInfos.
Um JavaBean que fornece seu prprio BeanInfo
no obrigado a seguir as convenes definidas
para o uso da introspeco, permitindo por
exemplo construir componentes que devam ser
instanciados por mtodos de fbrica.
O BeanInfo a nica maneira de se fornecer
alguns recursos especficos para o uso em IDEs
visuais, como um cone para ser exibido na paleta de componentes. uma pena, no entanto,
que tantos desenvolvedores de componentes
sigam o caminho mais fcil e deixem que o IDE
use apenas a introspeco para configurar o
suporte aos seus JavaBeans.
O uso de um BeanInfo no acrescenta esforo
significativo ao desenvolvimento do componente, pois a maioria dos mtodos desta interface
podem retornar null (nestes casos, o IDE deve
recorrer ao uso da introspeco para obter as
informaes no fornecidas pelo BeanInfo).
A especificao de JavaBeans define ainda
muitos outros recursos que podem ser utilizados
por JavaBeans, como as bound properties (propriedades que geram eventos sempre que seus
valores forem modificados). E APIs complementares definem recursos como serializao de JavaBeans em formato XML, ou comportamentos
alternativos de um JavaBean, quando executado
dentro de um ambiente de desenvolvimento,
em vez de numa aplicao final.
No final das contas, o uso do termo JavaBean
como sinnimo de POJO j pegou e no vai desaparecer to cedo na comunidade Java. Mas a
verdade que um JavaBean pode ser muito mais
do que uma classe comum, por isso neste artigo
preferiu-se usar o termo componente para se
referir a JavaBeans criados para complementar
aplicaes visuais em Swing.

20 Java Magazine Edio 38


jm38.indb 20

17/7/2006 14:11:04

que cuida de modificar a cor do texto


de um dia que corresponda a um feriado e de acrescentar um tooltip com o
nome do feriado. Este decorator uma
instncia de net.sf.nachocalendar.holidays.
HolidayDecorator;
2. Utilizar um HoliDayModel (definido no
mesmo pacote do decorator) em lugar do
DayModel padro.
Note que o NachoCalendar inconsistente na nomeao das classes e interfaces do subpacote holidays,
ora usando Holiday, ora usando HoliDay.

A Listagem 6 apresenta o cdigo que modifica o exemplo ExibeCalendario para configurar


o DatePanel com o renderizador decorado e
o modelo customizado, e acrescentar dois
feriados: Independncia do Brasil e Natal.
A Figura 5 apresenta o resultado da
execuo deste ltimo exemplo, ilustrando um dos feriados definidos. Em uma
aplicao real, seria interessante obter os
feriados de algum arquivo externo, e tambm fornecer um novo HoliDayModel capaz
de calcular as datas de feriados flutuantes,
como o Carnaval.

Concluses

Figura 5. Execuo do exemplo ExibeFeriados.java, aps a


seleo do ms de setembro. (O cursor do mouse, que no
aparece na captura, est sobre o nmero 7.)

Demonstramos os cenrios de uso


mais freqentes dos componentes do
NachoCalendar, que podem fornecer s
suas aplicaes Swing com manipulao de datas aquele toque profissional
que faltava.
Vimos ainda algumas boas prticas de
projeto e de uso de componentes Swing
customizados, que podem ser resumidos
por imite o design dos componentes
Swing padres. Alm disso, mostramos como adicionar componentes adicionais aos IDEs livres mais populares,
o NetBeans e o Eclipse.

Listagem 6. ExibeFeriados.java exibe um calendrio com diferenciao grfica para os feriados


//...imports omitidos
public class ExibeFeriados extends JFrame {
private DatePanel datePanel;
public ExibeFeriados() throws Exception {
//...configurao do JFrame e do DatePanel omitidas
HoliDayModel model = new HoliDayModel();
HoliDay feriado;
DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
feriado = new DefaultHoliDay();
feriado.setName(Natal);
feriado.setDate(df.parse(25/12/2006));
feriado.setRecurrent(true);
model.addHoliDay(feriado);
feriado = new DefaultHoliDay();
feriado.setName(Independncia);
feriado.setDate(df.parse(07/09/2006));
feriado.setRecurrent(true);
model.addHoliDay(feriado);
datePanel.setModel(model);
datePanel.setRenderer(new HolidayDecorator(dayRenderer));

}
}

getContentPane().add(BorderLayout.CENTER, datePanel);
pack();

//...mtodo main omitido

nachocalendar.sf.net
Site oficial do NachoCalendar.
eclipse.org/vep
Pgina oficial do VE (Visual Editor), plug-in que
permite programao visual Swing e SWT no IDE
Eclipse.
java.sun.com/docs/books/tutorial/uiswing
Trilha de construo de interfaces Swing do Java
Tutorial da Sun.
java.sun.com/products/jfc/tsc/articles/
architecture
Documento da Sun que descreve a arquitetura do
Swing e seu uso da arquitetura MVC.
java.sun.com/developer/onlineTraining/
Beans
Tutoriais sobre componentes JavaBeans; leitura
obrigatria para construtores e usurios de
componentes de extenso Swing.
java.sun.com/products/javabeans/
docs/spec.html
Especificao JavaBeans.
netbeans.org
Site oficial do NetBeans, com recursos
sofisticados para programao visual.
javamagazine.com.br/downloads/jm38/
jm-datasdesktop.zip
Fernando Lozano
(lozano@javamagazine.com.br,
www.lozano.eti.br) trabalha h
mais de 10 anos com desenvolvimento de sistemas de informaes
e integrao de redes, sendo um dos
pioneiros do uso do Software Livre no Brasil. Dentro
da comunidade, atua como Conselheiro do LPI Brasil,
Webmaster da FSF e Community Manager do Java.net.
Atualmente consultor associado Neki Technologies
(www.neki.com.br).

Edio 38 Java Magazine


jm38.indb 21

21

17/7/2006 14:11:13

Byte Code

Relatrios e Grficos c
Usando o Business Intelligence and Reporting

22 Java Magazine Edio 38


jm38.indb 22

17/7/2006 14:11:22

s com Eclipse

ng

Tools BIRT

Crie passo a passo relatrios


e grficos de vrios tipos, de
exemplos simples utilizando
wizards a solues sofisticadas
baseadas em scripts

osvaLdo PInaLI doederLeIn

gerao de relatrios uma necessidade comum a muitas aplicaes,


especialmente as que fazem acesso
a bases de dados corporativas. De fato, o volume de dados acumulados pelas empresas
s faz crescer a cada ano, seja devido informatizao crescente de atividades, seja por
fora de legislaes ou prticas comerciais
que exigem o controle e a armazenagem de
cada vez mais informaes (ex.: contratos
de qualidade de servio).
Isso se traduz numa demanda cada vez
maior por funcionalidades de gerao
de relatrios, tarefa que no costuma ser
das favoritas de muitos desenvolvedores.
Certamente por este motivo, o mercado de
ferramentas de software h muito tempo
oferece produtos de gerao (semi-)automtica de relatrios, desde produtos amarrados a SGBDs como o Oracle Reports Developer, a softwares independentes como
Crystal Reports. E mais recentemente,
opes open source como o JasperReports
e iReport para Java.
O BIRT (Business Intelligence and
Reporting Tools), projeto da Fundao
Eclipse, uma nova opo na categoria
independente, open source e para Java.
Mas no apenas mais um gerador de
relatrios. O BIRT promete revolucionar o
cenrio dos relatrios para Java, especialmente devido sua forte integrao com o
IDE Eclipse, o que traz vantagens de produtividade claramente alm do possvel
para outros competidores (mesmo os que
possuem plug-ins para IDEs).
Apesar de relativamente novo, o BIRT
tem evoludo a passos largos e j uma
tecnologia madura. J encontramos o BIRT
na sua verso 2.1, que acompanha o release
do Eclipse 3.2 e faz parte do Callisto 1.0
(distribuio integrada dos principais
projetos do Eclipse.org).
Neste artigo, veremos como utilizar
o BIRT, guiando o leitor na construo

de relatrios com um tutorial prtico, e


examinando os recursos e caractersticas
desta ferramenta.
Embora o BIRT e este artigo sejam calcados no
Eclipse, usurios de outros IDEs tambm podem
usar o BIRT, graas ao RCP Report Designer (veja
a seo Instalando).

O Projeto BIRT
O projeto BIRT tem o objetivo de construir ferramentas de Business Intelligence
e relatrios, usando o modelo open source
e as tecnologias da Fundao Eclipse.
interessante destacar algumas conseqncias menos evidentes desta definio:
O BIRT no simplesmente um "plug-in
para o IDE Eclipse". Pode-se utiliz-lo
sem nenhum IDE, inclusive para a edio
visual de relatrios.
O BIRT se integra arquitetura de
ferramentas do Eclipse, o que significa
que haver outros plug-ins para Eclipse a
se beneficiar do BIRT, como j o caso do
TPTP 4.2 (Eclipse Test and Tools Platform).
O quadro O BIRT, outros geradores de
relatrios e open source discute o status
do BIRT como projeto do Eclipse.org, e o
compara com outros projetos competidores no mundo open source.

Componentes do BIRT
Como toda ferramenta de business
intelligence, o BIRT traz sua prpria sopa
de letrinhas, com muitos novos acrnimos para aprendermos. Os componentes de runtime e design do BIRT so os
seguintes:
ERD (Eclipse Report Designer) Editor visual de definies de relatrios.
WRD (Web Based Report Designer)
Equivalente ao ERD, mas com interface
web (este componente ainda no est
disponvel).
ERE (Eclipse Report Engine) Ge-

rador de relatrios; utiliza definies


produzidas pelo ERD ou WRD.
ECE (Eclipse Charting Engine) Gerador de grficos; tambm utiliza definies
produzidas pelo ERD ou WRD.

Instalando
Existem quatro maneiras de instalar o
BIRT de forma a acompanhar este artigo
(utilizaremos o BIRT 2.1, que baseado no
Eclipse 3.2):
1. Instalao tradicional do Eclipse.
Comeando com o Eclipse 3.2 (Platform
+ JDT, ou SDK), instale os plug-ins EMF
2.2 e GEF 3.2 (tambm exigidos por vrios
outros plug-ins, como o WTP). Basta ento
baixar o pacote birt-report-framework-2.1.zip
e descompact-lo sobre sua instalao do
Eclipse.
2. Callisto. Com o Eclipse 3.2 instalado,
v em Help|Software Updates>Find and
Install>Search for new features to install, escolha Callisto Discovery site e selecione
um mirror. Dentro da rvore de opes
Callisto Discovery Site, abra o ramo
Charting and Reporting e selecione
a opo Eclipse BIRT Report Designer
Framework 2.1.x. Depois clique no boto
Select Required para selecionar as dependncias necessrias para a operao do
BIRT, e clique em Next. Aceite a licena
para os componentes a serem instalados;
clique em Next e depois em Finish.
3. Opo all-in- one. Na pgi na
de download do BIRT, baixe o pacote
birt-report-designer-all-in-one-2_1.zip, que
vem com tudo que voc precisa, incluindo
o prprio Eclipse (SDK), o EMF, o GEF e
o BIRT.
4. RCP Report Designer. a opo para
quem quer usar o BIRT sem o Eclipse;
1
A verso embutida da base Classic Models usa o Apache Derby. Veja mais sobre esse SGBD em Demonstrando
o Apache Derby, na Edio 29.

Edio 38 Java Magazine


jm38.indb 23

23

17/7/2006 14:11:28

Byte Code Relatrios e Grficos com Eclipse

ideal para usurios de outros IDEs. Baixe


o arquivo birt-rcp-report-designer-2_1_0.zip
(ou mais recente), que contm um editor
visual de relatrios auto-contido.

O projeto
Feita a instalao, execute o comando
File|New>Project, e voc ver que foi criado um novo grupo de projetos para BIRT.
Escolha a opo Report Project e fornea um
nome para o projeto. Isso cria um projeto
puro de relatrio, o que num primeiro
momento simplificar o acompanhamento
desse tutorial. Depois veremos como combinar o relatrio a um projeto Java.
Aps a criao do projeto, o BIRT apresenta a perspectiva Report Design, tambm conhecida como ERD (Eclipse Report Designer). No novo projeto, use
New>Report para criar um relatrio. Fornea o nome carros.rptdesign e na opo de
templates escolha Simple Listing.
Depois de finalizar o wizard, voc ver
o ERD lotado de ferramentas atraentes
editor visual de relatrios, paleta de
elementos, editor de propriedades etc.
Mas um relatrio, antes de tudo, precisa
de dados de entrada, portanto o prximo
passo ser disponibilizar esses dados.

Os dados
Entre na view Data Explorer, clique com
o boto direito sobre o n Data Sources e
selecione New Data Source. Depois escolha
Classic Models Inc. Sample Database. D um
nome data source, ex.: carrosDS. Este
banco de dados de teste embutido no
BIRT1; por isso no exigida nenhuma
outra configurao.
Num projeto real, voc usaria um banco de
dados externo. Se quiser j praticar este cenrio
mais realista, baixe o pacote birt-database-2.1.zip,
que contm os scripts para criao e populao
do mesmo banco de dados Classic Models. Este
pacote contm scripts de criao de tabelas e po-

2
Para outros SGBDs, fcil criar as tabelas a partir dos
scripts create_classicmodels.sql de uma destas verses. J
a populao de dados iniciais est disponvel em vrios
arquivos-texto (formato CSV), que podem ser importados
com facilidade em muitos SGBDs, por exemplo com o
Oracle SQL*Loader.
3
Para quem j usou o JasperReports, o arquivo .rptdesign o equivalente aos arquivos .jrxml, exceto que no
existe uma etapa de pr-compilao para .class.

pulao de dados para o Derby e para o MySQL2, e


um arquivo .mdb para o Microsoft Access. Uma vez
criadas as tabelas, crie a data source com a opo
JDBC Data Source. O dilogo de criao de data
sources possui um boto Manage Drivers, que
permite cadastrar o driver JDBC para seu SGBD preferido (o driver para o Derby em modo embutido j
vem registrado.) Tendo o driver configurado, basta
entrar com os dados de URL, login e senha.

Na mesma view, em Data Sets, precisamos


criar agora um conjunto de dados (Data
Set), que corresponde a um resultset ou
cursor. Crie o Data Set com o nome carros e tipo SQL Select Query. Ser apresentado o dilogo de construo visual de
consultas do BIRT (Figura 1).
A database Classic Models modela uma
loja de automveis. Vamos criar um relatrio simples, mostrando nome, fabricante,
descrio e preo de todos os automveis
cadastrados, ordenados por fabricante e
depois por nome. Os nomes da tabela e das
colunas podem ser copiados para a consulta com um duplo clique (ou arrastando
para a janela que contm o cdigo SQL);
pode-se tambm digitar os comandos SQL
diretamente. Assegure que a consulta seja
algo como:
select PRODUCTNAME, PRODUCTVENDOR,
PRODUCTDESCRIPTION, BUYPRICE
from PRODUCTS
order by PRODUCTVENDOR, PRODUCTNAME

fizer isso, ainda poder digitar as legendas


nos cabealhos dos relatrios, mas este
trabalho teria que ser feito repetidamente
para cada novo relatrio que utilize o
Data Set.

O relatrio
Como o layout bsico do relatrio est
pronto (usamos um template que j inclui
um grid de quatro colunas), s falta associar nosso Data Set ao layout. Observe que
cada coluna do Grid (na aba Layout) possui
as linhas (rows) Header (cabealho), Detail
(dados) e Footer (rodap). Selecione, no
Data Set, a coluna de resultado Fabricante,
e arraste-a at a linha Detail na primeira
coluna (aparece um dilogo Select Data
Binding; voc pode aceitar as opes default e fech-lo). Faa o mesmo para as
outras trs colunas de resultado.
Um ltimo retoque alterar o formato dos
cabealhos, para que estes se diferenciem
dos dados. Selecione com Shift+clique
cada clula de cabealho, e no Property
Editor mude o Background Color. Mas, como
queremos usar o mesmo estilo para todas
as clulas do cabealho, h uma forma
mais fcil: passe o cursor do mouse sobre
o Grid para mostrar o manipulador Table
(sob o canto inferior esquerdo do Grid);
clique nele, revelando os manipuladores
de linhas e colunas; depois clique no da
primeira linha (a do cabealho). Use ento o Property Editor, customizando a cor
de toda a linha selecionada. O resultado
dever ser parecido com a Figura 2.
Para testar o relatrio, clique na aba
Preview. Voc ver o relatrio funcionan-

Aps a criao inicial do Data Set, o dilogo Edit Data Set permite customizar detalhes como parmetros, colunas calculadas,
cache e filtros, e tambm se ter um preview dos dados
selecionados, de
forma a verificar
que a query est
correta.
Um a lt i m a
etapa essencial
ir na aba Output
Columns (ainda
no dilogo Edit
Data Set) e preencher, para cada
coluna do resultado, o seu Display Name (ex.:
BUYPRICE = Preo). Se voc no Figura 1. Definindo um data set a partir de uma query SQL.

24 Java Magazine Edio 38


jm38.indb 24

17/7/2006 14:11:29

do, como na Figura 3. Este preview uma


janela embutida do navegador web default
do Eclipse: assim, o que estamos vendo
um relatrio HTML. Note que a primeira
visualizao do preview pode demorar
alguns segundos para aparecer, pois o
ERE (Eclipse Report Engine) precisa antes
ser carregado.
A primeira verso do nosso relatrio est
pronta. Dito isto, o que foi que construmos? O projeto possui apenas o arquivo
carros.rptdesign, que um documento
XML (editvel diretamente na aba XML
Source). Este documento descreve todos
os aspectos do relatrio: layout, fontes
de dados, associaes entre os dados e o
layout, formatao e outros itens ainda no
vistos. O documento pode ser utilizado
como entrada para o Report Engine, que
gera relatrios em aplicaes web (HTML),
desktop (Swing, SWT), e outros formatos
como PDF3.
O arquivo .rptdesign isolado s funciona
porque a aba Preview do Report Designer
invoca o Report Engine. Uma aplicao
real precisaria de um pouco de cdigo para
invocar o engine, e apresentar o resultado
ao usurio. Mas antes de fazer isso, vamos
dar mais um passo fcil.
No download deste artigo, o arquivo correspondente a esta etapa o carros1.rptdesign.

Grficos
Diz-se que uma imagem vale por mil
palavras, mas no caso de relatrios, por
mil nmeros seria mais apropriado.
Grficos de relatrios (ou charts) permitem
visualizar massas de dados grandes ou
complexas, de forma rpida e intuitiva.
Com o BIRT, tambm podemos criar estes
grficos sem nenhuma programao.
Na view Palette, selecione o componente
Chart e clique no relatrio, no espao vazio
logo abaixo ou acima do Grid (coloquei
acima). Um dilogo New Chart permitir
customizar uma srie de opes, das quais
exploraremos uma seleo.
Na primeira aba, Select Chart Type, a opo mais importante Output Format. So
suportados grficos bitmap (JPG, PNG e
BMP) ou vetoriais (SVG). O SVG teoricamente a opo ideal, mas o suporte a esse
formato ainda est longe de ser universal4).
Por segurana, escolha JPG ou PNG.

Figura 2. Layout j associado s colunas de resultado do data set.

Figura 3. Primeiro relatrio no BIRT.


Na segunda aba, Select Data, voc dever
associar colunas do Data Set s sries de
dados que formam o grfico. Comece marcando a opo Select Data Set / Use Data Set,
escolhendo o Data Set carrosDS no combobox. A tabela Preview exibir os dados
obtidos do Data Set. Selecione com o boto
direito o cabealho da coluna Fabricante, e
no menu que aparecer ative a opo Use
as Category (X) Axis. Em seguida faa o
mesmo para a coluna Preo, com a opo
Plot as Value (Y) Series. Veja o final desta
etapa na Figura 4.
Na ltima aba, Format Chart, voc pode
escolher muitas opes de formatao do
Data Set e de elementos como eixos, legendas, fundo etc. Vamos fazer somente as
configuraes essenciais para este grfico.
Em Series / Category (X) Series > Grouping,
marque Enabled, e selecione Interval = 0.
Isto far o grfico ter uma nica coluna
para cada fabricante (ao invs de vrias,
uma por registro do mesmo fabricante).
Mude tambm a opo Aggregate Expression para Average.
Em Chart Area / Chart Title, fornea o
ttulo Preos Mdios por Fabricante.
Em Chart Area / Axis / X-Axis, clique no

boto Text Format; no dilogo que se abre,


selecione Label / Font > ... (outro boto, que
abre o dilogo Edit Font); finalmente, neste
novo dilogo, altere o valor Rotation para
90. Isto far as legendas do eixo X serem
exibidas no sentido vertical, o que ser
importante para acomodar um nmero
grande de itens.
De volta ao designer, ajuste o tamanho e
a posio do grfico no relatrio, e ento
acione novamente a aba Preview. Voc
ver algo... feio, com rtulos numricos
embaralhados (dgitos demais) e uma
legenda vazia. Se no queremos perder
nossos clientes, temos que embelezar um
pouco mais.
Para as legendas, de volta ao Edit Chart
/ Format Chart / Series, preencha o campo

4
O Mozilla Firefox possui suporte nativo a SVG, mas o
MSIE exige um plug-in da Adobe.
5
Em estatstica, percentil uma medida de posio de
um valor relativamente aos demais valores do conjunto.
Por exemplo, se um modelo X tem preo 72, e 90% dos
modelos tm preo na faixa 0-72, ento o percentil do
preo de X 90, ou seja, est na faixa de preo de 90%
dos modelos. H nomes para percentis comuns, como
primeiro quartil ou Q1 (= percentil 25), e Mediana (=
percentil 50).

Edio 38 Java Magazine


jm38.indb 25

25

17/7/2006 14:11:31

Byte Code Relatrios e Grficos com Eclipse

claro, ainda poderamos retocar legendas,


propores, cores, fontes, e outros aspectos
visuais buscando tornar o grfico (e o relatrio) mais compreensvel ou bonito.
At este ponto, no escrevemos uma s
linha de cdigo Java. O BIRT faz o servio
de forma totalmente visual e interativa,
sendo que as configuraes que mostramos (e outras que ainda teremos espao
para apresentar neste artigo) so uma
frao do total disponvel. O custo disso,
como o leitor certamente ter verificado a
essa altura, que o designer de relatrios
do BIRT bastante pesado. Mas se voc
observar um OutOfMemoryError, no significa
que o BIRT seja assim to exigente veja
o quadro Configurando a memria para
o BIRT.
No download deste artigo, o arquivo correspondente a esta etapa o carros2.rptdesign.

Uma aplicao real


e completa (ou quase)

Figura 4. Configurando um grfico do relatrio.

Figura 5. Customizando as legendas do eixo Y.


Category (X) Series com Fabricante, e
Value (Y) Series com Preo.
Agora vamos ajustar a exibio dos
rtulos numricos dos valores, que aparecero no tipo de cada barra. Isso est
mais escondido. Em Series / Value (Y) Series,
clique em Labels, que abre um dilogo de

mesmo nome permitindo customizar as


legendas do eixo Y,
conforme a Figura 5.
Voc ver uma lista
Values, j populada
com um item: Value
Data (pode haver
vrias legendas para
cada item: o valor numrico, sua categoria,
nome, ou percentil5).
Clique no item Value
Data e ento acione o
pequeno boto 0.0#,
que traz outro dilogo
(ufa!) para editar a formatao desta legenda. Basta selecionar Data Type = Number (o
default), Standard, Fraction Digits = 2. Pronto, agora nosso grfico est razoavelmente
apresentvel, devendo se parecer com o
mostrado na Figura 6.
Nossa segunda verso do relatrio, dessa vez com um grfico, est completa.

Antes de entrarmos em mais detalhes


sobre funcionalidades do BIRT, vejamos
como podemos us-lo para criar aplicaes
Java reais. Nosso exemplo ser uma aplicao desktop (Swing) que invoca o Report
Engine e exibe o relatrio produzido numa
caixa de dilogo; mas como veremos,
o BIRT tambm pode ser utilizado por
aplicaes web.

Instalando o Report Engine


Uma vez finalizada sua aplicao, ela
precisar do runtime do BIRT o ERE,
para relatrios completos, ou o ECE
(Eclipse Chart Engine), somente para
grficos. O download destes runtimes,
birt-runtime-2.1.zip, possui assustadores
86 Mb, mas inclui vrias verses do ERE
e ECE. O ECE isolado tem 3,7 Mb, na pasta
/ChartEngine, e a nica opo de runtime
que pode ser utilizada facilmente de maneira semelhante maioria das bibliotecas
Java; ou seja, basta colocar todos os seus
JARs no classpath da sua aplicao.
O ERE completo (incluindo o ECE) tem
28 Mb, sendo fornecidas duas verses. A
primeira fica na pasta /ReportEngine. A
estrutura de diretrios e arquivos do ERE
semelhante do Eclipse, com subdiretrios
como plugins, configuration, e at workspace.
Voc pode remover o subdiretrio samples,

26 Java Magazine Edio 38


jm38.indb 26

17/7/2006 14:11:32

mas no mais que isso (pelo menos, no sem


ser um expert no BIRT). No d para apenas
pescar os JARs e coloc-los no classpath
da sua aplicao, pois o ERE utiliza a infraestrutura de plug-ins da plataforma Eclipse,
e exige que a sua estrutura de diretrios e
arquivos seja mantida intacta.
A segunda distribuio do ERE o
birt.war, para implantao em servidores
Java EE. Basta instal-lo no seu servidor de
forma normal. Tambm h uma aplicao
web, /WebViewerExample, que ilustra o uso
do ERE embutido numa aplicao web Java
EE, como alternativa birt.war. (Veremos
como usar esta opo de deployment mais
adiante.)
O tamanho dos runtimes do BIRT no
problema para implantao em servidores,
mas pode tornar invivel embuti-lo em
aplicaes desktop com download pela
internet.
Para nosso tutorial, inicialmente voc
precisar somente do ERE no subdiretrio
/ReportEngine.

Instalando a documentao
A documentao do BIRT imprescindvel para se utilizar sua API, mas
no est disponvel num download
isolado. Para obt-la, primeiro baixe o
birt-report-framework-sdk-2.1.zip. Este pacote
contm o mesmo framework que orientamos a instalar no Eclipse, mas inclui
tambm a documentao, o cdigo-fonte
e exemplos. A documentao estar nos
seguintes arquivos:
plugins/org.eclipse.birt.doc_verso/doc.zip
plugins/org.eclipse.birt.doc.isv_verso/doc.zip
plugins/org.eclipse.birt.chart.doc.isv_verso/
doc.zip
Ao extrair estes ZIPs, voc poder explorar a abundante API pblica dos engines
de relatrios, charts, de scripting e de extenso de IDE do BIRT. Observe, contudo,
que todas estas APIs esto documentadas
como provisrias, significando que podem sofrer alteraes incompatveis em
releases futuros (ainda que, na prtica,
isto seja raro).
Mas antes de enveredar por estes JavaDocs, comece pela pgina eclipse.org/birt/
phoenix/deploy/reportEngineAPI.php, que inclui diagramas que explicam a arquitetura
geral do runtime e das APIs do BIRT.

Criando o projeto Java


Crie um novo projeto Java vazio, e copie
para seu source folder raiz o arquivo carros.
rptdesign que construmos na seo anterior. Em seguida, crie a classe TesteBIRT,
conforme a Listagem 1. Esta classe utiliza
a API do Report Engine, que no trivial,
mas tambm no algo assustador.
Observe que o exemplo gera um relatrio
em formato HTML; o Report Engine no
possui uma opo para gerao em formato de imagem (java.awt.Image, GIF ou semelhante). Somente os grficos produzidos
pelo Chart Engine geram imagens. Assim,
precisamos de um componente JEditorPane
do Swing para exibir o relatrio. Outra opo seria usar um PDFRenderContext, que gera
o relatrio em formato PDF, o que poderia
ser exibido numa aplicao Java atravs
da biblioteca iText6, ou ento apresentado
lanando o visualizador de PDF instalado
no sistema (como o Acrobat).
O cdigo da Listagem 1 funciona e ilustra o
assunto discutido, mas no igual ao que voc
faria (ou deveria fazer) numa aplicao real. O
ideal seria encapsular partes repetitivas deste
cdigo em mtodos utilitrios. Por exemplo, voc
poderia ter um ServiceLocator com um mtodo que
inicializa o ReportEngine, e tambm mtodos que
abrem o design e definem opes de renderizao

que tendem a ser iguais para todos os relatrios


produzidos por uma mesma aplicao.

Utilizando parmetros
Nesta etapa, vamos modificar o relatrio
para utilizar parmetros: alm do Data Set,
quase todos os relatrios reais precisam de
argumentos que determinam opes como
filtros de dados.
Vamos criar um filtro para gerar relatrios que consideram apenas produtos de
determinado tipo, como carros ou motos.
Na database, isso exige um filtro como
WHERE productLine = Classic Cars para filtrar
apenas os carros; porm, o argumento do
WHERE deve ser um parmetro dinmico.
Na view Data Explorer, em Re port
Parameters, acione New Parameter e preencha os valores: Name = productLine, Data
type = String e Default value = Classic
Cars. Isso cria um parmetro de entrada
do relatrio, cujo valor deve ser setado pela
aplicao antes de invocar o relatrio.
Agora, abra novamente o Edit Data Set.

6
O runtime do iText pode ser baixado pelo site de
update do Callisto. Mas este componente, assim como um
arquivo prototype.js para funcionalidade AJAX, no so includos nos runtimes do BIRT, talvez devido a restries
de licena. Devem ser baixados parte; veja instrues na
pgina de download do BIRT.

Figura 6. Relatrio com um grfico (inserido acima do grid).

Edio 38 Java Magazine


jm38.indb 27

2

17/7/2006 14:11:33

Byte Code Relatrios e Grficos com Eclipse

Listagem 1. Cdigo Java para uma aplicao desktop mnima com o BIRT.
import
import
import
import
import
import

java.io.File;
java.io.IOException;
java.util.HashMap;
javax.swing.JEditorPane;
javax.swing.JFrame;
org.eclipse.birt.report.engine.api.*;

public class TesteBIRT {


public static void main (String[] args) throws EngineException, IOException {
// Cria o engine (para simplificar, usamos path fixo do ERE)
EngineConfig config = new EngineConfig();
config.setEngineHome(D:/Java/BIRTRuntime/ReportEngine);
ReportEngine engine = new ReportEngine(config);
// Carrega o arquivo de design
IReportRunnable design = engine.openReportDesign(carros3.rptdesign);
// Cria tarefa de renderizao, configurada para para HTML
IRunAndRenderTask task = engine.createRunAndRenderTask(design);
HTMLRenderContext renderCtx = new HTMLRenderContext();
renderCtx.setImageDirectory(image);
HashMap ctxMap = new HashMap();
ctxMap.put(EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, renderCtx);
task.setAppContext(ctxMap);
HTMLRenderOption options = new HTMLRenderOption();
// Gera a sada num arquivo temporrio
File output = new File(System.getProperty(java.io.tmpdir), birt.html);
options.setOutputFileName(output.getAbsolutePath());
options.setOutputFormat(html);
task.setRenderOption(options);
task.run();
engine.destroy();
// Cria um componente Swing para exibir o HTML
JEditorPane htmlPane = new JEditorPane(file:/// + output.getAbsolutePath());
htmlPane.setEditable(false);
JFrame frame = new JFrame();
frame.add(htmlPane);
frame.setBounds(0, 0, 640, 480);
frame.setVisible(true);

// Exibe o consumo de memria do heap


System.gc();
Runtime rt = Runtime.getRuntime();
System.out.println(rt.totalMemory() - rt.freeMemory());

Na aba Query, adicione query a clusula


WHERE productLine = ?. O ? o familiar indicador de parmetro da API JDBC. Na aba
Parameters, crie um parmetro com Name =
productLine, Data type = String e Direction = Input. Queremos que o valor deste
parmetro da query seja preenchido com o
valor passado para o parmetro productLine
do relatrio. So parmetros diferentes,
apesar do nome igual. Para associar um
ao outro, clique em Default Value (no boto
...), o que abre o dilogo Expression Builder,
mostrado na Figura 7.
O BIRT utiliza um sistema de parmetros em cascata, no qual os parmetros
de um Data Set podem ser associados a
valores disponveis ou calculados num escopo mais externo, como os parmetros do
relatrio. Os dois conceitos parmetros

de relatrio e de Data Set so necessrios


porque um relatrio pode ter vrios Data
Sets; os parmetros do relatrio podem ser
usados em outros lugares alm dos Data
Sets; e os parmetros dos Data Sets podem
receber valores de outras origens alm de
parmetros do relatrio. Porm, o caso
mais simples e comum o de relatrios
com um nico Data Set e uma correspondncia um-para-um entre os parmetros.
Para alimentar o parmetro do data
set com o do relatrio, clique em Report
Parameters; depois na categoria ---All---,
e finalmente no parmetro {}productLine.
Agora basta confirmar. O resultado a
expresso params[productLine] (que voc
tambm poderia digitar mo o que ser
geralmente mais rpido aps se familiarizar com o BIRT). Pronto. Se executarmos

o relatrio novamente, veremos que o


grfico e o grid s exibem os modelos de
automveis. No passamos nenhum valor
para o parmetro productLine do relatrio,
portanto foi usado o valor default Classic
Cars. Na aba Preview, clique em Show Report Parameters para experimentar outros
valores, como Planes.
De volta nossa aplicao, o cenrio mais
comum seria termos uma tela de seleo
de parmetros, por exemplo com um combobox Tipo preenchido dinamicamente
com todos os valores distintos da coluna
PRODUCTLINE. Por limites de espao, no podemos construir uma aplicao realmente
completa, com uma estrutura de navegao, menus e telas de parmetros para
relatrios. Mas veremos o essencial: como
definir um valor para um parmetro interativamente. Basta alterar a classe TesteBIRT
para incluir o cdigo em destaque:
...
options.setOutputFormat(html);
task.setParameterValue(productLine,
JOptionPane.showInputDialog( null,
Tipo, Escolha o tipo,
JOptionPane.OK_OPTION,
null, null, null));
task.setRenderOption(options);
...

O novo cdigo simula uma mini-tela de


entrada de parmetros, com uma caixa de
dilogo que permite digitar o valor para o
parmetro. Executando a aplicao novamente, digite o valor Planes para ver um
relatrio dos modelos de avies.
Agora, sim, temos um relatrio semelhante ao mnimo que se esperaria de uma
aplicao real, com os dados de entrada
variando de acordo com alguma seleo
do usurio ou outra fonte.
No download deste artigo, o arquivo correspondente a esta etapa o carros3.rptdesign.

Uso em aplicaes web


Ainda que o BIRT d suporte a aplicaes desktop, seu maior brilho sem
dvida no suporte a relatrios web.
Para integrar o Report Engine numa
aplicao web, voc tem duas opes:
instalar no container o birt.war, ou
integrar ao WAR da sua aplicao
os arquivos do Report Engine.
A segunda opo bem mais
complexa, mas pode-se come-

28 Java Magazine Edio 38


jm38.indb 28

17/7/2006 14:11:39

ar mais facilmente copiando o contedo


do WebViewerExample (prtica familiar
cpia do struts-blank por desenvolvedores
que usam o framework Struts). O uso do
birt.war bem mais simples e permite o
compartilhamento do engine por diversas
aplicaes. Por outro lado, aplicaes mais
sofisticadas, especialmente aquelas com
relatrios contendo scripts complexos que
acessam classes Java da aplicao, iro preferir a implantao integrada, que facilita
o acesso a estas classes.
Vimos que a API do BIRT pode ser configurada para gerar relatrios em formato
HTML, bastando ento determinar o nome
do arquivo e seu subdiretrio de imagens,
gerar o arquivo, e devolver ao cliente a
URL do arquivo gerado. Isso possvel,
mas tem desvantagens srias, como
gerenciar estes arquivos: deve-se evitar
conflitos com outros arquivos de relatrios
produzidos por usurios concorrentes, e
os arquivos devem ser deletados aps a
visualizao. Assim, em geral, esta opo
de gerao de relatrio em arquivo s boa
para tarefas de gerao em batch, ou para
aplicaes que j possuam mecanismos de
produo e gerenciamento dinmico de
contedo (como ferramentas CMS). Para
a maioria das aplicaes, recomenda-se
usar o servlet do Report Engine. Se voc
examinar a janela do Preview, descobrir
que o relatrio gerado invocando-se uma
URL como:

Para mais detalhes sobre o uso do viewer,


consulte: eclipse.org/birt/phoenix/deploy/
viewerUsage.php.

Scripting
Como vimos, podemos ir longe no BIRT s
com cliques do mouse. No outro extremo,
possvel utilizar suas APIs Java para customizar a construo e a gerao de relatrios
ou grficos de uma forma mais dinmica do
que seria possvel somente com documentos
.rptdesign estticos. Mas a virtude, j diziam
os antigos, pode estar no meio, ou seja, entre
quaisquer opes extremas.
O BIRT possui um abrangente suporte a
scripting, permitindo que muitos recursos
avanados sejam implementados com
pequenos trechos de cdigo embutido
nos documentos .rptdesign. suportada
JavaScript, linguagem que ser familiar
para muitos desenvolvedores de interfaces
grficas baseadas na web. Para mais
detalhes sobre o suporte a scripting do
BIRT, veja o quadro Scripting no BIRT e
no Eclipse.
Com a aplicabilidade dos scripts muito
ampla, vamos ilustr-la com uma seleo
de exemplos.

Colunas calculadas
Nossa primeira tarefa gerar no Data

Set uma coluna calculada. Ou seja, uma


coluna cujo valor no uma cpia direta
de uma coluna retornada pela query, mas
sim o resultado de uma expresso arbitrria (possivelmente envolvendo dados
retornados pela query). Vamos demonstrar
isso com uma coluna Avaliacao, cujo valor
ser caro ou barato, conforme o preo
do modelo.
No dilogo Edit Data Set, abra a aba Computed Columns. Na primeira linha em branco, digite Column name = Avaliacao e Data
Type = string. Na clula Expression, clique
o boto ... para abrir o dilogo Expression
Builder. Ento, clique em Avaliable Data Sets
/ carros / Preo para selecionar a coluna
de preo. Um duplo-clique ir inserir a
expresso row[Preo] na rea de edio
da expresso.
O Expression Builder permite criar expresses complexas sem usar o teclado
h botes para cada operador e listas de
seleo para as colunas (como a que usamos), parmetros, funes do JavaScript e
do BIRT, e tambm para operadores. Mas
como somos programadores de verdade,
vamos terminar de digitar esta expresso
mo:
row[Preo] >= 50 ? caro : barato

Esta expresso (que um mini script

http://127.0.0.1:52939/viewer/run?__report=E%3A%5
COsvaldo%5Ctestws%5CBIRTJava%5Ccarros4.rptdesign&
__format=html&__svg=false&__designer=true&_
_masterpage=true& __rtl=false&__maxrows=&1486415089

Aqui viewer o contexto de instalao


do Report Engine e run o nome do servlet de gerao de relatrios; o parmetro
report contm o path completo do arquivo
de design do relatrio, e os demais
parmetros so as opes para o
relatrio. Parmetros iniciando por
dois sublinhados, como __svg, so
opes do viewer. J os parmetros
do relatrio podem ser passados
de forma normal, por exemplo
productLine=Planes. Tudo que a
aplicao precisa fazer, aps permitir ao usurio selecionar valores
para os parmetros de um relatrio, montar a URL exigida pelo viewer.

Figura . Parmetros em cascata no Expression Builder.

Edio 38 Java Magazine


jm38.indb 29

2

17/7/2006 14:11:42

Byte Code Relatrios e Grficos com Eclipse

JavaScript) ser executada, para cada linha


do Data Set, produzindo a coluna Avaliacao. Se clicarmos na aba Preview Results,
veremos a nova coluna preenchida com
valores, como na Figura 8.
Poderamos, ento, utilizar esta coluna
no relatrio, da mesma forma como fize-

mos para colunas reais. De que outra


maneira poderamos ter obtido o mesmo
efeito? Se voc voltar ao design do Grid (o
componente de relatrio tabular) e der um
duplo-clique na clula de detalhe da coluna Preo, ver o dilogo Select Data Binding.
Observe que, neste dilogo, a coluna Preo

Scripting no BIRT e no Eclipse

verso atual do BIRT suporta JavaScript


(ECMAScript). Verses futuras devero
suportar outras linguagens de scripting para
a JVM (como Groovy, Jython etc.), possivelmente atravs da JSR-223.
H anos a comunidade Eclipse vem discutindo a implementao de facilidades
de scripting para o Eclipse como um todo,

ambiente; ou seja, a plataforma Eclipse, os


plug-ins instalados e os recursos gerenciados
por estes plug-ins.
O BIRT j faz isso para o ROM ( Report
Object Model, isto , a representao em
memria do documento .rptdesign), o que
permite ao script utilizar sintaxes especiais
como row[nome] e params[nome] para acessar

para automatizar qualquer operao do IDE


e de todos os seus plug-ins. A falta dessas
facilidades uma das principais lacunas do
Eclipse, para usurios avanados que gostam
de automatizar seu trabalho com scripts. Essa
deficincia j vem sendo investigada por
projetos na incubadora da Fundao Eclipse
(como o EclipseMonkey), alm de projetos
externos (como o EclipseShell). Sem falar
em ferramentas que incluem suporte ad-hoc
para scripting, como o prprio BIRT.
A Fundao parece ter demorado para levar
o assunto a srio, devido grande nfase
do Eclipse no desenvolvimento de plug-ins.
Mas mesmo uma ferramenta poderosa como
o PDE no supera a facilidade de escrever
scripts, que permitem inclusive cenrios de
programao zero (macros gerados pela
captura de aes do usurio no IDE). Mas
agora os scripts esto na moda, ganhando suporte at da plataforma Java SE (ver JSR-223,
j includa no Mustang, e a JSR-292). O Eclipse
precisa de um suporte robusto e unificado a
scripting, compartilhado por todas as ferramentas que possam se beneficiar de scripts,
e suportando vrias linguagens. O assunto
foi discutido num painel da EclipseCon 2006,
e provavelmente ser materializado numa
soluo definitiva no Eclipse 3.3.
O suporte a scripting no requer somente
fazer a interface entre Java e o runtime de
alguma linguagem de scripting problema
que a JSR-223 j padroniza e resolve. Boa
parte do esforo a definio de um Object
Model (OM) que represente, de uma forma
simples, os dados e funcionalidades do

elementos do ROM. E vai mais alm: possvel escrever scripts com expresses como
sum(row.BUYPRICE), onde sum uma funo
agregada semelhante do SQL. Ela retorna
a soma dos valores da coluna BUYPRICE para
todas as linhas (rows) do Data Set. Esta
sintaxe no suportada por JavaScript, mas
como linguagens de scripting so por natureza fceis de manipular, o BIRT pode criar
extenses desse tipo com facilidade 8.
O BIRT tambm permite invocar classes
Java a partir do relatrio. No abordamos
essa funcionalidade neste artigo, mas uma
opo bem mais complexa. O cdigo Java
no tem os benefcios do Report Object
Model ou de extenses de sintaxe, sendo
obrigado a utilizar APIs do BIRT, ex.: task.
getParameterValue(productLine). Estas APIs priorizam flexibilidade e desempenho sobre a facilidade de uso, e na verso 2.1 ainda no so
APIs estveis (com garantia contra mudanas
incompatveis em releases futuros).
Em geral, voc s utilizar Java no lugar de
JavaScript se tiver necessidades especiais de
integrao, como reusar mtodos de alguma
biblioteca Java. Ou de desempenho, como
calcular um Data Set muito complexo (o
que pode ser feito em JavaScript, mas com
menos desempenho, por ser uma linguagem
interpretada).

8
Ou seja, os scripts do BIRT no so realmente JavaScript puro, e sim uma extenso. Mas o BIRT faz um
pr-processamento que trata estas extenses e gera
cdigo JavaScript comum, compatveis com runtimes
de JavaScript padro, como o Mozilla Rhino.

associada expresso dataSetRow[Preo].


Clicando nesta expresso, veremos novamente (sem muita surpresa) o Expression
Builder.
Agora, se voc selecionar o grfico e
acionar Select Data, examinando com novos olhos esta aba do dilogo Edit Chart
(Figura 4), ver que existem scripts por
todo lado. Por exemplo, o campo Category
(X) Series tem o valor row[Fabricante] um
script. O mesmo vale para as opes de
valor Y, agrupamento e colunas de dados
para o eixo X. Embora a prtica mais comum seja derivar todos estes dados de colunas do Data Set, pode-se, no lugar disso,
escrever cdigo JavaScript arbitrrio.
Poderamos ter criado no Grid a expresso que transforma um preo na string
caro / barato. Mas se definirmos esta
expresso no prprio Data Set, o valor
resultante pode ser reusado em vrios
lugares; por exemplo, podemos querer
exibir esta informao tanto no Grid
quanto no grfico. Calcul-la uma vez s,
no Data Set, economiza tanto o esforo
de edio do relatrio, quanto tempo de
processamento.
Uma terceira alternativa para gerar valores calculados seria fazer o clculo na
prpria query do Data Set; por exemplo:
SELECT PRODUCTNAME, PRODUCTVENDOR,
PRODUCTDESCRIPTION, BUYPRICE,
( CASE WHEN BUYPRICE >= 50 THEN caro
ELSE barato END) AS AVALIACAO
FROM PRODUCTS
ORDER BY PRODUCTVENDOR, PRODUCTNAME

Este tipo de programao comum


quando so usados geradores de relatrios
sem capacidade de scripting. Porm apresenta alguns problemas. A sintaxe CASE
usada no exemplo uma extenso SQL de
um SGBD especfico, e mesmo essa sintaxe
no permitiria implementar clculos mais
complexos (por exemplo, qualquer clculo
exigindo um loop). A soluo poderia ser o
uso de procedimentos armazenados (que
o BIRT tambm pode invocar para gerar
um Data Set), mas esta prtica tambm
tem seus inconvenientes, como baixa portabilidade. Alm disso, transferir colunas

7
Este artigo de Joel Spolsky diz tudo sobre a questo
aparncia versus funcionalidade:
joelonsoftware.com/articles/fog0000000356.html

30 Java Magazine Edio 38


jm38.indb 30

17/7/2006 14:11:44

calculadas no SGBD consome banda de


rede desnecessariamente. muito mais
eficiente fazer uma query que retorna somente os dados brutos, e gerar os valores
calculados localmente.

Customizaes de layout
Vamos a uma outra necessidade importante de relatrios caprichados:
modificar dinamicamente a apresentao
dos dados, para destacar informaes
importantes. Nunca esquea que voc
pago (principalmente) para fazer suas
aplicaes parecerem boas!7
Digamos que voc queira que as linhas
do Grid que exibem os modelos mais baratos sejam exibidas em negrito. Para fazer
isso, selecione o manipulador da linha,
e v na aba Property Editor / Highlights,
que permite definir regras de destaque.
Clique em Add, trazendo o dilogo New
Highlight; no primeiro campo, If following
condition is true, clique o boto .... L est
mais uma vez o Expression builder. Crie
a expresso row[Preo]. De volta ao New
Highlight, no segundo combobox (para a
seleo de operador) escolha Less than;
e no terceiro campo, que tambm aceita
uma expresso, digite 50. Agora, no grupo
Then apply following formatting, clique no
segundo boto B (bold); veja a Figura 9.
Pronto, basta confirmar e testar novamente
o relatrio.
O Report Engine procura oferecer uma
GUI que permita fazer tudo com o mouse,
selecionando opes predefinidas mesmo na edio de scripts. Usurios mais
experientes, que conheam JavaScript e j
tenham aprendido palavras-chave como
row e params, podero ignorar esta interface
grfica e digitar as expresses diretamente. No caso do highlight, acho mais fcil
digitar um nico script no primeiro campo
row[BUYPRICE] < 50 e deixar os outros
como Equals to e true.

Figura 8. Data set com uma coluna calculada por script.

Figura . Editando uma regra de destaque.

No download deste artigo, o arquivo correspondente a esta etapa o carros4.rptdesign.

Data sources de script


Voc j deve ter observado que o BIRT
s gera relatrios a partir de algum Data
Source; no existe uma opo de passar
ao gerador uma coleo de objetos Java,
como os datasets do JasperReports e do

Figura 10. Definio de colunas para o data set de scripted data source.
Edio 38 Java Magazine

jm38.indb 31

31

17/7/2006 14:11:45

Byte Code Relatrios e Grficos com Eclipse

JFreeChart. Mas o princpio do BIRT explorar a generalidade do conceito de Data


Source, que no precisa necessariamente
ser uma fonte de dados relacional.
Ao criar um Data Source, voc deve ter
observado que existem opes de flat
files (arquivos CSV texto com campos
separados por vrgula), e XML (que usam
expresses XPath para extrair um Data Set
tabular de um documento XML qualquer).
Estas opes so muito interessantes para
a integrao entre aplicaes atravs de
arquivos. Mas ainda mais poderosa a

opo de scripting.
Crie um novo Data Source, com o tipo
Scripted Data Source e nome scriptDS. Na
aba Script do editor, voc ver que o BIRT
permite definir cinco mtodos: open, close,
beforeOpen, beforeClose, afterOpen e afterClose.
Pode ser preciso redefinir estes mtodos,
por exemplo, para abrir e depois fechar
uma conexo com um sistema externo.
Neste exemplo, no precisaremos disso.
Crie um Data Set chamado senoidal
para este Data Source. Voc ver que o
dilogo Edit Data Set mais simples que

no caso de JDBC: no h query, somente


colunas calculadas (na aba Output Columns). Crie duas novas colunas, angulo e seno,
ambas com o tipo Float. Veja a Figura 10.
Observe que o dilogo no permite a
entrada de expresses para calcular o valor
destas colunas, o que pode parecer estranho. Mas faz sentido, pois nosso Data Set
no possui colunas de dados primrias
a partir das quais as colunas calculadas
possam ser derivadas (no caso de Data Sets
JDBC, estas colunas seriam as do resultset
da query ou stored procedures. O Scripted
Data Source exige o uso de scripts para
tudo, inclusive para determinar quantas
linhas existem, portanto, sua configurao
um pouco diferente.
Na view Data Explorer, deixe o Data Set
senoidal selecionado; agora, na view do
.rptdesign (rea central), clique na aba
Script. Voc ver um combobox no topo,
listando todos os mtodos disponveis
para o script do Data Set. Entre com o
seguinte cdigo.
Para o mtodo open:
x = 0.0;

E para o mtodo fetch:


if (x < 8) {
row[angulo] = x;
row[seno] = Math.sin(x);
x = x + 0.01;
return true;
}
else return false;

Figura 11. Data Set totalmente baseado em scripting, com o cdigo que gera cada nova linha.

Figura 12. Chart gerado a partir do data set senoidal, calculado por um script.

Para compreender a programao de um


Data Set baseado em script, basta pensar
que ele funciona como um java.util.Iterator.
O mtodo open inicializa o Data Set, e o
mtodo fetch retorna true se existir mais
uma linha, ou false se no houver mais
linhas. Alm disso, o fetch deve tambm
setar os valores de todas as colunas para
a prxima linha (se houver).
No nosso exemplo, queremos calcular
os senos de todos os ngulos entre 0 e 8
radianos (i.e., de 0 e 1.440 graus, ou 4 voltas
na circunferncia trigonomtrica), com
incrementos de um centsimo de radiano
(3,6 graus). (Utilizamos valores fixos para
o ngulo inicial, final e incremento, mas
poderamos facilmente ter criado parmetros do Data Set para estes valores.)
Para fazer isso, usamos uma varivel de
estado do Data Set, a varivel x, iniciali-

32 Java Magazine Edio 38


jm38.indb 32

17/7/2006 14:11:48

zada no open. O valor desta varivel ser


preservado entre as invocaes de mtodo:
funciona como um atributo, no como uma
varivel local. O mtodo fetch atualiza este
x at chegar ao valor mximo, e se ainda
no tiver chegado, calcula as colunas angulo
e seno para a linha sendo retornada. Veja
na Figura 11 o Report Designer durante a
edio de scripts. Na Figura 12 mostrado um relatrio que podemos construir
facilmente (exerccio para o leitor!) utilizando este Data Set.
Finalizamos observando que, embora
este exemplo seja um caso extremo o
script gera o Data Set de forma completamente sinttica, sem ler nenhuma fonte
de dados externa mais comum que
este recurso seja utilizado para ler dados
de fontes que no sejam suportadas diretamente pelos Data Sets comuns do BIRT.
Por exemplo, se os seus dados exigem fazer
uma consulta a um EJB, ou uma query do
Hibernate ou quem sabe invocar DAOs
Java que montam queries JDBC pode-se
usar scripts para acessar tais dados.
No download deste artigo, o arquivo correspondente a esta etapa o senoide.rptdesign.

Interatividade e aes drill-through


Relatrios complexos devem no s exibir dados, mas tambm permitir ao usurio navegar por esses dados. Por exemplo,
ao visualizar o relatrio de preos por

fabricante, seria timo poder clicar na


Escolha Type = Mouse Click e Action =
coluna correspondente a um fabricante e
URL Redirect. Clique no boto Edit Base
imediatamente visualizar um outro relaURL, que abre o dilogo Hyperlink Options
trio de preos por fabricante. Este tipo de
(Figura 13). Existem vrios tipos de links.
funcionalidade excelente para o usurio
Voc poderia, por exemplo, querer que
final, pois evita a necessidade de voltar
um clique na coluna de um Vendedor dia um menu de relatrios, escolher outra
recionasse o usurio pgina de cadastro
opo e preencher muitos critrios de filtro
daquele fabricante; bastaria ento entrar
iguais aos do relatrio anterior. J para
com sua URI (que pode ser gerada dinao programador, implementar recursos
micamente). Mas no nosso caso, queremos
como este costuma ser bastante
trabalhoso, especialmente em interfaces web, devido dificuldade
de programar qualquer tipo de interatividade envolvendo grficos
o que exige a gerao dinmica
de image maps. Felizmente, o BIRT
torna funcionalidades como essas
relativamente simples.
Vamos ao nosso exemplo. No
carros.rptdesign, volte aba Layout,
clique duas vezes no grfico, mude
para a aba Format Chart e selecione
Series / Value (Y) Series. Clique no
boto Interactivity, que abre um
dialogo de mesmo nome. Observe
(nos combos Type e Action) que o
BIRT suporta vrios tipos de eventos de mouse, foco, teclado etc.,
e diversos tipos de aes, como
exibir uma tooltip, ocultar/exibir,
destacar, ou invocar um script (que
pode fazer praticamente qualquer
coisa).
Figura 13. Editando opes de drill-through.

Configurando a memria para o BIRT

Report Designer um ambiente pesado,


e aps um OutOfMemoryError, voc pode
querer aumentar o limite de tamanho do heap da
JVM que executa o Eclipse. Isso pode ser feito adicionando ao atalho ou script que inicia o Eclipse
(ou ao eclipse.ini) as opes -vmargs mxXXXm
onde XXX o nmero de Mb. No entanto, esta
configurao pode no funcionar, mesmo com
um tamanho de heap enorme.
O problema no do Eclipse (embora haja
vrios bugs do Eclipse.org discutindo o assunto),
e sim da JVM da Sun. que o HotSpot possui uma
regio especial de memria, a gerao perma-

para o Eclipse 3.2 com o BIRT (e outros plug-ins


pesados, como o WTP e AJDT).
O problema contornado com outra opo do
HotSpot: -XX:MaxPermSize=128m, que configura
o limite mximo da PermGen. Nem necessrio usar o -Xmx . Outra soluo utilizar JVMs
alternativas, como as da IBM e da BEA, que no
apresentam esta limitao.
Quando voc ler este artigo, atualizaes do
BIRT, Eclipse SDK e JDK podem ter contornado o
problema de forma transparente (na dvida, adicione esta opo somente se observar erros java.
lang.OutOfMemoryError: PermGen space).

soluo sempre a mesma: o NetBeans 5, por


exemplo, aciona automaticamente a opo
-XX:MaxPermSize=160m.
Resta perguntar: por que o Eclipse + BIRT utilizam
tanta memria para cdigo? A funcionalidade do
BIRT impressionante, mas creio que a resposta
, em boa parte, a arquitetura nada leve utilizada
pela soluo como um todo. Quando voc faz um
preview do relatrio, o BIRT carrega (na mesma
JVM do Eclipse) no s todo o cdigo do Report
Engine, mas tambm o de suas dependncias,
incluindo o Mozilla Rhino, o Apache Axis, o Apache
Tomcat (usado s para servir o relatrio HTML para

nente (PermGen), onde so alocadas classes e


strings internalizadas, mas o tamanho mximo
default desta regio de memria insuficiente

Este problema no exclusividade do Eclipse


ou do BIRT; tem atingido outras aplicaes
Java peso-pesadas em nmero de classes. A

o preview!), e se estiver sendo usado o Data Source


de teste Classic Cars, at o servidor Apache Derby
embutido.

Edio 38 Java Magazine


jm38.indb 33

33

17/7/2006 14:11:49

Byte Code Relatrios e Grficos com Eclipse

BIRT, outros geradores de relatrios, e open source

xistem diversos geradores de relatrios puro-Java. As opes open source


mais tradicionais so o JasperReports
(gerador de relatrios) e iReport (editor
visual de relatrios do JasperReports),
cobertos nesta e na edio anterior,
e o gerador de grf icos comerciais
JFreeChart, tratado nas edies 24 e 25.
As perguntas que podem estar na mente
de muitos leitores so: Qual o melhor?
Vale a pena migrar para o BIRT?
Passados dois anos, JasperReports,
iReport e JFreeChart continuam disponveis, melhorando continuamente, e agora
tambm contam com suporte comercial.
Este um mercado que est se expandindo, tornando-se muito mais competitivo,
e sofrendo uma forte comoditizao
das funcionalidades bsicas. As seguintes
tendncias recentes so crticas para esta
competio:
Integrao com IDEs. Com o sucesso
de plataformas de IDE como o Eclipse e
o NetBeans, ferramentas visuais e integradas no so mais um luxo so essenciais.
A vantagem de produtividade de um
ambiente no s visual, mas totalmente
integrado ao IDE, evidente.
Suporte a recursos de B.I. (Business
Intelligence). Isso significa capacidades
de anlise e apresentao de dados mais
avanadas; recursos enterprise como
relatrios agendados, segurana, alta
escalabilidade (clustering e caching),
OLAP, suporte total plataforma JEE (ex.:
EJB e JCA) etc.
Os recursos mais high - end nestes
grupos podem no estar presentes em
produtos open source ou gratuitos,
mas todos os competidores adotaram a
mesma estratgia, oferecendo produtos
comerciais mais avanados e/ou servios
e suporte.
A Actuate, empresa que criou e a
principal contribuinte do BIRT, oferece o
Actuate BIRT. O produto o mesmo; somente os servios e suporte comercial se
diferenciam. A JasperSoft, empresa estruturada para desenvolvimento e suporte
comercial do JasperReports e iReport,

tem uma linha de produtos comerciais de


BI. J a Infologic produz o JasperAssistant,
editor de JasperReports integrado ao
Eclipse (que apesar do nome, no tem
relao com a JasperSoft; um produto
comercial e de cdigo fechado). A Pentaho oferece seu BI Suite, produto que j
suporta dois engines de relatrios: JasperReports e o BIRT. Mas recentemente, a
Pentaho adotou os projetos do JFree.org
(JFreeChart e JFreeReport), que devem
tornar-se preferenciais.
Tambm no podemos desprezar a
vantagem do BIRT como soluo de BI
oficial da Fundao Eclipse. O BIRT faz
parte da distribuio integrada Callisto.
suportado por outros pesos-pesados
como a IBM (que, imagino, deve estar
ansiosa para excluir de seus IDEs comerciais o Crystal Reports, e parar de pagar
licenas Business Objects). No seu
primeiro ano de vida ps-1.0, o BIRT j
se tornou um dos sucessos da Fundao
Eclipse, e cada vez mais um diferencial
competitivo. Nenhum outro IDE gratuito / open source para Java inclui capacidade nem remotamente semelhante.
Por outro lado, antes de migrar cegamente de uma tecnologia que voc j
conhece para outra que ainda no domina, avalie bem a novidade, considerando
suas necessidades particulares. Uma
vantagem do JFreeChart, por exemplo,
a riqueza de recursos e grande flexibilidade de extenso, que permite customizar
grficos praticamente sem limites ainda
que a um custo de escrever muito cdigo
Java.

BIRT e open source


O projeto BIRT j foi criticado pela forma
como entrou no mundo open source. O
projeto foi uma iniciativa da Actuate, empresa do ramo de BI que ainda no tinha
presena especificamente no segmento
de ferramentas Java, e viu a oportunidade de ganhar este mercado doando ao
Eclipse.org todo o desenvolvimento do
BIRT. Mas por que a Actuate tinha que
criar geradores de relatrios e de grficos completamente novos, com tantas

opes previamente existentes?


Em parte isso parece ser um modus
operandi da Fundao Eclipse, que j
comea com o produto bsico, o IDE,
criado da mesma maneira pela IBM, sem
ligar para os projetos de IDE Java open
source anteriores. A Fundao incorpora, talvez emblematicamente, uma nova
modalidade de open source desenvolvido
primariamente por grandes empresas,
que procura combinar vantagens de modelos extremos9. E difcil no perceber
as vantagens: nunca ouvimos falar que
uma funcionalidade de um projeto do
Eclipse.org no implementada por falta
de recursos, ou que a nova verso ter
seu release de produo quando estiver
pronta. No s o Eclipse. Este novo movimento open source corporativo inclui
outros projetos qualquer um onde 90%
dos desenvolvedores sejam pagos pela
mesma empresa, o que inclui vrios projetos open source famosos (IDEs, sistemas
operacionais, servidores Java EE etc.) .
Recomear do zero s vezes bom ou
mesmo necessrio. A arquitetura do BIRT
me parece superior do JasperReports e
do JFreeChart (embora esta impresso
possa ser viciada pela documentao do
BIRT, que formal, vasta, de alta qualidade
e gratuita). E sendo um projeto integrado
plataforma Eclipse, o BIRT obrigado a
fazer uso intenso de vrios componentes
desta plataforma, incluindo a SWT, JDT,
EMF e GEF, portanto, seria difcil reutilizar
muito cdigo de projetos anteriores.
Um fato interessante que o BIRT
pretende estabelecer um padro com
seu ROM (Report Object Model), que,
lembrando, o modelo dos seus arquivos
.rptdesign e dos objetos do relatrio visveis por scripts e APIs (algo semelhante
ao DOM para documentos HTML). Talvez
esta iniciativa no tenha sucesso os
competidores ainda no esto correndo
para implementar compatibilidade com
o ROM. Mas importante devido ao esforo por trs do design e documentao
desse modelo, e tambm porque facilita
a integrao do BIRT com outros projetos
do Eclise.org e plug-ins de terceiros. Tra-

34 Java Magazine Edio 38


jm38.indb 34

17/7/2006 14:11:51

duzindo: o BIRT no s um gerador


de relatrios, uma plataforma. E na
medida em que esta plataforma atrair
o interesse de muitos desenvolvedores
de solues complementares, isso
pode transformar o BIRT (ou pelo menos seu ROM) num padro de fato.
No vejo as prticas de desenvolvimento do BIRT como nada de excepcional. O projeto JasperReports
tambm mantido por uma empresa
com interesses comerciais, que alis
oferece produtos proprietrios mais
avanados. Quanto duplicao de
funcionalidades, os autores do JFreeChart tambm criaram o JFreeReport,
um engine de relatrios simples, concorrendo com o JasperReports. No se
trata necessariamente de falta de colaborao: muitas vezes os lderes destes
projetos podem ter motivos tcnicos
para criar um projeto novo, como
preferir uma arquitetura diferente, ou
desejar uma soluo mais simples e
leve (ou mais completa e ambiciosa).
Ou ainda, ter em vista a evoluo para
um modelo de open source com explorao comercial, o que um objetivo
perfeitamente legtimo.
Em qualquer caso, a proliferao
de projetos open source na mesma
categoria no necessariamente um
mal, pois tambm h vantagens na
diversidade e na competio. O JasperReports e JFreeChart avanaram muito
em comparao com a ltima vez que
os utilizei seriamente (h cerca de dois
anos). Ambos atingiram as verses
1.0, com promessa de estabilidade
de API, aps anos de atualizaes 0.x
com quebras arbitrrias e freqentes
de APIs. E o JasperReports e iReport
ganharam integrao com a JFreeChart. Enfim, se a ameaa do BIRT tiver
servido para agilizar estas melhorias,
os desenvolvedores que continuarem
preferindo estas outras opes s tm
a agradecer.
9
Ver
bazaar/

www.catb.org/esr/writings/cathedral-

invocar outro relatrio; ento, escolha o


tipo Drill-through, que como conhecida esta ao de navegar entre relatrios
distintos, mas relacionados.
O dilogo exibido permitir selecionar
o relatrio de destino, bem como vrias
opes para invoc-lo (como seus parmetros). Selecione o parmetro productVendor
(a coluna Parameters j disponibiliza os
parmetros exigidos pelo .rptdesign de
destino). Em Values, digite a expresso
row[Fabricante], para passar para este
parmetro o valor da coluna Fabricante no
contexto de ocorrncia do evento ou seja,
o fabricante associado barra clicada.
Clique no boto Ok e, de volta ao dilogo
Interactivity, clique em Add para inserir a
nova ao na lista esquerda.
Est feito. s testar (omitimos somente
as instrues para criar o relatrio por
fabricante; mas este parecido com o relatrio por tipo de produto, variando apenas
as colunas filtradas e selecionadas).
O suporte a scripts e eventos do BIRT
tambm pode ser utilizado para implementar aes de drill-down (gerar o mesmo
relatrio com dados mais filtrados), para
validar parmetros, e outras operaes.
No download deste artigo, os arquivos correspondentes a esta etapa so carros5.rptdesign (relatrio
base) e carros5porFabricante.rptdesign (relatrio
filho).TTR

Concluses
Este artigo pretendeu dar uma introduo abrangente ao BIRT, mas o enorme
volume de recursos deste gerador de relatrios s nos permitiu abordar os itens
mais essenciais ou interessantes. Ficou
faltando falar de muitos outros itens, que
enumeramos aqui para completar uma
viso geral das capacidades do BIRT:
Relatrios tabulares (em grids) mais
complexos, com agrupamentos, cabealhos
e rodaps;
Localizao/Internacionalizao;
Refinamentos de layout: suporte a CSS,
quebra de pgina, ndices, bookmarks etc.;
Recursos de filtro e ordenao (geralmente desnecessrios para Data Sets
JDBC que podem usar WHERE e ORDER, mas
necessrios para outros Data Sets);
Mapas (tabelas "de/para");
Outros componentes importantes,

como List, Image e Dynamic Text;


Pginas-mestre;
Libraries, que permitem reutilizar
definies comuns (como datasets e
pginas-mestre) entre vrios relatrios
semelhantes;
Tambm no tivemos espao para falar
em desempenho, mas o BIRT possui uma
caracterstica muito importante que seu
cache de relatrios, que faz com que invocaes freqentes aos mesmos relatrios,
com mesmos parmetros, no exijam a
repetio de todo o processamento de gerao do relatrio (especialmente a query
ao SGBD). Esta funcionalidade muito
importante faz falta em alguns geradores
de relatrios, obrigando desenvolvedores
de aplicao a implementar mecanismos
de cache ad-hoc, tarefa que bastante
complexa e arriscada.
Os recursos que pudemos explorar neste
artigo j cobrem a funcionalidade de relatrios exigida por muitas aplicaes, e mais
importante que isso, devem ilustrar bem o
ciclo de trabalho com o BIRT, e seus pontos
fortes (como a facilidade de desenvolvimento) e fracos (como o tamanho do runtime).
Tenha em mente este conjunto total de
funcionalidades para comparar o BIRT a
outras opes. O BIRT certamente ser uma
excelente alternativa para muitas aplicaes,
e considerando sua facilidade de uso, baixo
o investimento de tempo para aprender o
restante de suas funcionalidades.

eclipse.org
Projeto Eclipse.
eclipse.org/birt/phoenix/ref
Referncia do BIRT
jasperreports.sf.net
JasperReports, gerador de relatrios open source
javamagazine.com.br/downloads/jm38/
jm-birt.zip
Osvaldo Pinali Doederlein
(opinali@gmail.com) Mestre
em Engenharia de Software
Orientado a Objetos, membro
individual do Java Community Process
(tendo participado do Expert Group da JSR-170:
Tiger/J2SE 5.0), e trabalha na Visionnaire Informtica
como arquiteto e desenvolvedor.

Edio 38 Java Magazine


jm38.indb 35

35

17/7/2006 14:11:53

Mais relatrios Pas s


Totalizaes e grficos com iReport e Jaspe

o artigo Relatrios na Web Passo


a Passo, publicado na edio
anterior, apresentamos o JasperReports e o iReport e mostramos como
criar um relatrio mestre-detalhe completo, que lista detalhes dos pedidos de
clientes. Neste artigo, vamos incrementar
esse relatrio inicial definindo grupos e
acrescentando diversas totalizaes. Tam-

bm mostraremos como criar e configurar


grficos no relatrio

Sobre o projeto de exemplo


O projeto utilizado neste artigo permite a
execuo de um relatrio a partir de uma
aplicao web. Ele baseado em quatro
entidades principais: pedidos, itens de
pedido, clientes e produtos. Os dados do

relatrio so obtidos a partir de um banco


MySQL, e o modelo de dados mostrado
na Figura 1.
A Figura 2 representa o resultado final
desse relatrio e o quadro Como criar o
relatrio inicial resume os passos para a
criao. O projeto inicial completo, com
todas as classes necessrias, os templates
de relatorio.jrxml e o script para criao do
banco de dados, est disponvel no site
da Java Magazine. Os leitores que no
acompanharam o artigo na edio anterior podero obter esse exemplo pronto,
e partir dele para realizar as mudanas
detalhadas aqui. Ser disponibilizado no
download tanto o projeto inicial, como
o projeto final, resultado das alteraes
feitas neste artigo.

Agrupando pedidos por cliente


Repare na Figura 2 que, quando um
cliente tem diversos pedidos, os dados
do cliente (no caso, o nome) aparecem
repetidos para cada pedido. Vamos
melhorar o relatrio, agrupando todos
os pedidos de um cliente e imprimindo somente uma vez os seus dados.
Precisamos definir um grupo para
fazer quebra de pedidos por cliente.
Quando um grupo criado no
JasperReports, automaticamente
so criadas duas novas bandas: nomegrupoHeader e nomegrupoFooter
(por exemplo, clienteHeader e clienteFooter). Colocamos nestas bandas as
informaes associadas ao grupo,
que neste caso so o nome e o valor
total do cliente; j os dados de cada
item do grupo permanecem na
banda detail (so eles os pedidos e
os itens de pedido do cliente).
Ta m b m p r e c i s o d e f i n i r u m a e x pr e s s o de ag r upa m e nt o, q ue ut i l i z ad a p e lo
JasperReports para fazer a quebra do gru-

36 Java Magazine Edio 38


jm38.indb 36

17/7/2006 14:11:58

s so a Passo

Aprenda a definir
agrupamentos e calcular
totais em vrios nveis,
num relatrio mestredetalhe, e como criar
grficos de resumo

r Reports

Ana Abrantes e Yara Senger


po. Usamos o nome do cliente. Para que
os grupos sejam apresentados da maneira
esperada, preciso que a fonte de dados
tambm esteja ordenada corretamente, ou
seja, a consulta SQL deve ter a clusula
order by (ou se for usado um datasource
de JavaBeans, deve-se passar uma coleo
com os objetos j ordenados de forma
compatvel com os grupos desejados, neste
caso o nome do cliente).
Pode haver vrios grupos aninhados;
por exemplo um grupo Regio, que engloba todos os clientes de uma determinada
regio; dentro deste um grupo Estado, e
assim por diante. Quando o grupo mais
externo for reinicializado, todos os grupos contidos nele tambm o sero.
Os passos para a criao do grupo so
os seguintes:
1. No iReport, abra o arquivo do relatrio,
RelatorioPedidos.jrxml.

2. Clique no cone de grupos


na barra de ferramentas, e
depois em New. Na janela que
aparece, configure o grupo
conforme a Figura 3 e clique
em OK.
3 . Mova o text f ield que
mostra o nome do cliente da
ba nda detail para a banda
clienteHeader, que acabou de ser
criada. Na aba Text Field das
propriedades do textfield, altere
a Textfield expression para:

Figura 1. Modelo de dados do projeto de exemplo.

Cliente: +$F{nomeCliente}

4. Na banda detail, apague o elemento


static text com a descrio Cliente. Este
texto no ser mais necessrio, pois o
nome do cliente s aparece uma vez para
cada grupo.

5. Como iremos agrupar os pedidos por


cliente, a fonte de dados deve ter os dados
ordenados por algum campo do cliente
que o diferencie; no nosso caso a consulta
SQL deve ter a clusula order by c.nome.
Desta forma, medida que o JasperReports

Como criar o relatrio inicial

iga estes passos para criar os relatrios que


utilizaremos e que foram criados conforme
o ltimo artigo.
1. Crie um banco de dados de nome ecommerce no MySQL conforme o diagrama na
Figura 1;
2. Abra o iReport;
3. Crie um novo relatrio chamado RelatorioPedidos;
4. Defina a conexo de dados a ser usada;
5. Configure a consulta do relatrio com a
seguinte string SQL:
SELECT p.data, p.numero, c.nome as nomeCliente
FROM pedidos p
JOIN clientes c ON p.id_cliente = c.id
ORDER BY p.numero
6. Somente as bandas pageHeader, detail e
pageFooter sero usadas; as demais devem ser
desativadas zerando-se sua band height;

7. Insira os elementos textfield (com os


campos do datasource), static text, imagem e
subreport at que o relatrio fique com a aparncia da primeira imagem da Figura 2;
8. Crie os parmetros subReport do tipo
net.sf.jasperreports.engine.JasperReport para
serem passados o arquivo do sub-relatrio e
pageRoot do tipo java.lang.String para o caminho
do projeto quer ser usado na localizao de
imagens e outros recursos;
9. Nas propriedades do elemento subreport, em Connection / Datasource expression, coloque Use connection expression, em
Subreport expression coloque $P{subReport}
e Su b r e p o r t E x p r e s s i o n C l a s s i g u a l a
net.sf.jasperreports.engine.JasperReport; em Subreport parameters adicione um parmetro
de nome numeroPedido com Default value
expression igual a $F{numeroPedido};
10. Crie um novo relatrio chamado Rela-

torioItens;
11. O relatrio no deve ter margens, e somente as bandas columnHeader e detail sero
usadas; as demais devem ser desativadas
zerando sua band height;
12. Configure a consulta deste relatrio com
a seguinte string SQL:
SELECT it.quantidade, pro.nome as nomeProduto, pro.preco
FROM pedidos_itens it
JOIN pedidos ped ON ped.numero = it.numero_pedido
JOIN produtos pro ON pro.id = it.id_produto
WHERE it.numero_pedido = $P{numeroPedido}
10. Insira os elementos textfield e static text
at que o relatrio fique com a aparncia da
segunda imagem da Figura 2;
11. Crie o parmetro numeroPedido do tipo
java.lang.Integer;
12. Ao executar, o relatrio ficar como mostrado ao final da Figura 2.

Edio 38 Java Magazine


jm38.indb 37

37

17/7/2006 14:11:59

Mais relatrios Passo a Passo

Total por pedido


Queremos agora exibir o
valor total de cada pedido, ou
seja, a soma dos valores de
todos os seus itens. Como os
dados do pedido esto no subrelatrio RelatorioItens.jrxml,
RelatorioPedidos.jrxml
vamos declarar uma varivel
e exib-la neste relatrio.
1. Abra o RelatorioItens.
jrxml,
RelatorioItens.jrxml
2 . Cl ique em Visualizar
|Variveis, e depois no boto
Novo.
3. Configure uma nova
varivel fazendo seu
atributo name igual a
total e Calculation Type
= Sum. Mude o tipo da
varivel (campo Variable
class Type) para java.lang.
Double. Indique tambm que
a varivel deve ser reinicializada sempre que o relatrio
for executado, configurando
ResetType para Report.
4. Ainda falta especificar
como a varivel total ser
calculada, ou seja, definir
a soma dos valores de cada
item do pedido. Para isso,
utilizamos o campo Variable
expression da varivel, fornecendo uma expresso (que
deve necessariamente ser do
tipo Double, devido configurao feita no passo anterior).
Figura 2. Relatrio e sub-relatrio iniciais (como criados na edio anterior), e
resultado da execuo do relatrio
Como o campo quantidade
do tipo java.lang.Integer e preco do tipo
percorre a fonte de dados, poder idenjava.lang.Double, precisamos converter estificar quais so itens que pertencem ao
ses campos para o tipo primitivo double,
mesmo grupo: uma mudana no valor de
realizar a multiplicao e armazenar o
nomeCliente indicar o incio de um novo
resultado em um objeto java.lang.Double, ou
agrupamento. V em Data|Consultas do
seja, a expresso ficar assim:
Relatrio|Report Query e altere a consulta
new Double ($F{quantidade}.doubleValue()
SQL acrescentando o nome do cliente na
*$F{preco}.doubleValue())
clusula order by:
5. A varivel deve ser inicializada com
SELECT p.data, p.numero, c.nome as nomeCliente
0;
por isto definimos o campo Initial Value
FROM pedidos p
JOIN clientes c ON p.id_cliente = c.id
Expression como new Double(0).
ORDER BY c.nome, p.numero
6. Clique em OK para finalizar. Veja os
resultados na Figura 5.
Veja na Figura 4 como ficam o layout e o
resultado da execuo do relatrio.
Feito isso, vamos mostrar o valor obti-

do na varivel total, aps listar todos os


itens:
1. V em Editar|Propriedades do Relatrio
e altere a altura para 60 pixels.
2 . n e c e s s r i o at i v a r a b a n d a
columnFooter: selecione Visualizar|Bandas
do Relatrio e altere na banda columnFooter
a sua band height para 20; clique no boto
Apply.
3. Adicione um textfield
banda
columnFooter e altere o campo Evaluation
time para Report, indicando que o valor
do textfield deve ser avaliado ao trmino
da execuo do relatrio (no caso, o
sub-relatrio que contm todos
os itens do pedido). Para que
a varivel total seja apresentada com formato de moeda,
vamos utilizar o formatador
obtido atravs do mtodo
getCurrencyInstance() da classe
java.text.NumberFormat, com a
seguinte expresso no campo
Textfield expression:
Total do Pedido: + java.text.NumberFormat.
getCurrencyInstance().format($V{total}.doubleValue())

O identificador do pacote,java.text, poderia ser


omitido nesta expresso; o JasperReports capaz
de encontrar sozinho a classe no Java SE.

Veja na Figura 6 como ficam o layout e o


resultado da execuo.

Total por cliente


Nosso prximo objetivo apresentar o

Figura 3. Tela de configurao do grupo de quebra de


pedidos por cliente.

38 Java Magazine Edio 38


jm38.indb 38

17/7/2006 14:12:01

RelatorioPedidos.jrxml

Figura 4. Relatrio depois de da criao do grupo cliente.

Figura 5.Tela de configurao da varivel que totaliza o


valor de um pedido.
valor total dos pedidos de cada cliente.
Primeiro ser necessrio criar uma varivel totalCliente no relatrio principal,
RelatorioPedidos.jrxml. Siga estes passos:
1. Crie uma varivel com campo name =
totalCliente.
2. Configure o tipo da varivel (Variable
Class type) para java.lang.Double (pois o total
dos pedidos desse tipo).
3. Faa Calculation type = System: no queremos que o JasperReports faa nenhum
tipo de clculo, mas sim que receba o valor
retornado pelo sub-relatrio (explicaremos
isso a seguir).
4. necessrio tambm fazer que a varivel seja reinicializada a cada grupo, pois
queremos o total por cliente. Neste caso o
campo Reset type deve ser igual a group e
Reset group = cliente (que o nome do grupo
definido anteriormente). Veja como fica o
relatrio na Figura 7.

Como o valor total de cada pedido


est sendo calculado no sub-relatrio
RelatorioItens.jrxml, atravs de sua varivel
total, vamos usar este valor para incrementar a varivel totalCliente no relatrio
principal, RelatorioPedidos.jrxml, enquanto
estiver sendo processado o mesmo cliente (na gerao do relatrio). Para fazer
esta ligao entre as variveis, criamos
um parmetro de retorno no elemento
subreport no RelatorioPedidos.jrxml, do
seguinte modo:
1. No relatrio RelatorioPedidos.jrxml,
abra a janela de propriedades do elemento
subreport, que est na banda detail; clique
na aba Subreport (Other) e dentro dela
mude para a aba Subreport return values.
2. Clique no boto Add e digite o nome
da varivel do sub-relatrio (Subreport
variable) que contm o valor que queremos
somar, neste caso a varivel total.
3. Indique o nome da varivel que deve
estar definida no relatrio principal onde
a totalizao ser armazenada (Local destination variable), ou seja, totalCliente.
4. Indique tambm que o clculo representa uma soma: Calculation type igual a
Sum.
Esta configurao est representada na
Figura 8.

Total do Cliente:
+ java.text.NumberFormat.getCurrencyInstance(
new Locale(pt,br)).format(
$V{totalCliente}.doubleValue())

Veja como ficam o layout do relatrio e o


resultado da execuo na Figura 9.

Total geral
O prximo passo apresentar o valor
total dos pedidos de todo o relatrio. Novamente usaremos a varivel com o valor
total de cada pedido (no sub-relatrio) e
teremos de criar uma varivel no relatrio
RelatorioPedidos.jrxml para armazenar o
total geral, da mesma forma que foi feito
com a varivel de total por cliente.
E xe c ut e o s s e g u i nt e s pa s s o s e m
RelatorioPedidos.jrxml:
1. Crie uma varivel com campo name
igual a totalGeral.
2. Configure o tipo da varivel (Variable
Class type) para java.lang.Double.
3. Defina Calculation type = System.
4. A varivel deve ser reinicializada sempre que o relatrio executado; ento altere
o campo Reset type para Report.
Veja o resultado na Figura 10.
A seguir, preciso configurar em
RelatorioPedidos.jrxml mais um parmetro
de retorno no elemento subreport, para
que o valor da varivel total do sub-rela-

Falta apenas exibir a varivel totalCliente no final do


grupo cliente, ou seja,
na banda clienteFooter
(criada automaticamente ao criar o gruRelatorioItens.jrxml
po cliente):
1 . Ad i c i o n e u m
textfield banda
clienteFooter. Altere
seu Evaluation time
para group e faa
Evaluation Group =
cliente, indicando
que o textfield deve
ser avaliado ao final
desse grupo.
2. Configure a Textfield expression de
forma que o valor
seja apresentado
como moeda, da seFigura 6. Relatrio com total por pedido.
guinte forma:

Edio 38 Java Magazine


jm38.indb 39

39

17/7/2006 14:12:02

Mais relatrios Passo a Passo

trio tambm seja passado para a varivel


totalGeral do relatrio principal. Faa o
seguinte:
1. No relatrio principal RelatorioPedidos.
jrxml, abra a janela de propriedades do elemento subreport; clique na aba Subreport
(Other) e dentro dela selecione a aba Subreport return values.
2. Clique no boto Add e digite o nome
da varivel do sub-relatrio (Subreport
variable) que contm o valor a ser somado:
total.
3. Indique o nome da varivel que deve
estar definida no relatrio principal onde
a totalizao ser armazenada (Local
destination variable), ou seja, a varivel
totalGeral.
4. Indique tambm que o clculo representa uma soma, fazendo Calculation type
= Sum.
Veja essas configuraes na Figura 11.
Resta apenas exibir a varivel totalGeral
no final do relatrio:
1. Coloque na banda summary um
textfield com Evaluation time = Report; isso
faz com que o textfield seja avaliado ao

final da gerao do relatrio.


2. Configure a Textfield expression de
modo que o valor seja apresentado como
moeda, novamente utilizando o formatador de moedas, da seguinte maneira:
Total Geral: + java.text.NumberFormat.getCurrencyInstance(
new Locale(pt,br)).format($V{totalGeral}.doubleValue())

Veja na Figura 12 como ficam o layout e


o resultado da execuo.

Grfico de vendas por cliente

SELECT c.nome as nomeCliente,


SUM(it.quantidade * pro.preco) as totalCliente
FROM pedidos_itens it
JOIN pedidos ped ON ped.numero = it.numero_pedido
JOIN produtos pro ON pro.id = it.id_produto
JOIN clientes c ON ped.id_cliente = c.id
GROUP BY c.nome

Depois clique em OK para salvar as


alteraes. Ao ser definida a consulta, os
campos retornados sero automaticamente
declarados no subdataset.

O JasperReports tem suporte a grficos,


O elemento de grfico
atravs de um elemento de relatrio que
J podemos incluir o grfico no relausa a biblioteca JFreeChart (jfree.org/
trio:
jfreechart). Este elemento tambm est dis1. V em Visualizar|Bandas do Relatrio,
ponvel na barra de ferramentas
do iReport, e permite a configurao de um subconjunto das
propriedades visuais suportadas
pelo JFreeChart.
Como exemplo, vamos acrescentar um grfico de barras que
mostra o valor total consumido
por cada cliente em todos os
pedidos realizados por esse
RelatorioPedidos.jrxml
cliente no final do relatrio
RelatorioPedidos.jrxml, na banda
summary.

Subdataset

Figura 7.Tela de configurao da varivel que totaliza o


valor de pedidos por cliente.

Figura 8. Configurao de parmetro de retorno do subreport.

Precisamos que os valores sejam agrupados pelo cliente, ou


seja, necessrio criar uma consulta SQL diferente da definida
no relatrio principal. Por isso
iremos usar um subdataset.
Um subdataset um elemento
do JasperReports usado para
fornecer uma fonte de dados Figura 9. Relatrio com total por cliente.
secundria para um grfico.
Subdatasets tm seus prprios parmetros,
variveis e fields, e podem ter tambm
uma consulta SQL executada (ou um
outro datasource, que neste caso viria de
um dos campos do datasource principal).
O conceito muito parecido com o de um
subreport, e possvel ter vrios subdatasets num mesmo relatrio.
Para criar o subdataset:
1. V at Editar|Subdatasets e clique em New.
2. Clique em Create. Isso habilita os demais botes da janela.
3. Clique em Query, e insira a seguinte
consulta SQL:
Figura 10. Tela de configurao da varivel de total geral.

40 Java Magazine Edio 38


jm38.indb 40

17/7/2006 14:12:03

Figura 11. Configurao de parmetro de retorno do subreport.

RelatorioPedidos.jrxml

Figura 12. Relatrio com total geral.

Figura 13. Tela de criao e edio de um subdataset.

Figura 14. Layout do relatrio com o grfico j inserido.

aumente a altura da banda summary para


385 e clique em Apply.
2. V em Editar|Propriedades do Relatrio
e, na aba More, selecione Sumrio a cada
nova pgina (que deveria ter sido traduzido como Sumrio numa nova pgina).
3. Em seguida, adicione um elemento de
grfico
, escolha o grfico de barras, e
ajuste suas dimenses para que ocupe a
maior parte possvel da banda. Veja na
Figura 14 como ficar o layout.
Agora vamos configurar o grfico:
1. Clique com o boto direito sobre o
grfico e selecione Chart properties.
2. Altere o campo Chart title expression
para Valores por Cliente; este valor ser
exibido no ttulo do grfico.
3. Faa Orientation = Horizontal, o que
vai ajudar na leitura dos nomes dos
clientes.
4. Faa Category axis label expression =
cliente; esta a descrio que aparecer no eixo em que ficam os nomes dos
clientes.
5. Altere Value axis label expression para
valores, que a descrio a ser mostrada
no eixo dos valores.
6. Selecione Show labels, para que apaream os valores correspondentes a cada
uma das barras.
Veja na Figura 15 as configuraes
realizadas.
Aps configurar visualmente o grfico, temos que indicar os dados a serem
exibidos. Esses dados esto definidos no
subdataset criado anteriormente. importante observar que ao utilizar um subdataset, somente os campos, parmetros e
variveis definidos no subdataset estaro
disponveis para o grfico. Porm, os campos, parmetros e variveis do relatrio
principal no estaro disponveis.
Vamos ento vincular o grfico ao subdataset seguindo os seguintes passos:
1. Clique na aba Chart data desta mesma
janela de propriedades do grfico para
configurar a fonte de dados do grfico.
2. Na caixa Dataset run da aba Dataset,
selecione o subdataset que criamos no
combobox Subdataset.
3. Clique na aba Connection/Datasource
exp e selecione Use connection expression. Isso faz com que o iReport utilize a mesma conexo do relatrio,

Figura 15.Tela de configurao das propriedades de um grfico.

Figura 16.Configurao da fonte de dados do subdataset


do grfico.

Figura 17.Configurao dos campos do subdataset usados


pelo grfico.
Edio 38 Java Magazine

jm38.indb 41

41

17/7/2006 14:12:04

Mais relatrios Passo a Passo

Como executar o relatrio

declarando automaticamente a expresso


$ P {REPORT_ CON NECTION}. Veja a
Figura 16.

entro do diretrio do projeto, temos os


seguintes subdiretrios:
reports para os arquivos .jrxml;
src para as classes Java;
web para os arquivos JSP;
web/WEB-INF para o web.xml;
web/WEB-INF/lib para os arquivos JAR
necessrios.

Por fim, selecione a aba Details e depois


clique no boto Add, para incluir uma
Category series:
1. Faa Series expression igual a valores
(o nome da srie).
2 . Altere Categor y expression para
$F{nomeCliente}; esta a expresso que ser
avaliada para obter os nomes mostrados no
eixo de categorias.
3 . M u d e Va l u e e x p r e s s i o n p a r a
$F{totalCliente}, que a expresso a ser
avaliada para obter os valores exibidos no
eixo de valores. Veja a Figura 17.
Veja como fica o grfico aps a execuo do
relatrio na Figura 18. Com isso, chegamos
ao final deste tutorial. O relatrio e o grfico
j podem ser compilados e executados conforme instrues do quadro Como executar
o relatrio.

Concluses
Neste tutorial mostramos como fazer
agrupamentos e totalizaes e como criar
grficos, em um relatrio mestre-detalhe.
Vimos tambm como definir variveis e a
importncia de indicar o tipo de clculo
e de reinicializao adequados para cada
tipo de varivel. O momento de avaliao

Vamos usar o Ant para efetuar algumas


operaes; para isso criamos um arquivo
build.xml que est no diretrio raiz do projeto
inicial (includo nos downloads deste artigo).
Primeiro precisamos compilar os dois templates de relatrio. Abra uma janela de prompt de

do textfield que utiliza uma varivel (e,


se for o caso, tambm o grupo) essencial para se obter o resultado desejado. O
uso de variveis de extrema utilidade
e dificilmente teremos relatrios mais
elaborados sem a sua utilizao.
Vimos ainda como criar um grfico
simples, que tambm utiliza totais, e percebemos que este um recurso que ainda
tem algumas limitaes de configurao
no JasperReports. Mas o JasperReports j
est integrado o suficiente ao JFreeChart,
a ponto de nos oferecer um resultado
satisfatrio com facilidade.

comando no Windows ou terminal no Linux, v


at o diretrio do projeto e digite: ant compile.
Depois devemos compilar a classe do servlet,
que far a execuo do relatrio. Na mesma
janela de prompt, digite ant javac.
P a r a f i n a l i z a r, g e r a m o s o a r q u i v o
ecommerce.war. V ao prompt de comando e
digite: ant war.
Em seguida, copie o WAR para a pasta webapps do Tomcat.
Feito isso, inicie o Tomcat, abra o seu
navegador web e digite a seguinte URL:
http://localhost:8080/ecommerce.
Clique no link que aparece na tela, e o relatrio ser gerado.

jasperreports.sf.net
Site da biblioteca JasperReports, onde se
pode encontrar downloads do software,
documentao, fruns e mais.
ireport.sf.net
Site da ferramenta iReport, tambm com
downloads, novidades etc.
jfree.org/jfreechart
JFreechart, biblioteca usada para a criao de
grficos no JasperReports/iReport
javamagazine.com.br/downloads/jm38/
jm-maisrelatorios.zip

Ana Abrantes
(ana.abrantes@globalcode.com.br)
desenvolvedora Java na
Globalcode, co-autora do curso
de JasperReports/iReport e possui
algumas certificaes em Java (SCJA, SCJP e SCWCD).
formada pela FATEC-SP e atua na rea de informtica
h mais de 15 anos.
Yara M. H. Senger
(yara@globalcode.com.br) formada
em Cincias da Computao na USP
em So Carlos, especialista em desenvolvimento web; possui as certificaes
SCJA, SCJP e SCWCD. Atualmente Instrutora e Diretora
Educacional da Globalcode, criadora e coordenadora
de diversos cursos das carreiras Academia do Java e
Academia do Web Developer.
Figura 18.ltima pgina do relatrio gerado, com grfico inserido.

42 Java Magazine Edio 38


jm38.indb 42

17/7/2006 14:12:10

es
a

Edio 38 Java Magazine


jm38.indb 43

43

17/7/2006 14:12:16

Interfaces Grficas co m
Parte 1: Conceitos e Tcnicas Fundamentais, e a

AP

T
p

projeto de interfaces grficas


eficazes exige mais do que conhecimento sobre componentes
visuais ou outras questes relacionadas
tecnologia. So detalhes mais humanos
que fazem a diferena, e que precisam
ser compreendidos antes mesmo de se
digitar qualquer linha de cdigo. Os
efeitos que cada elemento visual produz

sobre nossos olhos revelam detalhes que


complementam o significado das informaes e auxiliam o usurio a entender
o contedo da imagem observada.
Este artigo apresenta a primeira parte
de uma srie voltada para a qualidade
das interfaces grficas, apresentando
tcnicas fundamentais para um bom
projeto visual. Comearemos analisan-

do a importncia do projeto visual para


o desenvolvimento de GUIs (Graphic
User Interfaces; interfaces grficas com
o usurio). Em seguida, abordaremos
erros comuns e tcnicas de organizao
de interfaces. E veremos como utilizar
a API JGoodies Forms para montar
telas eficientes e com poucas linhas de
cdigo.

44 Java Magazine Edio 38


jm38.indb 44

17/7/2006 14:12:18

o m Qualidade
a

API JGoodies Forms

Saiba como projetar


interfaces grficas
eficazes que facilitam a
vida dos usurios, e como
implement-las utilizando a
API Forms do JGoodies

HUGo vIdaL teIXeIra

Tcnicas de
projeto visual
P

or ser um conceito muito abstrato,


qualquer julgamento sobre a qualidade de um software difcil.
Embora existam normas e processos de
engenharia de software voltados para
esse propsito, a tendncia de um usurio determinar a qualidade de algo que
no conhece baseando-se naquilo que
v e sente. Assim, a interface grfica de
um sistema conta muito para uma boa
impresso.
Vamos comear explorando algumas
questes fundamentais que precisam
estar claras para qualquer equipe envolvida na criao de GUIs. A importncia
dessas questes est relacionada ao papel
do projeto visual no desenvolvimento e o
momento em que ele deve ser aplicado.
Em primeiro lugar, o projeto visual no
uma tarefa que pode ser deixada para
depois. Este um erro comum cometido
em muitos projetos e que ainda precisa
ser combatido. Para ser eficaz, o projeto
visual precisa estar bem integrado ao
ciclo de vida de desenvolvimento, permitindo que interfaces grficas possam
ser elaboradas e melhoradas conforme
o entendimento do problema avana ao
longo do tempo.
comum vermos empresas que deixam
o projeto e a implementao de GUIs apenas nas mos de programadores sem experincia na criao de interfaces, e sem

nosso estudo analisando alguns dos


principais erros cometidos no projeto de
GUIs. Em seguida veremos tcnicas de
organizao de informaes e de reduo
de poluio grfica, entre outras.

Erros comuns em interfaces grficas


Uma tcnica de aprendizado muito
eficiente a analise de erros comuns
cometidos no desenvolvimento de interfaces grficas. Ilustraremos esta tcnica
com um exemplo veja a Figura 1 que
resume alguns problemas que precisam
ser sempre evitados. Voc dificilmente
encontrar todos esses problemas juntos
na mesma tela de um sistema real, mas
a freqncia com que cada um aparece
separadamente bastante alta.
Vejamos os erros. Comece observando
os componentes JTextField desalinhados
na parte superior esquerda da tela. As
suas posies horizontais variam de
acordo com o tamanho de cada JLabel.
Esse problema de alinhar os JLabels, mas
no os componentes relacionados, torna

apoio de designers e outros especialistas


em projeto visual. O resultado dessa deciso freqentemente so sistemas com
telas complexas e pouco intuitivas, que
s vezes confundem seus usurios por
refletirem diretamente as entidades de
negcio por trs do sistema (EJBs, tabelas
etc.). Alm disso, o desconhecimento de
princpios de criao de interfaces ou a
simples vontade de embelezar muito a
tela podem resultar em interfaces pobres
e excessivamente poludas.
A segunda questo que precisamos
destacar a suposio incorreta de que
o simples uso de componentes e APIs
(como os do Swing e do AWT) suficiente para se alcanar os benefcios
de uma boa apresentao. A forma com que essas
peas so unidas
to importante qua nto cada
pea individual.
E necessrio ir
alm; entender a
influncia e efeitos que diferentes composies
cau sa m nu ma
GUI.
Comearemos Figura 1. Tela de exemplo que ilustra um projeto visual com problemas.

Edio 38 Java Magazine


jm38.indb 45

45

17/7/2006 14:12:20

Interfaces Grficas com Qualidade

a leitura dos valores muito mais difcil


do que poderia ser.
Agora observe o grupo Medidas e
repare como os JTextFields esto colados,
enquanto sobra muito espao ao redor.
Observe ainda que a base dos textos
dos JLabels no est alinhada com a base
dos textos dos JTextFields, o que tambm
atrapalha a leitura dos valores.
Descendo mais o olho, percebemos
que a parte inferior da tela est dentro
de uma borda interna e ainda contm
subgrupos com bordas e ttulos. A borda
interna cria uma dimenso desnecessria
que polui mais do que realmente enfatiza
aquela rea. J a borda dos subgrupos
distrai os olhos e gera uma separao
visual pouco eficaz entre os elementos.
A presena de bordas aninhadas normalmente revela um projeto visual pobre.
Veremos como combater esse problema
na seo Reduo de poluio grfica,
mais adiante.
Os problemas ainda no acabaram.
Repare a repetio desnecessria da
palavra Controle tanto no label da
JComboBox quanto no ttulo do subgrupo.
Alm disso, existem duas JTextAreas, uma
com borda 3D e outra no. uma inconsistncia comum normalmente causada
(por exemplo) pelo fato de desenvolvedores diferentes alterarem a mesma tela,

sendo que um adicionou


o recurso e o outro, sem
notar a presena da borda,
deixou de seguir o mesmo
estilo.
Para terminar nossa anlise, note que o subgrupo
Comandos no est alin hado com o resto dos
componentes, e que no
ocupa toda a largura disponvel na tela, deixando
de aproveitar um espao
valioso. Compare ainda Figura 2. Problemas de redimensionamento na tela de exemplo.
o t a m a n ho do s bot e s
Editar grande demais). J o subgrupo
existentes, e verifique que no existe um
Comandos permaneceu intacto e popadro consistente.
deria ter aproveitado melhor o espao,
por conter um JTextArea. Alm disso,
Cuidados com redimensionamento
vrios espaos vazios surgiram na tela,
Algumas armadilhas ainda aguardam
reduzindo o relacionamento visual entre
o desenvolvedor desatento. Um teste
os componentes.
que no podemos deixar de fazer no
desenvolvimento de interfaces obserTcnicas de organizao visual
var como a janela se comporta quando
Agora que j vimos um pouco sobre
redimensionada.
o que no fazer em interfaces grficas,
O teste de redimensionamento importante
podemos discutir alguns princpios geem GUIs criadas com toolkits como AWT, Swing
rais para boa organizao e estruturao
e SWT, porque estes utilizam gerenciadores de
visual. As tcnicas que abordaremos
layout que formatam e posicionam cada comaqui esto divididas em trs categorias:
ponente, seguindo regras prprias que no so
Simetria e Balanceamento, Alinhamento
totalmente explicitadas pela GUI.
e Relacionamentos Visuais, e Formatao
com Espaos Vazios.
prat ica mente i mpossvel con seA idia, ao fazer o redimensionamenguir elaborar GUIs eficazes sem o uso
to, favorecer sempre aqueles compodessas tcnicas. Para nossa sorte, so
nentes que podem crescer sem deixar
tcnicas simples, e o domnio vem com
a tela desproporcional, como JTables,
pouco tempo de prtica. So princpios
JTextAreas, JTrees, JLists etc. Caso uma jaque fazem parte de disciplinas como
nela no possua componentes deste tipo,
design grfico e ergonomia, alm de
podemos sempre pensar em proibir o
serem apoiados pela rea de psicologia
redimensionamento atravs do mtodo
cognitiva. Portanto, so muito valiosos
setResizable (false) da classe
para causar uma boa impresso em
Frame.
qualquer trabalho, mesmo fora da rea
A Fig ura 2 most ra
de software.
esse problema com
a ja nela do nosso
Simetria e balanceamento
exemplo. Repare que
Simetria uma propriedade que reo subg r upo Consulta da harmonia e equilbrio de uma
trole foi favorecido
estrutura. muito importante por ser
sem necessidade (o
facilmente reconhecida e agradvel aos
que dei xou o bot o

46 Java Magazine Edio 38


jm38.indb 46

17/7/2006 14:12:22

nossos olhos. Sempre que uma forma


repetida seja por translao, rotao
ou reflexo cria-se uma nova imagem
simtrica que compartilha caractersticas
semelhantes. No mundo dos smbolos
visuais, as figuras mais memorveis normalmente so muito simtricas, como a
estrela, a seta, a cruz e o yin-yang.
A simetria um fator importante quando o objetivo do trabalho depende de
balanceamento, ordem e simplicidade.
Para elaborar um layout simtrico, algumas dicas so importantes:
1. Identificar os eixos pelos quais a simetria
ser estabelecida. Em interfaces grficas, a
simetria normalmente vertical e horizontal. A simetria diagonal mais rara,
mas tambm valida.
2. Posicionar a informao sobre o eixo
de simetria atravs de um balanceamento
cuidadoso de cada lado. A informao no
precisa formar um espelho perfeito, mas

tente igualar aspectos como quantidade


e espao ocupado.

Alinhamento e relacionamentos visuais


O alinhamento o meio mais importante de se estabelecer relacionamentos
entre elementos. Objetos ali n hados
criam uma forte atrao entre si, mesmo
quando separados por longas distncias.
Isso acontece porque nossos olhos tm
preferncia natural por estruturas regulares, onde regies bem definidas podem
ser facilmente identificadas. Por outro
lado, elementos desalinhados produzem
tenso no observador, o que pode causar
incmodo ou dvida quanto s relaes
entre os elementos.
Uma das vantagens em se alinhar elementos a reduo da complexidade da
tela, a qual se torna mais limpa e mais
fcil de ser compreendida. Uma interface
eficaz precisa estabelecer relacionamen-

tos visuais entre suas estruturas sempre


que possvel, e o alinhamento um passo
necessrio a uma apresentao coerente.
Para estabelecer um bom alinhamento,
considere as seguintes dicas:
1. Identifique as principais fronteiras
da tela e procure um modo de organizar
seus elementos em alinhamento com
essas fronteiras.
2. Procure por elementos e margens
(internas ou externas) que podem ser
alinhados pela alterao de seus tamanhos ou posies.
3. Identifique elementos mais soltos
na tela e verifique se esto alinhados
com alguma outra coisa, seja com uma
margem principal, seja com algum outro
elemento associado a eles.
4. Se um elemento no est relacionado
a nenhum outro na tela, tente posicion-lo de forma a balancear o espao j
ocupado.

Edio 38 Java Magazine


jm38.indb 47

47

17/7/2006 14:12:26

Interfaces Grficas com Qualidade

existirem fronteiras
bem definidas).
3. Identifique elementos que precisam de uma nfase visual adicional
(como ttulos). Aumente o espaamento
entre esses elementos
e outros considerados
crticos.

Formatao com espaos vazios


Quando projetamos telas para
sistemas de informao, temos uma
tendncia natural de tentar incluir
o mximo de informaes possveis
para o usurio. Essa busca por utilizar cada pixel disponvel resulta
normalmente em telas saturadas e
com muita poluio visual. da que
vem a importncia de se utilizar espaos vazios na organizao da informao, direcionando os olhos do usurio
para certas regies da tela e permitindo
que cada pedao de informao seja
corretamente destacado.
Espaos vazios na tela no significam
desperdcio, mas sim um elemento poderoso para guiar a ateno do observador. Essa tcnica uma das melhores
solues para evitar o uso de bordas e
linhas que delimitam reas da tela. As
seguintes dicas ajudaro voc a encontrar os melhores lugares para aplicar
essa tcnica:
1. Agrupe as informaes em conj u nt o s d e t a m a n h o s g e r e n c i ve i s
(ex. : no m x i mo sete elementos) e
def i n a sua s pr ior idades de acordo
com a i mpor t nc i a da i n for m a o
para o usurio.
2. Garanta uma separao entre os conjuntos de informao atravs da adio
de espao vazio entre eles (mesmo se j

Embora o espao vazio seja uma varivel


poderosa em termos de percepo,
ele tambm o
mais custoso,
ut i l i za ndo o
pouco e spao
q ue d i s p omo s
para mostrar as
i n for m a e s. A s si m, a tc n ica deve ser u sada sem
exageros.

Reduo de poluio grfica


Existem algumas tcnicas de identificao e remoo de poluio visual que
precisam estar na ponta da lngua de
quem desenvolve interfaces grficas.
Uma delas, e na minha opinio, uma das
mais divertidas, a chamada tcnica das
unhas na tela. Como todos j percebemos,
toolkits Java como Swing e AWT, e os de
outras linguagens, desenham seus componentes utilizando cores que simulam
um pseudo-3D dando a sensao de
profundidade.
exatamente essa sensao de 3D que
exploramos nessa tcnica. Imagine que
voc fosse capaz de sentir os relevos 3D
e passasse suas unhas sobre a tela em um
movimento contnuo, qual grau de vibra-

o voc sentiria? Se for sentida uma


trepidao grande, sua tela provavelmente precisa ser revisada. Agora se forem
percebidos apenas alguns nveis, sua tela
provavelmente no est poluda.
importante ressaltar que o objetivo
dessa tcnica apenas identificar bordas
e linhas que o programador adicionou
i nterface sem necessidade. Como
primeiro exemplo, volte Figura 1 e
veja como bordas inteis se confundem
com as bordas dos componentes. Temos
outro exemplo ilustrado na Figura 3,
onde duas vises de um mesmo painel
so apresentadas. Repare que a substituio das bordas com ttulo por JLabels
reduziu a poluio do painel e resultou
em uma tela mais simples e clara para
o usurio.
Lembre-se que as bordas naturais dos
componentes so as poucas que devem
predominar na tela, j que trazem informaes teis ao usurio. Portanto, no se
incomode com elas.
Outra questo so os novos e modernos
look-and-feels que simulam interfaces
arredondadas e com componentes brilhantes. Visuais como o da Figura 4, por
exemplo, produziriam uma sensao de
ondulao nas unhas que poderia atrapalhar essa tcnica. Nesses casos, no se
preocupe com essas ondulaes; preste
ateno somente nas bordas e linhas que
o programador possivelmente colocou
em excesso. Isso no consegue passar
despercebido mesmo quando usamos
um look-and-feel bem projetado, como
mostrado na Figura 4: veja o excesso de
bordas causadas pelo aninhamento de
componentes JTabbedPane.
Na prxima seo, mostraremos como
implementar interfaces grficas lanando mo dos princpios e tcnicas apresentadas at aqui.

Figura 3. Excesso de bordas no painel esquerda em contraste com a simplicidade do painel direita.

48 Java Magazine Edio 38


jm38.indb 48

17/7/2006 14:12:30

Implementao
com JGoodies
U

ma das solues open source mais


interessantes para quem trabalha com Java no desktop , sem
dvida, o conjunto de APIs do JGoodies.
Consulte o quadro O que JGoodies?,
ao final desta seo, para conhecer melhor
essa iniciativa. Veremos agora como utilizar
a API JGoodies Forms para implementar
interfaces eficazes em Java. Nosso objetivo
principal ser reconstruir a tela inicial
apresentada nas Figuras 1 e 2 (onde muitos
erros foram encontrados) seguindo as tcnicas de projeto visual apresentadas.

Preparao
A obteno e instalao da API Forms
so bastante simples: navegue at o site
do JGoodies (jgoodies.com), v at a seo
Downloads e clique em Libraries. L voc
ter acesso aos arquivos zipados de todas
as APIs, os quais contm exemplos, documentao, cdigo-fonte e o JAR que deve
ser includo no classpath da sua aplicao

para executar os exemplos.

O FormLayout revela-se como uma soluo


vantajosa por ser simples e intuitivo, e adequado para a codificao direta sem o uso
de editores visuais de interfaces. Voc ver
a partir de agora que o cdigo exigido para
a montagem de uma tela normalmente
bem curto e de fcil leitura, o que aumenta
a produtividade do desenvolvedor.

Comeando com o FormLayout


A classe central da API Forms FormLayout,
um gerenciador de layout que divide a tela
em linhas e colunas flexveis. Assim como
a classe GridBagLayout do Java SE, o FormLayout
alinha componentes s clulas da grade
retangular que forma a tela, permitindo
que cada componente ocupe uma ou mais
clulas.
Uma das mais importantes vantagens do
FormLayout o uso da grade para dividir o espao
da tela. De fato, essa a principal tcnica utilizada
pelos designers profissionais. Uma grade alinha,

Listagem 1. Mtodo para criar o painel do exemplo da Figura 5 com o FormLayout.


private static Component montaPainelExemplo() {
FormLayout layout = new FormLayout(
right:pref, 3dlu, pref, 3dlu, 15dlu, 10dlu, right:pref, 3dlu, pref, // colunas
pref, 3dlu, pref, 3dlu, pref); // linhas
layout.setColumnGroups(new int[][] { {1, 7}, {3, 9} });
JPanel panel = new JPanel(layout);

organiza e oferece uma maneira consistente de


trabalhar com diferentes tipos de elementos interrelacionados.

CellConstraints cc = new CellConstraints();


panel.add(new JLabel(Nome:), cc.xy (1, 1));
panel.add(new JTextField(), cc.xyw(3, 1, 7));
panel.add(new JLabel(CPF:), cc.xy (1, 3));
panel.add(new JTextField(10), cc.xy (3, 3));
panel.add(new JLabel(Categoria:), cc.xy (1, 5));
panel.add(new JComboBox(), cc.xy (3, 5));
panel.add(new JButton(...), cc.xy (5, 5));
panel.add(new JLabel(Telefone:), cc.xy (7, 3));
panel.add(new JTextField(), cc.xy(9, 3));
panel.add(new JLabel(Telefone(Fax):), cc.xy (7, 5));
panel.add(new JTextField(), cc.xy(9, 5));
return panel;

Usando o FormLayout
Para a criao de uma instncia de
FormLayout, passamos no construtor duas
strings que definem, respectivamente, as
colunas e as linhas que formam a grade da
tela sendo projetada. O JGoodies Forms define uma linguagem simples para montar
essas strings e especificar cada linha e coluna. Uma vantagem que toda a estrutura
do painel est centralizada nessas duas
strings, o que facilita a sua compreenso
e rpida modificao. Em outros gerenciadores, a estrutura normalmente fica
espalhada, exigindo que o desenvolvedor
leia partes extensas do cdigo de GUI para
entender a estrutura sendo definida.
Nosso primeiro exemplo o painel
ilustrado na Figura 5. Para cri-lo utilizando o FormLayout, esboamos a tela em
papel e identificamos as linhas e colunas
que formam a sua estrutura. Observe a
Figura 6 e veja como o painel foi projetado. Repare que existem nove colunas.
As colunas 1, 3, 7 e 9 determinam que a
largura seja a largura preferida dos componentes inseridos em seu interior (no
caso, JLabels ou JTextFields / JComboBoxes).
As colunas 1 e 7 exigem ainda que seus
componentes estejam alinhados direita.
Note que a contagem das linhas e colunas
comea em 1.
As colunas 2, 4 e 8 formam um espaamento de proporo fixada em 3dlu
(dialog units). Essa unidade estabelece um
tamanho que independente de pixels e
calculado levando em conta o tamanho
das fontes (definido pelo look-and-feel) e
a resoluo da tela. Dessa forma, podemos

Edio 38 Java Magazine


jm38.indb 49

4

17/7/2006 14:12:31

Interfaces Grficas com Qualidade

mudar essas caractersticas, e as propores sero sempre mantidas.


Da mesma forma, a coluna 6, que divide
a tela ao meio, possui a largura fixada em
10dlu. Poderamos ter inserido uma linha
para separar os dois grupos inferiores,
mas lembre-se que usar espaos vazios
sempre melhor. Por fim, a coluna 5 ficar
com a largura fixa de 15dlu para o nico
boto nela inserido.
As linhas da grade seguem o mesmo estilo
das colunas. Assim, as linhas 1, 3 e 5 ficam
com a altura preferida dos componentes,
enquanto as linhas 2 e 4 so fixadas em
3dlu. Com essas informaes, j podemos

instanciar nosso gerenciador de


layout:
FormLayout layout = new FormLayout(
right:pref, 3dlu, pref, 3dlu, 15dlu, 10dlu, right:
pref, 3dlu, pref, // colunas
pref, 3dlu, pref, 3dlu, pref); // linhas

Para manter uma boa simetria no painel, podemos utilizar


o recurso de agrupamento de
linhas e colunas, que garante
tamanhos iguais para conjuntos
definidos atravs dos mtodos
setColumnGroups() e setRowGroups().
No nosso caso, interessante

Figura4. Bordas aninhadas em um projeto com look-and-feel moderno.

Figura5. Exemplo simples de um painel para ilustrar o FormLayout.

Tipo de especificao

Valores

Exemplos

Alinhamento de
Colunas

fill ou f: preencher com o contedo (default).


left ou l: alinhado esquerda.
center ou c: centralizado.
Right ou r: alinhado direita.

fill:30dlu coluna de 30dlus de largura, onde os componentes so


esticados para ocupar toda a largura.
right:pref coluna onde os componentes ficam alinhados direita, e
sua largura a largura preferida dos componentes.

Alinhamento de Linhas

center ou c: centralizado (default).


top ou t: alinhado ao topo.
bottom ou b: alinhado ao cho.
fill ou f: preencher com o contedo.

top:100px linha de 100 pixels de altura, onde todos os componentes esto alinhados na parte de cima (topo).
fill:3cm linha de 3 cm de altura, onde os componentes ocupam todo
o espao vertical.

Tamanho Constante

Inteiro + Unidade
Onde Unidade pode ser: px (pixel), pt (point) ou dlu
(dialog unit). (Obs.: 1 pt = 1/72 polegada)
ou
Double + Unidade
Onde Unidade pode ser: in (polegada), mm ou cm.

10px linha/coluna com 10 pixels de altura/largura.


36pt linha/coluna com 36 pontos de altura/largura (36 pontos =
polegada).
0.33cm linha/coluna com 0.33 cm de altura/largura.
0.15in linha/coluna com 0.15 polegadas de altura/largura.

Tamanho de
Componente

min ou m: tamanho mnimo.


pref ou p: tamanho preferido.
default ou d: tamanho default.

min linha/coluna com a altura/largura mnima dos componentes.


pref linha/coluna com a altura/largura preferida dos componentes.

Tamanho Limitado

min(constante;componente): assume o tamanho menor


entre os valores.
max(constante;componente): assume o tamanho maior
entre os valores.

min(30dlu;p) linha/coluna cuja altura/largura assume o menor valor


entre 30dlu e a altura/largura dos componentes.
max(0.5cm;p) linha/coluna cuja altura/largura assume o maior valor
entre 0.5cm e a altura/largura dos componentes.

Redimensionamento

none: nenhum (default).


grow: cresce conforme o painel cresce.
grow(double) ou g(double): cresce seguindo a proporo
passada como parmetro. Essa definio s faz sentido
quando existem mais linhas/colunas que crescem no mesmo painel. Assim, podemos definir aquelas que crescem
mais do que as outras.

pref:grow linha/coluna que cresce na mesma proporo do crescimento do painel.


p:g(0.5) linha/coluna que cresce com a metade da proporo do
crescimento do painel.

Tabela 1. Valores para especificao de uma linha ou coluna.

50 Java Magazine Edio 38


jm38.indb 50

17/7/2006 14:12:32

manter as colunas 1 e 7, assim como 3 e 9, com


a mesma largura (lembre-se que a simetria
importante). Portanto, podemos definir:
layout.setColumnGroups(new int[][] { {1, 7}, {3, 9} });

Agora s falta adicionar os componentes


ao painel. Para isso, precisamos utilizar uma classe chamada CellConstraints,
para posicionar os componentes na
grade. Essa classe possui o mtodo
xy(int coluna, int linha) que posiciona um componente em uma determinada clula.
Assim, para adicionar o primeiro JLabel ao
nosso exemplo, fazemos:

CellConstraints cc = new CellConstraints();


panel.add(new JLabel(Nome:), cc.xy (1, 1));

Alm de xy(), existe o mtodo xyw(), usado


para posicionar um componente que se estende por vrias colunas. Assim, podemos
adicionar o primeiro JTextField do exemplo,
da seguinte forma:
// Adiciona o componente na coluna 3, linha 1,
// e ocupa a largura de 7 colunas
panel.add(new JTextField(), cc.xyw(3, 1, 7));

O resto do cdigo deste exemplo simples


est na Listagem1. Agora vamos estudar um
pouco mais a linguagem de especificao de
linhas e colunas do JGoodies, e refazer o exemplo inicial do artigo.

Especificando Linhas e Colunas

Figura6. Projeto das linhas e colunas do painel de exemplo.

Figura7. Esboos de layouts para o exemplo.

Figura8. Planilha usada para identificar a nova estrutura do painel.

A especificao de uma linha


ou coluna do FormLayout sempre
segue este formato:

Especificao = [Alinhamento:] Tamanho [:Redimensionamento]

Os termos entre colchetes so opcionais,


e os valores que podem ser usados para
definir a estrutura da tela so detalhados
e exemplificados na Tabela 1.
Aqui esto mais exemplos de especificaes de colunas:
"left:pref:grow coluna alinhada esquerda, cuja largura a largura
preferida dos componentes, e que cresce
conforme o crescimento do painel.
"r:min(20dlu;p) coluna alinhada
direita, cuja largura o menor valor
entre 20dlu e a largura preferida dos
componentes.
E aqui esto mais alguns exemplos
para linhas:
"b:pref:grow linha alinhada
parte de baixo, cuja altura a altura
preferida dos componentes, e que cresce
conforme o crescimento do painel.
"c:d:g(0.8) linha centralizada,
cuja altura o tamanho default dos componentes, e que cresce a uma taxa de 80%
do crescimento do painel.
"fill:max(25mm;min) linha onde os
componentes preenchem todo o espao vertical, e sua largura vale o maior valor entre 25
mm e a altura mnima dos componentes.

Reconstruo do exemplo inicial


Agora que j vimos o bsico sobre o
FormLayout, vamos reprojetar o exemplo
inicial usando esse gerenciador de layout,
e tambm demonstrar outros pequenos
detalhes ainda no mencionados sobre a
API JGoodies Forms.
O primeiro passo na reconstruo de
uma interface identificar como os elementos sero posicionados. Para isso,
recomendado que a equipe se afaste do
computador e trabalhe um pouco com
papel e caneta. Utilizar o computador para
essa tarefa frequentemente atrapalha mais
a criatividade do que realmente ajuda a
desenvolver um bom projeto visual.
O segundo passo identificar e especificar as linhas e colunas da grade onde
sero inseridos os componentes, buscando
alinhar e balancear a estrutura. Fazer
Edio 38 Java Magazine

jm38.indb 51

51

17/7/2006 14:12:36

Interfaces Grficas com Qualidade

isso para telas complexas com lpis e


papel tende a ser um pouco trabalhoso,
portanto voc pode talvez preferir voltar
ao computador neste ponto. Uma opo
utilizar uma planilha eletrnica e colorir
as clulas onde ficam os componentes.
Essa estratgia tem a vantagem de deixar

o arquivo da planilha como documentao para a equipe. A Figura8 apresenta a


planilha criada para o exemplo.
A identificao das linhas e colunas
j suficiente para iniciar a codificao
da interface. Construiremos o painel
utilizando uma classe utilitria do JGoo-

dies Forms chamada DefaultFormBuilder,


que apresenta algumas funcionalidades
vantajosas como, por exemplo, o suporte
a separadores com ttulos, depurao e
internacionalizao. A implementao com
essa classe no muito diferente da vista
at aqui:

Listagem 2. Classe que recria o painel do exemplo inicial, agora utilizando a API Forms do JGoodies.
public class JanelaBomExemplo {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(
PlasticXPLookAndFeel.class.getName());
} catch (Exception e) { ... }

builder.add(new JComboBox(new String[]


{Automtico}), cc.xyw(2, 11, 3));
builder.add(new JButton(Editar...), cc.xy(6, 11));
builder.addSeparator(Medidas, cc.xyw(1, 13, 6));
builder.add(new JLabel(Altura:), cc.xy(2, 15));
builder.add(new JTextField(6), cc.xy(4, 15));
builder.add(new JLabel(m), cc.xy(6, 15));
builder.add(new JLabel(Comprimento:), cc.xy(2, 17));
builder.add(new JTextField(6), cc.xy(4, 17));
builder.add(new JLabel(m), cc.xy(6, 17));
builder.add(new JLabel(Largura:), cc.xy(2, 19));
builder.add(new JTextField(6), cc.xy(4, 19));
builder.add(new JLabel(m), cc.xy(6, 19));
builder.add(new JLabel(Peso:), cc.xy(2, 21));
builder.add(new JTextField(6), cc.xy(4, 21));
builder.add(new JLabel(kg), cc.xy(6, 21));

JFrame frame = new JFrame(Bom Exemplo);


frame.getContentPane().add(montaPainel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);

private static Component montaPainel()


FormLayout layout = new FormLayout(
// colunas
10dlu, right:p, 3dlu, p, 3dlu, min,
// linhas
p, 3dlu, p, 3dlu, p, 3dlu, p, 7dlu,
3dlu, p, 3dlu, p, 3dlu, p, 3dlu,

{
10dlu, p:grow,

builder.addSeparator(Descrio, cc.xy(8, 1));


builder.add(new JScrollPane(
new JTextArea(2, 21)), cc.xywh(8, 3, 1, 7));

p, 3dlu, p, 7dlu, p,
p, 7dlu, p);

builder.addSeparator(Comandos, cc.xy(8, 13));


builder.add(new JScrollPane(
new JTextArea(2, 21)), cc.xywh(8, 15, 1, 7));

CellConstraints cc = new CellConstraints();


DefaultFormBuilder builder = new DefaultFormBuilder(layout);
builder.setDefaultDialogBorder();

builder.add(montaBarraBotao(), cc.xyw(1, 23, 8));

builder.addSeparator(Valores, cc.xyw(1, 1, 6));


builder.add(new JLabel(Primeiro Valor:), cc.xy(2, 3));
builder.add(new JTextField(15), cc.xyw(4, 3, 3));
builder.add(new JLabel(Outro Valor:), cc.xy(2, 5));
builder.add(new JTextField(15), cc.xyw(4, 5, 3));
builder.add(new JLabel(Label Comprida:), cc.xy(2, 7));
builder.add(new JTextField(15), cc.xyw(4, 7, 3));
builder.addSeparator(Controle, cc.xyw(1, 9, 6));

Figura9. Tela de exemplo reconstruda com a API Forms.

return builder.getPanel();

private static Component montaBarraBotao() {


JButton btnOK = new JButton(OK);
JButton btnCancelar = new JButton(Cancelar);
return ButtonBarFactory.buildCenteredBar(btnOK, btnCancelar);
}

Figura10. Tela do exemplo, em modo de depurao, mostrando a definio da grade.

52 Java Magazine Edio 38


jm38.indb 52

17/7/2006 14:12:36

Concluses

O que JGoodies?

Goodies uma empresa alem que


oferece, dentre outras coisas, um
conjunto de APIs open source voltadas
para o desenvolvimento de interfaces
grf icas desk top de alta qualidade.
As APIs do JGoodies so baseadas em
Swing e s o sub divididas em cinco
projetos:
Forms: Suporte para a criao de
formulrios precisos e elegantes de forma
simples, rpida e consistente.
Looks: Uma srie de Look-and-Feels
permitindo fornecer novos visuais s suas
aplicaes.
Animation: Classes para criar animaes com diferentes recursos e estilos.
Essa API utiliza conceitos definidos pela
especificao SMIL (Synchronized Multimedia Integration Language) definida

DefaultFormBuilder builder =
new DefaultFormBuilder(layout);
builder.setDefaultDialogBorder();
builder.addSeparator(Valores, cc.xyw(1, 1, 6));
builder.add(new JLabel(Primeiro Valor:), cc.xy(2, 3));

Repa re na c ha mada ao mtodo


setDefaultDialogBorder(), que serve para
criar uma borda vazia em torno do painel, evitando que este fique colado aos
limites da janela. Alm disso, o mtodo
addSeparator() cria um separador com
um ttulo, ajudando na identificao
visual dos grupos, mas sem criar linhas
desnecessrias.
O cdigo completo desta implementao pode ser visto na Listagem2. A
tela recriada est ilustrada na Figura9 e
utiliza o Look and Feel Plastic XP da API
JGoodies Looks (veja o quadro O que
JGoodies?). Um recurso interessante da
classe DefaultFormBuilder a possibilidade
de depurar os painis criados, como

pelo W3C, porm utilizando Java para descrever as animaes (ao invs de XML).
Binding: Framework para conectar os
componentes de interface com as classes
de modelo da aplicao. A idia reduzir
o cdigo de apresentao e permitir uma
melhor separao de camadas.
Validation : Suporte flexvel para
validao de campos e formulrios, que
permite diferentes tipos de tcnicas e
indicaes de erros.
Cada API est disponvel para download no site do JGoodies na forma de um
arquivo zipado que contm o cdigofonte, a documentao e arquivos JAR.
Inicialmente essas APIs no eram open
source, mas agora esto disponveis sob
a licena BSD.

mostra a Figura10. Para ver as linhas


e colunas indicadas em vermelho durante a execuo do programa, basta
passar como segundo parmetro do
seu construtor uma instncia da classe
FormDebugPanel:
DefaultFormBuilder builder =
new DefaultFormBuilder(layout, new FormDebugPanel());

Conc lu i ndo, obs er ve o m to do


montaBarraBotao(), ainda na Listagem2,
que retorna um painel contendo os
dois botes, OK e Cancelar. Ele
utiliza o mtodo buildCenteredBar() da
classe ButtonBarFactory que, alm de
criar os botes com o mesmo tamanho,
os centraliza e mantm uma distncia
padronizada de separao. Por fim, esse
painel adicionado ltima linha do
nosso layout, ocupando a largura de
todas as colunas.

Apresentamos nesse primeiro artigo um


conjunto bsico de tcnicas fundamentais
para o projeto visual de interfaces grficas,
incluindo um exemplo prtico com a API
Forms do JGoodies. importante lembrar
que bons projetos visuais no vm naturalmente nem dependem de APIs grficas,
como Swing ou SWT. Existe uma srie de
princpios que se deve aplicar corretamente para que o resultado seja satisfatrio. A
estrada que leva alta qualidade de GUIs
longa, mas com os princpios introduzidos
aqui j possvel iniciar essa jornada.

Designing Visual Interfaces:


Communication Oriented Techniques
Kevin Mullet & Darrell Sano, Prentice Hall PTR,
1994
Um dos livros mais completos sobre projeto de
interfaces grficas que explora diferentes tcnicas e
examina tipos variados de problemas encontrados em
sistemas reais.

jgoodies.com
Site do JGoodies com tutoriais, artigos,
aplicaes e APIs para download.
www.sum-it.nl/enguilin.html
Links sobre projeto visual de interfaces grficas.
www.rspa.com/spi/design-interface.html
Site com informaes sobre interfaces grficas
mantido por Roger Pressman, famoso especialista
em Engenharia de Software.
javamagazine.com.br/downloads/jm38/
jm-guisqualidade-p1.zip
Hugo Vidal Teixeira
(hugo.tech@gmail.com) Bacharel
em Informtica pela UFRJ, mestre
em Engenharia de Software pela
COPPE/UFRJ e pesquisador da rea de
componentes e GUI Design. Atualmente
trabalha como consultor integrado Sakonnet Technology,
onde trabalha diretamente com Karsten Lentzsch (criador
do JGoodies) e empresas especializadas em GUI design,
como Ergosign(.de), Centigrade(.de) e OculusInfo(.com).

Edio 38 Java Magazine


jm38.indb 53

53

17/7/2006 14:12:40

OT
AD
A
- Multimdia no celular
- Automao com Ant
- Robocode
- Tag Libraries JSP
- Processando XML em Java

Edio 4

Edio 2

Edio 3

ES
G

OT
AD
A
ES
G
Edio 1
- Ferramentas livres
- Introduo ao J2EE 1.4
- Introduo a J2ME
- J2EE Fundamental
- Dados com JDBC

- Eclip
- O me
- Segu
- Inte
- Expr

- Dados em J2ME
- JavaServer Faces
- Jogos wireless
- Certificao J2EE
- Montando um ambiente Java

- Java no Governo
- Apache FOP
- JSTL Guia Completo
- Cocoon Inicial
- Pacotes WAR e JAR

- Cdigos no Eclipse
- New I/O Fundamental
- Game API
- Criando Plug-ins para Eclipse
- Preferences API

- Tutorial de NetBeans
- API New I/O (java.nio)
- Cesta de compras com Struts
- Testes de carga com JMeter
- Concorrncia e a JVM

Edio 14

Edio 13

Edio 12

ES
G

Edio 11

Edio 9

Edio 10

OT
AD
A

Complete
a sua
coleo!

- Relatrios Corporativos
- Grficos com Java 2D
- Java.net na Prtica
- Raio-X do Tiger
- Paginao na Web

- Eclipse para Web


- Fome Zero com Java
- Tags Customizadas em JSP 2.0
- Tiger: A Evoluo do Java
- Dicas para Web

- Form
- ANT
- JBos
- Extre
- Meta

GINAS

.EWS #ARTAS 4IRA $VIDAS%XTREME0ROGRAMMING #OLLECTIONS 4OMCAT

*AVA7EB3TARTNAPRTICA

!2

!TECNOLOGIAPARADISTRIBUIODEAPLICAES*AVA

)NTEGRANDOO*-%EM0$!S

!CESSESISTEMASDEARQUIVOSEAPLICAESNATIVAS

4HINLET,EVEZANO$ESKTOP

5MAALTERNATIVAAO3WINGPARAAPLICAES'5)

$OMANDOO#LASSPATH

4IRESUASDVIDASSOBREESTECONCEITOESSENCIAL
%SPECIAL

*6-S!

%SPECIAL

'ERENCIAMENTOCOM*-8

#ONHEAMAIS
*AVAEEXPLOR
EBENCHMARK

- JavaMail
- Por Dentro do Apache Derby
- Clusters com Tomcat e Apache
- Mais HttpClient
- Examinando o Mustang

- SWT no Eclipse
- Eclipse Web Tools Project
- Validao avanada com Struts
- Fronteiras do Java
- CD do NetBeans

- NetBeans 5.0
- Aprendendo Groovy
- Test-Driven Development
- Debate Internacional Sou+Java
- Java Business Integration (parte 1)

Edio 24

/)$%LIVR
NOVA2EV
ESTRUTURA

- Nov
- Mq
- Grf
- Sup
- Tag

- O Projeto Eclipse
- Segurana no JBoss
- JSF Avanado
- Comeando com Java
- Tira-dvidas

Edio 32

- Criptografia aplicada
- XML de alto desempenho
- Segurana em apllicaes web
- JSF Passo a Passo
- Datas e Horas em Java

/N

Edio 34

*ASPER2EPORTSEI2EPORT0ASSAGEMDE
0ARMETROS 2ELATRIOSDINMICOS
)MAGENSE*AVA"EANS

Edio 23

2ELATRIOS!VANADOS

Edio 33

!PLIQUE0ADRESDE0ROJETO
%SSENCIAISNOSSEUS0ROJETOSE
'ANHEEM1UALIDADEE2EUTILIZAO

Edio 31
- HSQLDB
- Internacionalizao de MIDlets
- Performance na JVM
- Caso de sucesso: Procon
- Benchmarks JME

www.javamagazine.com.br
jm38.indb
54
jm24-anteriores_pgina
dupla.ind2-3 2-3

-AIS0ATTERNS!PLICADOS

- Relatrios avanados
- Mais design patterns
- Gerenciamento com JMX
- Java Web Start
- Dvidas de classpath

- Threads no Java 5.0


- Cadastros com Struts
- MVC na web
- Servlet API Avanada
- Padres de projeto

Edio 30

Edio 29

- JSTL aplicado no Tomcat 5


- Modularizando pginas com Tiles
- Componentes View do Struts
- O rugido do Java livre

0ATTERNS

2ELATRIOS

Edio 22

Edio 21

Edio20

Edio 19

%XTRAIAOMXIMODASTECNOLOGIASDE
GERENCIAMENTODEAPLICAES QUEHOJEFAZEM
PARTEDOCORAODE*AVAESOESSENCIAISEM
SISTEMASCOMPLEXOS

- Hibernate em aplicaes web


- Java 6 (Mustang)
- Programao em par
- Processos geis
- Java Business Integration (parte 2)

devmedia.com
17/7/2006 14:12:50

- Para
- Test
- Web
- Scri
- Asp

.b

web

(parte 2)

om

OT
AD
A
Edio 8

Edio 7

ES
G

OT
AD
A
Edio 6

- JBoss Inicial
- Introduo ao JMX
- Java no Lego Mindstorms
- Logging
- Memria e desempenho

- JavaOne 2003
- Conhecendo o CVS
- JSTL- Guia completo SQL e Format
- Tomcat e o Servidor Apache

- Bancos de dados livres


- Testes unitrios com JUnit
- JSTL- Guia Completo: tags Core
- Java na Droga Raia
- Validao na Web

- Introduo ao Tomcat
- Conectivade com MIDP
- Struts, primeiros passos
- Automao com XDoclet
- Jakarta Velocity

- Formulrios com Swing


- ANT - Automatizando Java
- JBoss e Entity Beans
- Extreme Programming
- Metaprogramao e Reflection

GINAS

- Genricos no Tiger
- JBuilder para web
- MIDP 2.0
- JavaOne 2004
- Segurana com JAAS

- Otimizao de EJBs no JBoss


- Processamento de imagens
- Programao com regras
- Jakarta Taglibs
- Case J2ME

Edio 18

Edio 17

Edio 16

ES
G

Edio 15

Edio 14

OT
AD
A

ava

ES
G

OT
AD
A
ES
G
Edio 5

Edio 4
- Eclipse inicial
- O mercado J2ME
- Segurana em aplicaes web
- Interfaces ricas com Flash
- Expresses regulares no J2SE 1.4

Java 5 Impresso Java Content Repository Caches e JDBC NetBeans JavaOne

*6-Sv*30v%CLIPSEv!NTv3UPER7ABAv*&REE#HARTv.OTCIASv#ARTAS

'RFICOSCOM*&REE#HART

!2EVISTADA#OMUNIDADE*AVA"RASILEIRA

Imprimindo com Java

#RIEGRFICOSDENEGCIOSPARAAPLICAES
DESKTOPEWEBUSANDO!0)SLIVRES

Conhea duas APIs de impresso do


J2SE e obtenha controle fino
sobre layout e formatao

3UPER7ABA)NICIAL

$ESENVOLVAPARA0$!SCOM
FERRAMENTAS*AVAECONHEA
OMUNDODOSHANDHELDS

Gerncia de Contedo
Detalhes sobre a Novssima API
JCR e a Criao de Repositrios
de Contedo na Web

Edio 24 - Ano III - R$ 9,90

4AGS*30COM4AG&ILES

!MANEIRAMAISSIMPLESDECRIARTAGS
CUSTOMIZADASPARAPGINAS*30
%SPECIAL

*6-S!LTERNATIVAS
#ONHEAMAISDEMQUINASVIRTUAIS
*AVAEEXPLORETCNICASDEOTIMIZAO
EBENCHMARKS

- JSP 2 e Servlets no Tomcat 5


- Primeiros passos com wireless
- Collections avanado
- Conhecendo o JDeveloper 10g
- Servlets: do bsico ao avanado

- SwingWT
- Java 2D: Animao e impresso
- Anotaes no Java 5
- Projeto Looking Glass
- Java 2D: Animaes e Impresso

Uma Aplicao Java


Completa com NetBeans

%CLIPSE#ON

!SNOVIDADESDO)$%EDEOUTROS
PROJETOSDA&UNDAO%CLIPSE

Parte final Acesso a Banco


de Dados e Gerncia de
Preferncias de Usurios

Tira-Dvidas Especial
Caches e DAOs com JDBC, Usando
JVMs Alternativas, Relatrios e
Driblando Restries
da Mquina

- Aplicao Completa - Parte 1


- Desempenho com JDBC e DAOs
- Portlets - Fundamentos
- JFreeChart Avanado
- O Novo Extreme Programming

Edio 35

Edio 34

- Novo NetBeans
- Mquinas virtuais alternativas
- Grficos com JFreeChart
- SuperWaba Inicial
- Tag Files do JSP 2.0

- Para onde vai o Struts


- Teste com J2MEUnit
- Web Services
- Scripting na JVM
- Aspectos no Mundo Real

.br/anteriores
jm38.indb 55

- Frameworks de Logging
- Otimizao de Cdigo
- Ajuda com JavaHelp
- Maven 2 Essencial
- Java ME no Eclipse

Edio 27

&

- Aplicao Completa - Parte 2


- Mais Desempenho com JDBC
- Portlets - Recursos Avanados
- Jakarta Commons Inicial
- Nmeros: Conceitos e Formatao

JavaOne 2005

Grandes novidades em
produtos e APIs, planos e
comemoraes no evento
mundial da tecnologia Java

Migrando para o Java 5


Conhea na prtica e em detalhes
como, porque e quando fazer o
upgrade para o J2SE 5.0

- Aplicao Completa - Parte 3


- Migrando para o Java 5
- Impress o com Java
- Gerenciamento de Contedo
- JavaOne 2005

- Conhecendo o Ant
- Acessando Cdigo Nativo
- Qualidade Aplicada
- Migrando para o Maven 2
- Logging no Java SE

Edio 28

Futuro
Presente

- Hibernate Fundamental
- Apache Geronimo na Web
- Ajax: Interatividade Turbinada
- Tutorial de Genricos
- De Volta aos Patterns

Leia uma vez,


use em todos
os lugares

Edio 37

/)$%LIVREPATROCINADOPELA3UNHOJEUMAFERRAMENTAINTEIRAMENTE
NOVA2EVEJAOSFUNDAMENTOSDO)$% CONHEANAPRTICAANOVA
ESTRUTURADEPROJETOSBASEADANO!NTESAIBAOQUEVIRNAVERSO

Edio 26

.ET"EANS
.ET

Edio 36

/NOVO

Edio 25

Edio 24

Java:

- Criao de Plug-ins
- Os 10 Mais do Eclipse 3.2
- JavaOne 2006
- Relatrios Passo a Passo
- Testes com mock objects

21 2283 9012
17/7/2006
15/7/2006 14:12:52
18:28:08

O Eclipse Callisto
A maneira fcil de instalar os principais plug

o final de junho foi finalmente


liberado um dos lanamentos
mais ag uardados do a no, o
Eclipse Callisto, que rene 10 dos projetos
mais importantes da Fundao Eclipse:
Business Intelligence and Reporting
Tools (BIRT)
C/C++ IDE (CDT)
Data Tools Platform (DTP)
Eclipse Modeling Framework (EMF)
Graphical Editing Framework (GEF) e
Graphical Modeling Framework (GMF)
Eclipse Project: Eclipse Platform,
Java Development Tools (JDT) e Plug-in
Development Environment (PDE)

Eclipse Test and Performance Tools


Platform Project (TPTP)
Eclipse Web Tools Platform Project
(WTP)
Visual Editor (VE)
O projeto Callisto, destacado no artigo
sobre o Eclipse 3.2 na edio passada, foi
iniciado no comeo de 2006 com o ambicioso objetivo de liberar simultaneamente
as novas verses de vrios dos principais
projetos da Fundao Eclipse. Dessa forma, os novos recursos ficam disponveis
para uso imediato pelos interessados, em
vez de terem que esperar pela cascata de

atualizaes gerada por cada projeto individual no passado por exemplo, hoje sai
um novo Eclipse SDK, algumas semanas
depois um novo EMF, apenas depois disso
um novo WTP, e da em diante.
O propsito do Callisto facilitar a vida
de dois tipos de usurios, ao oferecer
uma plataforma unificada com releases
simultneos de componentes-chave dos
10 projetos citados:
Desenvolvedores individuais que
usam o Eclipse como ambiente de desenvolvimento de aplicaes;
Integradores que constroem produtos baseados nos projetos da Fundao
Eclipse
Como diz o prprio site do Callisto
(eclipse.org/callisto), os projetos no foram

56 Java Magazine Edio 38


jm38.indb 56

17/7/2006 14:13:07

-ins do Eclipse

Aprenda como instalar o


Callisto, que fornece um
conjunto integrado de plug-ins
Eclipse para desenvolvimento
Web, Visual, Relatrios e
Modelagem

Fernando Lozano
detalhes de acompanhamento e gerenciamento dos projetos individuais.

Instalao do Callisto

Figura 1. Como chegar ao site de download do Callisto.

Figura 2. Escolha de um dos espelhos.


unificados. Cada um permanece com seus
prprios planos de desenvolvimento e
cronogramas de releases individuais. O
que o Callisto fornece a possibilidade

de se deixar de acompanhar cada projeto


individualmente e utilizar apenas as ltimas
verses disponibilizadas como parte do
Callisto.
O Callisto garante
que cada projeto no
seu conjunto de releases funcionar junto
com os demais sem
problemas, coisa que
nem sempre acontece
com as verses mais
recentes dos projetos
individuais; garante
t a m b m q u e s e r o
sempre verses estveis. O projeto ainda traz uniformidade
no controle de verses, critrios para
qualificao de releases como estvel ou
em desenvolvimento, e outros pequenos

Curiosamente, o Callisto no fornece


uma pgina de downloads e nem um instalador integrado, o que o torna bastante
diferente de distribuies do Eclipse
como o Yoxos (yoxos.com).
Para se obter o Callisto, necessrio
baixar e instalar manualmente o Eclipse
Platform Runtime 3.2 (ou ento o Eclipse
SDK 3.2) para a sua plataforma especfica.
Depois deve-se abrir o Update Manager
da plataforma (Help|Software Updates
>Find and Install), conforme mostra a
Figura 1. O prximo passo escolher a
opo Search for new features to install, e na
pgina seguinte do assistente selecionar
Callisto Discovery Site.
Antes de receber a relao de features
que podem ser instaladas pelo Callisto,
o usurio recebe a opo de selecionar
um espelho (mirror) para o download
dos arquivos. H uma grande quantidade
de espelhos ao redor do mundo (veja a
Figura 2), mas nenhum ainda no Brasil.
O site principal tende a estar saturado,
especialmente logo aps o anncio de
um novo release de algum componente
popular como o JDT, portanto pode ser
interessante selecionar uma das demais
alternativas.
A prxima janela exibe a relao de
features disponibilizadas pelo Callisto, organizadas em categorias como
Java Development e Charting and
Reporting. A mesma feature pode ser
exibida em mais de uma categoria, de
modo a facilitar a localizao das features
desejadas pelos usurios iniciantes em
Eclipse.
Caso uma feature tenha dependncias
contidas em outras features, ser exibido
um marcador de erros semelhante ao
Edio 38 Java Magazine

jm38.indb 57

57

17/7/2006 14:13:17

O Eclipse Callisto

Figura 3. Seleo de features fornecidas pelo Callisto para download e instalao,


mostrando que uma dependncia ainda no foi satisfeita.

usado pelo Eclipse para


indicar problemas em
cdigo Java (Figura 3).
Apenas depois que todas
as dependncias sejam satisfeitas ser habilitado o
boto Finish.
A pgina seguinte (Figura 4) permite que se
verifique a licena de
uso de cada feature, mas
as opes de aceito ou
no aceito se aplicam a
todo o conjunto. Retorne
com o boto Back caso
alguma das licenas no
lhe agrade. Por enquanto,
todos os componentes
usa m a mesma l icena padro da Fundao
Eclipse, mas no futuro
poder haver compo nentes utilizando outras
licenas open source.
A ntes de i n iciar o
download e instalao
das features selecionadas,

o usurio tem a oportunidade de selecionar um local alternativo para a instalao


de cada feature. Instalar features em diretrios separados (em especial, diferentes
da prpria Eclipse Platform) facilita a
posterior desinstalao ou desabilitao
dessas features. Facilita ainda a sua cpia
para a mquina de outro desenvolvedor
(que assim no precisa fazer o download
direto da internet), ou mesmo o compartilhamento de features entre vrios
sistemas operacionais para quem tem
dual boot . Ta mbm pode ser u m
quebra-galho interessante em caso de
falta de espao no disco de instalao
do Eclipse. Infelizmente o Eclipse no
suporta (via Update Manager) o compartilhamento de features entre diversos
usurios de um mesmo sistema Linux,
Mac OS ou outro sistema Unix-Like.
Mas a soluo est a caminho, veja o
quadro Empacotando o Eclipse para
Linux.
Finalmente, clicar no boto Finish faz
com que cada feature seja baixada e
instalada. Como mostra a Figura 6. Se
for necessrio, o Eclipse ser automa-

Empacotando o Eclipse para Linux

surios de Linux podero achar o Update


Manager do Eclipse primitivo, por no ser
capaz de gerenciar automaticamente dependncias e indicar exatamente quais so as features
que devem ser acrescentadas para resolv-las.
Afinal, usurios de Debian, Ubuntu e Kurumim
fazem isto h anos usando o apt-get, e usurios
do Fedora e Yellow Dog contam com o yum; isto
sem falar nas ofertas comerciais da Novell/SuSE
e da Red Hat.
Muitas distribuies do Linux j empacotam
o Eclipse como componentes padro, s vezes
utilizando um Java Livre como o GCJ (caso do
Fedora Core Linux, fedora.redhat.com) ou ento
com o pr-requisito da instalao manual do Java
da Sun (como no JPackage, jpackage.org).
A manuteno destes empacotamentos trabalhosa, pois o Linux espera que cada pacote seja
construdo a partir dos fontes originais e de forma
automatizada (o conceito de pristine sources
originado pelo RPM). Mas no existe um processo
padronizado para a obteno destes fontes na
Fundao Eclipse, nem para a compilao auto-

mtica dos plug-ins. S para citar um exemplo,


o JDT no gerado diretamente pelo PDE, mas
sim por uma ferramenta conhecida como Releng
(procure por org.eclipse.releng.tools-3.2.zip na
pgina de downloads do Eclipse).
Os empacotamentos customizados das distribuies resolvem alguns problemas de integrao do Eclipse com o ambiente Linux, como a
criao de cones no desktop ou a utilizao do
IDE por vrios usurios da mesma mquina (ex.:
com clientes magros), mas nenhum deles hoje
consegue permitir a instalao de atualizaes ou
novas features, pelo Update Manager e mantendo
a integrao estreita com os gerenciadores de
pacotes do Linux.
Em resumo, a situao atual exige que o usurio
Linux escolha ter uma instalao do Eclipse bem
integrada, e faa todas as atualizaes e acrscimos por meio do gerenciador de pacotes da
distribuio; ou ento, que realize a instalao
manual em seu diretrio pessoal, e faa todas as
atualizaes e acrscimos por meio do Update
Manager. Dessa forma so geradas vrias ins-

talaes independentes e paralelas do Eclipse,


caso haja outros usurios do IDE no mesmo
computador.
O recm-criado Linux Distributions Project
da Fundao Eclipse (wiki.eclipse.org/index.
php/Linux_Distributions_Project) visa resolver
estes problemas e alm disso fornecer plug-ins
especficos para o desenvolvedor Linux / Unix,
por exemplo editores de pginas de manual (man
pages), geradores de pacotes RPM e integrao
com o GNU Autotools (origem do popular script
configure usado por quase todos os projetos de
software livre escritos em C para Unix).
Usurios de outros sistemas Unix-Like como o
Solaris, FreeBSD e o Mac OS tm problemas semelhantes e sero tambm beneficiados pelo projeto.
Os resultados deste projeto sero importantes
para todos os usurios do Eclipse, no apenas
para os usurios Linux, pois a integrao de um
melhor gerenciamento de dependncias ao
Update Manager tornar o Eclipse e seus plug-ins
mais fceis de instalar em qualquer plataforma.

58 Java Magazine Edio 38


jm38.indb 58

17/7/2006 14:13:21

t icamente rei n iciado


ao final para ativar os
novos recursos.
Ao fim do processo, o
usurio poder ver os
novos menus, perspectivas e outros recursos
acrescentados ao IDE.

Dependncias

Figura 4. Aceitao dos termos de licena de todas as features.

Figura 5. Seleo do diretrio de instalao para cada feature.

Figura 6. Baixando e instalando as features selecionadas.

O Callisto ainda no
o Eclipse para Iniciantes. Afinal, muitos
no sabero distinguir
x86_64 GTK 2 de x86
/Motif na pgina de
dow n lo ad s d a Fu n dao, ou ento sero
induzidos a baixar o
Eclipse SDK e gastar
dezenas de megabytes
de disco (alm de muito tempo de conexo
internet) com fontes e
plug-ins que eles provavel mente no iro
utilizar to cedo.
A l m d i s s o, a l g u mas dependncias do
Callisto parecem estar
erradas, por exemplo
estranha a exigncia de
se incluir o PDE (desenvolvimento de plug-ins)
para instalar tanto o
VE (para desenvolver
visualmente aplicaes
SWT ou Swing) quanto
o JST (que permite o
de s envolv i mento de
aplicaes Java EE).
Em alguns casos, as
mensagens de erro do

Update Manager no sero teis, exceto


para usurios j familiarizados com os
projetos em questo, pois iro relacionar
nomes de plug-ins que muitas vezes no
fornecem qualquer dica de qual projeto
ou feature fornecido, como no exemplo
da Figura 7, onde foi selecionado o VE
+ GMF, que cita o plug-in org.eclipse.
draw2d; ou a seleo do EMF, que pede
o plug-in org.apache.batik.

Concluses
Embora o Callisto ainda no fornea
a maneira mais fcil de se instalar o
Eclipse, deixando de fora coisas como a
criao de um atalho na rea de trabalho,
ele representa um grande avano em
relao busca e download manual de
cada distribuio de cada plug-in fornecido pelos vrios projetos da Fundao
Eclipse.
O objetivo de liberar simultaneamente
novas verses finais de dez projetos
complexos foi bastante ambicioso, ainda
mais considerando-se a quantidade de
pessoas e empresas envolvidas em cada
um desses projetos.
Apenas um projeto falhou com o objetivo, o VE, que foi incluso no Callisto
com a verso 1.2RC-2 (segundo Release
Candidate), que embora no seja uma
verso final (GA, General Availability)
quase isso. Segundo qualquer critrio de
avaliao, entretanto, pode-se considerar
o Callisto como um grande sucesso.

eclipse.org/callisto
Pgina principal do Eclipse Callisto
eclipse.org/downloads
Pgina de downloads do Eclipse, para baixar
o SDK ou plataforma e iniciar o processo

Figura 7. Nem sempre o Update Manager ser til para quem no conhece os projetos que deseja
instalar. Por exemplo, nenhuma feature tem um nome parecido com draw2d.

Edio 38 Java Magazine


jm38.indb 59

59

17/7/2006 14:13:23

Google Search A
Incremente suas aplicaes Java com con

odo usurio de internet percebe o


papel que o Google representa na
vida on-line. Desde o inicialmente
modesto site de busca, com uma caixa de
texto e dois botes, at o sofisticado Google
Earth, poucos so os internautas que no
usam um dos produtos Google: Gmail,
Calendar, Finance, Pages, Analytics, Maps,
Desktop, Talk, SketchUp, Spreadsheets... e
a lista no para de crescer.
Mas mudar a maneira de como usamos
a internet parece no ser suficiente para
o Google, que est oferecendo cada vez
mais ferramentas e APIs para que desenvolvedores possam explorar os produtos e
tecnologias da empresa em suas prprias
aplicaes. Neste artigo, veremos como
usar a Google Search API, para realizar
buscas de vrios tipos, obter sugestes
de correo ortogrfica e ler pginas
armazenadas em cache, entre outras
operaes.

Instalao e uso

Buscas

Para usar a Google Search API, basta fazer o download do kit de desenvolvimento,
descompact-lo em algum local do disco e
obter uma chave. O site google.com/apis lista
os passos necessrios. Para obter a chave,
clique no link fornecido no segundo passo
(Create a Google Account). Como se v,
necessrio ter uma conta do Google, que
pode ser criada no mesmo site (se voc
tem uma conta no GMail ou no Orkut, j
tem uma conta no Google). Tendo a conta
criada, faa o login e uma chave ser enviada para seu e-mail no GMail. A chave
permite a realizao de at mil pesquisas
automatizadas por dia.
O k it de desenvolvimento contm o
JAR da biblioteca e
exemplos de uso
em Java, C# e
Visu al Basic.
Alm destas,
pode ser usada
qualquer outra
linguagem que
suporte web services: o kit de desenvolvimento inclui o descritor do
web service publicado pelo
Google (GoogleSearch.wsdl) e
exemplos de requisies (no
diretrio soap-samples).
Em Java, basta adicionar a biblioteca googleapi.jar ao classpath, instanciar um objeto da classe
com.google.soap.search.GoogleSearch e
configurar nele a chave usando
o mtodo setKey(), como mostrado na Listagem 1. A classe
GoogleSearch contm mtodos
para busca, sugesto ortogrfica e obteno de pginas em
cache, como ser mostrado
a seguir.

As buscas so feitas definindo uma


expresso de consulta, usando o metodo
setQueryString() semelhante ao que seria
feito normalmente no site google.com e depois invocando o mtodo doSearch(), que retorna um objeto da classe GoogleSearchResult.
Este objeto contm os resultados da busca
e algumas informaes adicionais, como
o tempo de busca e o total estimado de
resultados. Um exemplo de uso do mtodo
doSearch() pode ser visto na Listagem 1.
A melhor maneira de se encontrar as
informaes desejadas usando o Google
construir uma boa consulta. Por exemplo, buscar por Java Magazine (sem aspas)
usando a API, dificilmente retornar o site
desta revista como o primeiro dos resultados. Uma primeira melhoria seria ao invs
de buscar separadamente os termos Java e
Magazine, buscar o termo composto pelas
duas palavras na ordem dada, colocando
o conjunto entre aspas. Um detalhe que,
para fazer isso no programa Java, as aspas
devem ser escapadas com o caractere \
para que faam parte da string ao invs
de delimit-la, ou seja, a consulta seria
\Java Magazine\.
Se a consulta fosse feita atravs de
um navegador web, o problema estaria
resolvido. Mas o web service utilizado
pela API no recebe as informaes de
localidade submetidas pelo navegador,
e sites de peso em lngua inglesa como
Amazon e JavaWorld tendem a aparecer
primeiro nos resultados. Um contorno seria exclu-los manualmente dos resultados
com o operador -, executando a consulta
\Java Magazine\ -JavaWorld -Amazon.
H um mecanismo mais elegante para
limitar consultas. O mtodo setRestrict()
da classe GoogleSearch permite que sejam
impostas restries de idioma, de pas
ou de tpicos. Por exemplo, se antes de
buscar por Java Magazine configurarmos

60 Java Magazine Edio 38


jm38.indb 60

17/7/2006 14:13:27

h API

Use o poder do mecanismo


de busca que revolucionou
a internet dentro de suas
aplicaes Java, e conhea
tcnicas avanadas de pesquisa

sultas ao Google
JULIo FaerMan

a restrio countryBR, o site da JM ser o


primeiro resultado (veja a Listagem 1).
O quadro Restries mostra outras restries suportadas.
Alm do mtodo setRestrict(), outros
limitadores e termos especiais podem
ser i ncluidos na prpria expresso
de consulta. Por exemplo, a consulta
Faerman site:www.javamagazine.com.br retorna

as paginas do site da JM com artigos deste


autor. A lista completa de operadores suportados pela API, com exemplos de uso,
pode ser vista no quadro Operadores.
Conhecer um pouco do funcionamento da
internet tambm ajuda na hora de montar
suas consultas. Por exemplo, para buscar
documentos sobre (digamos) CMMI em
arquivos PDF ou DOC, uma boa consulta

Listagem 1. Exemplo de uso da Google Search API


package jm;
import com.google.soap.search.GoogleSearch;
import com.google.soap.search.GoogleSearchResult;
import com.google.soap.search.GoogleSearchResultElement;

//Sugestoes Ortograficas
sugerirOrtografia(filosofy);
sugerirOrtografia(philosophy);
sugerirOrtografia(filosopia);
sugerirOrtografia(lumbriga);

public class GoogleSearchDemo {


static final GoogleSearch busca = new GoogleSearch();

//Pagina em cache
obterPagina(www.java.com);

public static void main(String[] args) throws Exception {


String clientKey = null;
if (args.length == 1) {
clientKey = args[0];
}
else {
System.err.println(
uso: java -cp <classpath_incluindo_googleapi.jar>
+ GoogleSearchDemo <clientKey>);
System.exit(-1);
}

public static void buscar(String consulta) throws Exception {


busca.setQueryString(consulta);
GoogleSearchResult result = busca.doSearch();
System.out.printf(Busca: %s Tempo: %f s Resultados: %d\n,
result.getSearchQuery(), result.getSearchTime(),
result.getEstimatedTotalResultsCount());

//Configurao
busca.setKey(clientKey);
busca.setMaxResults(5);
//Buscas
buscar("Java Magazine");
buscar("\"Java Magazine\" -JavaWorld -Amazon");
busca.setRestrict("countryBR");
buscar(Java Magazine);
busca.setRestrict(linux.-lang_en);
buscar(blackdown);
buscar(jsf OR struts);
buscar(Faerman site:www.javamagazine.com.br);
buscar(jsf inurl:java);
buscar(hibernate intitle:OnJava);
buscar(java daterange:2453371-2453736);
buscar(allintext:Service Oriented Architecture);
buscar(CMMI filetype:doc OR filetype:pdf);
buscar(-inurl:htm -inurl:html intitle:\index of\
+ +(\/ebooks\|\/book\)+(
chm|pdf|zip) lewis alice wonderland);
buscar(info:www.javamagazine.com.br);
buscar(link:www.javamagazine.com.br);
buscar(related:www.java.com);

for (GoogleSearchResultElement element :


result.getResultElements())
{
System.out.println(######);
System.out.println(Titulo: + element.getTitle());
System.out.println(URL: + element.getURL());
System.out.println(Trecho: + element.getSnippet());
}

public static void sugerirOrtografia(String palavra)


throws Exception
{
String sugestao = busca.doSpellingSuggestion(palavra);
if (sugestao == null) {
System.out.println(
Sem sugestes para \ + palavra + \.);
}
else {
System.out.println(
Voce quis dizer \ + sugestao + \?);
}
}

public static void obterPagina(


String pagina) throws Exception {
System.out.println(new String(
busca.doGetCachedPage(pagina)));
}

Edio 38 Java Magazine


jm38.indb 61

61

17/7/2006 14:13:31

Usando a Google Search API

seria CMMI filetype:doc OR filetype:pdf. Entretanto, para buscar um termo comum ou


com muitos documentos relacionados,
como o livro Alice no Pas das Maravilhas (Alices Adventures in Wonderland)1,
uma busca por tipo de arquivo dificilmente retornaria o livro. Neste caso,
melhor buscar por pginas de ndice de
diretrios, cujo ttulo costuma ser index
of, e num diretrio de livros, como book
ou ebooks. Como desejamos o arquivo
do livro, tambm ajuda acrescentar como
critrio os formatos comuns de livros eletrnicos zip, chm, txt ou pdf. E como pginas web no interessam, podemos remover
endereos com extenses de pginas, como
htm e html. Por ltimo, adicionamos os termos da consulta, por exemplo o ttulo do
livro e o nome do autor. Sendo assim, uma
busca como a seguinte tem boa chance de
ser bem sucedida:

intitle:\index of\ +(\/ebooks\|\/book\) +(


chm|pdf|zip|txt) -inurl:htm -inurl:html lewis alice wonderland.

Todas essas buscas so exemplificadas


na Listagem 1.

Sugestes de ortografia
Quando se faz uma consulta no site do
Google usando um termo incomum ou
com erros de digitao/ortografia, como
javascripiti, o Google capaz de verificar em seu ndice gigantesco que esta no
a forma mais freqente da palavra, e
educadamente sugerir: Voc quis dizer:
JavaScript?.
A mesma funcionalidade est dispon vel na API at ravs do mtodo
doSpellingSuggestion() da classe GoogleSearch.
Basta passar o termo como parmetro, que
ser retornada a sugesto de ortografia, ou
null se no houver sugesto. Por exemplo,

ao buscar por Filosofy, retornado o


termo correto Philosophy (veja Listagem 1).

Pginas em cache
No processo de indexao de uma pgina,
o Google armazena uma cpia em cache.
Esta verso arquivada pode ser obtida
usando o mtodo doGetCachedPage(), que
retorna o cdigo HTML da pgina. Esse documento pode ser facilmente reexibido por
um componente grfico ou uma taglib, ou,
claro, ser mostrado em um navegador web.
Uma maneira simples para obter pginas
em cache mostrada na Listagem 1.

Limitaes
A Google Search API uma oferta
1
Obra de Lewis Caroll publicada em 1865 e em domnio
pblico desde o incio do sculo passado.

Operadores
Os termos a seguir possuem interpretao especial e podem ser includos na expresso da consulta:

Operador

Significado

Exemplo

Inteno

Inclui

to be +or not to be

Incluir o or na pesquisa. Normalmente seria ignorado por ser uma


palavra muito comum em ingls

OR
site:

Exclui
Frase
Ou
No Site

windows -microsoft

Pginas com windows e sem microsoft

Java Magazine

Busca a frase toda ao invs dos termos separados

jsf or struts

Pginas com um ou outro termo

gosling site:weblogs.java.net

Posts contendo o nome Gosling nos blogs do site java.net

daterange:

Entre datas

java daterange:2453371-2453736

Pginas com o termo java publicadas em 2005. Curiosamente, as


datas precisam estar no formato Juliano, ou seja, deve ser fornecido
o nmero de dias corridos desde 1 de Janeiro de 4713 a.c.

intitle:
allintitle
inurl:
allinurl:

No ttulo
Todas no ttulo
Na URL
Todas na URL

hibernate intitle:OnJava

Pginas sobre Hibernate cujo titulo contenha OnJava

allintitle:Java Magazine

Pginas com os termos Java e Magazine no ttulo

inurl:google

Pginas com o termo google no endereo

allinurl:google sketchup

Pginas com os termos google e sketchup no endereo

allintext:

No texto

allintext:open source java

Pginas com os termos open, source e java no corpo da pgina, ignorando ttulo, links e URL.

allinlinks:

Nos links

allinlinks:google

Pginas com o termo google nos links, ignorando


o texto, o ttulo e a URL.

filetype:

Tipo de arquivo

Subversion book filetype:pdf

Livros sobre o software de gerncia de configurao Subversion


em PDF

-filetype:
info:

Exceto tipo de arquivo


Sobre

Subversion book -filetype:pdf

Livros sobre o Subversion, exceto em formato PDF

info:www.javamagazine.com.br

Informaes sobre o site da JM*

link:

Referenciam

link:www.javamagazine.com.br

Pginas com links para o site da JM*

Related:

Relacionados

related:www.javamagazine.com.br

Pginas semelhantes da JM*

cache:

Cpia em cache

cache:www.java.com

Obtm a cpia do cache do Google da pgina inicial do site


comercial de Java da Sun.

* Deve ser o nico termo da consulta

62 Java Magazine Edio 38


jm38.indb 62

17/7/2006 14:13:34

Restries

estries fazem com que a consulta busque


apenas em pginas de um determinado
pas, ou que sejam escritas em um dado idioma,
ou que tratem de alguns tpicos indexados
separadamente, etc. Abaixo esto exemplos
de restries que podem ser utilizadas e qual
mtodo da classe GoogleSearch usar para configur-las:
Idioma setLanguageRestrict()
lang_pt (Portugus), lang_en (Ingls),lang_de
(Alemo), lang_fr (Francs), lang_es (Espanhol).
Pas setRestrict()
countryBR (Brasil), countryEU (Unio Europia), countryUS (Estados Unidos), countryPY (Paraguai), countryPT (Portugal).

experimental do Google, limitada a


aplicaes no-comerciais e a apenas mil
consultas por dia. No h previso pblica
de se estender o servio. Entretanto, para
aplicaes corporativas, existe uma API
semelhante baseada no servidor de busca
corporativo do Google, que um produto
parte (veja links).
Outra limitao que apenas um subconjunto dos operadores de busca do site
est disponvel para a API. Por exemplo,
stocks:, define:, movie:, ou outros
servios, como Images e Froogle, s podem ser usados no site. (Estas e outras
opes de busca podem ser conhecidas
em google.com/help/cheatsheet.html ou em
googleguide.com/advanced_operators_reference.html.)

Tpico setRestrict()
unclesam (Governo norte-americano), linux (Sistema Operacional Linux), mac (Computadores Macintosh), bsd (Sistema Operacional FreeBSD).
Restries Combinadas setRestrict() ou
setLanguageRestrict()

Operador

As restries podem ser combinadas usando os


operadores lgicos mostrados na tabela ao lado.
Por brevidade, foram apresentadas aqui apenas uma seleo de idiomas, pases e tpicos.
A lista completa pode ser vista em google.
com/apis/reference.html.

Significado

Exemplo

Descrio

No

-lang_pt

Exclui resultados em portugus

linux.countryBR

Resultados apenas do tpico linux de sites no Brasil

Ou

lang_br | lang_en

Resultados apenas em portugus ou ingls

()

Precedncia

(linux).(-(countryUS|countryUK))

Resultados do tpico linux que no estejam nos EUA ou no Reino Unido

Por ltimo, a API muito mais precisa


para termos e sites americanos, pelo volume
que estes representam no ndice total. Por
exemplo, a sugesto ortogrfica capaz de
corrigir termos mais comuns em portugus,
como Filosopia, mas falha em outros pouco publicados, como Lumbriga.

Executando o exemplo
Para testar as consultas sugeridas, basta executar a classe jm.GoogleSearchDemo
(Listagem 1), que est tambm disponvel
no site da Java Magazine. Deve ser passada
como parmetro a chave de uso (alm do
classpath, se este no estiver configurado).
Por exemplo (em uma linha):
java -cp c:\Java\GoogleAPI\googleapi.jar;.
jm.GoogleSearchDemo sua_chave

Concluses
A Google API poderosa e bastante
funcional. Mas colocar essa biblioteca de
consultas em prtica numa aplicao pode
no ser to simples, principalmente pelas
limitaes da sua verso atual. Algumas
destas limitaes, no entanto, podem ser
dribladas, por exemplo permitindo que
cada usurio cadastre sua prpria chave
de acesso. As aplicaes mais beneficiadas
diretamente so aquelas que lidam com
gerncia de contedo e sites, podendo
mostrar contedo semelhante ou suges-

tes de ortografia. Mas com um pouco


de criatividade voc poder usar a API
para incrementar praticamente qualquer
aplicao, integrando-a ao mais popular
mecanismo de busca mundial, e surpreender seus usurios.
Julio Faerman
(jfaerman@gmail.com) consultor independente em desenvolvimento de sistemas corporativos e
melhoria de processos de software.
Certificado SCJP, SCWCD, SCBCD, SCDJWS e SCEA(I),
bacharel em Cincia da Computao, MBA em Gerncia
de Projetos e Mestrando da Universidade Federal de
Uberlndia, na rea de Inteligncia Artificial.

google.com/apis
Site principal da Google Search API
code.google.com
Portal para desenvolvedores (geral)
code.google.com/enterprise1
Portal para desenvolvedores (clientes
corporativos)
www.googleguide.com
Guia de uso para buscas do Google (criado por
terceiros)
undergoogle.blogspot.com
Blog com dicas e notcias do Google
javamagazine.com.br/downloads/jm38/
jm-googleapi.zip

Edio 38 Java Magazine


jm38.indb 63

63

17/7/2006 14:13:39

AJAX com Google W

Escrevendo Aplicaes Web Altamen te

Google Web Toolkit (GWT) um


framework que define um novo
paradigma de desenvolvimento
de aplicaes AJAX. O seu objetivo
esconder do programador a implementao de cdigo JavaScript, considerando
que esta tarefa repetitiva e propensa a
erros, e repleta de tarefas tediosas, como
o tratamento de incompatibilidades entre
navegadores.
O GWT abstrai a linguagem JavaScript
a partir de uma biblioteca de classes Java,
na qual est disponvel uma coleo de
componentes visuais AJAX (os widgets),
j conhecidos dos que usam as aplicaes
AJAX do Google, por exemplo o GMail e
o Google Maps.
Este tutorial apresenta o GWT e traz um
exemplo de implementao utilizando o
framework.

pilador, distribudo no pacote


do prprio framework.
O uso de cdigo Java
vantajoso, por exemplo, por
permitir que o desenvolvedor
utilize a IDE Java de sua preferncia, j que o GWT
independente do ambiente de desenvolvimento.
Alm disso, com o uso
de uma IDE, as vantagens da linguagem Java so bem
a p r o ve i t a d a s ;
por exemplo,

Vantagens do uso de
classes Java
A principal novidade apresentada pelo
GWT o uso de classes Java para representar os componentes visuais da aplicao.
Estas classes so convertidas em
cdigo JavaScript por um com-

64 Java Magazine Edio 38


jm38.indb 64

17/7/2006 14:13:43

e Web Toolkit

en te Interativas em Java

Crie aplicaes AJAX


a partir de classes
Java, utilizando o novo
framework do Google,
e deixe que o trabalho
pesado seja feito para voc

doUGLas Jos soares rodrIGUes


a verificao de tipos pelo compilador e
a capacidade de completar cdigo ao ser
digitado.

Arquitetura do Framework
Um modelo da arquitetura do GWT
apresentado na Figura 1. A arquitetura
dividida em duas grandes camadas. A camada de bibliotecas contm uma biblioteca
de componentes visuais e uma biblioteca
de emulao Java, que traz a implementao de algumas classes dos pacotes

java.lang e java.util. Estas duas bibliotecas


compem a infra-estrutura bsica necessria para representar os componentes AJAX
utilizando cdigo Java.
A outra camada do GWT composta
por duas ferramentas. A primeira o
compilador de Java para JavaScript, que
responsvel por gerar o cdigo JavaScript
representando os componentes visuais

utilizados. A segunda ferramenta um


navegador web local, que evita que o
desenvolvedor tenha de converter o seu
cdigo Java em JavaScript cada vez que
desejar realizar um teste. O navegador
local capaz de exibir os componentes das
bibliotecas sem a necessidade da converso
de cdigo.

Instalao

projeto. Recomenda-se tambm adicionar


o diretrio do GWT varivel de ambiente
PATH, para facilitar a criao do projeto.
A partir do diretrio criado para o projeto, execute o comando a seguir:
projectCreator eclipse TutorialGWT

Isso cria o projeto. Em seguida, execute


este comando (numa mesma linha):
applicationCreator eclipse TutorialGWT

O primeiro passo para utilizar o GWT


br.com.javamagazine.client.TutorialGWT
, claro, baixar o pacote a partir da pgina do framework. O GWT encontra-se
Ser criada a estrutura bsica de um
disponvel para Windows e Linux. Neste
projeto para o Eclipse, com referncias s
tutorial iremos apresentar as instrues
bibliotecas j configuradas. No Eclipse,
de configurao para Windows, lembranbasta importar o projeto criado (item de
do que o procedimento
bastante semelhante para o
Biblioteca de
Linux. Foi utilizada a verso
Biblioteca de
emulao Java
Bibliotecas
1.0.21 do GWT; o pacote
componentes visuais
(java.lang e java.util)
distribudo no formato
ZIP e tem 13.9 MB.
A instalao bastante
Compilador Java
Navegador
Ferramentas
simples: basta descompara JavaScript
Local
pactar o arquivo ZIP
em um diretrio de sua
preferncia. Neste dire- Figura 1. Arquitetura do Google Web Toolkit.
trio estaro as bibliotecas
do GWT, e alguns utilitrios para a
configurao de projetos.
O exemplo deste artigo implementado utilizando o Eclipse com o WTP
(Web Tools Project). A utilizao desse
Eclipse se justifica porque o GWT
traz ferramentas que automatizam o
processo de criao de projetos para
esse IDE.

Criando um projeto
O primeiro passo a criao de um
projeto e uma aplicao. Para isso,
sero utilizados dois utilitrios fornecidos com o GWT: applicationCreator e
projectCreator. Ser necessrio criar um
diretrio para conter os arquivos do

Figura 2. Estrutura do projeto de exemplo.


Edio 38 Java Magazine

jm38.indb 65

65

17/7/2006 14:13:46

AJAX com Google Web Toolkit

Listagem 1. TutorialGWT.html
<html>
<head>
<title>Tutorial GWT</title>
<style>
body,td,a,div,.p{font-family:arial,sans-serif}
div,td{color:#000000}
a:link,.w,.w a:link{color:#0000cc}
a:visited{color:#551a8b}
a:active{color:#ff0000}
.list {width: 100%;}
</style>
<meta name=gwt:module content=
br.com.javamagazine.TutorialGWT>
</head>
<body>
<script language=javascript src=gwt.js></script>
<iframe id=__gwt_historyFrame style=
width:0;height:0;border:0></iframe>
<h1>Tutorial GWT</h1>
<div id=input align=center></div>
<table align=center>
<tr>
<td>
<table align=center width=400>
<tr>
<td id=label></td>
<td id=text width=100%></td>
</tr>
<tr>
<td id=list colspan=2></td>

</tr>
<tr>
<td id=removeContact align=center colspan=2></td>
</tr>
</table>
</td>
<td>
<table align=center>
<tr>
<td>Nome:&nbsp;</td>
<td id=firstName></td>
</tr>
<tr>
<td>Sobrenome:&nbsp;</td>
<td id=lastName></td>
</tr>
<tr>
<td>E-mail:&nbsp;</td>
<td id=email></td>
</tr>
<tr>
<td colspan=2>
<div id=insertContact align=center></div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>

Listagem 2. TutorialGWT.java
package br.com.javamagazine.client;

public void onClick(Widget sender) {


int i = list.getSelectedIndex();
itens.remove(i);
filtrarLista(list, filter.getText());
}
});

import java.util.*;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.*;
public class TutorialGWT implements EntryPoint {
private List itens = new ArrayList(); //Contatos cadastrados

list.setVisibleItemCount(5); // Numero de itens exibidos


list.setStyleName(list);

public void onModuleLoad() {


final Label label = new Label(Filtro:);
final ListBox list = new ListBox();
final TextBox filter = new TextBox();
final TextBox firstName = new TextBox();
final TextBox lastName = new TextBox();
final TextBox email = new TextBox();
final Button insertContact = new Button(Adicionar);
final Button deleteContact = new Button(Remover);

// Listener que trata cada caractere


// digitado no campo de filtro
filter.addKeyboardListener(new KeyboardListenerAdapter() {
public void onKeyUp(
Widget sender, char keyCode, int modifiers)
{
filtrarLista(list, filter.getText());
}
});

private void inserirContato(ListBox list, String firstName,


String lastName, String email, String filter)
{
String novoContato = lastName + , + firstName
+ ( + email + );
list.addItem(novoContato);
itens.add(novoContato);
filtrarLista(list, filter);
}

// Listener que trata o clique no boto Adicionar


insertContact.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
inserirContato(
list, firstName.getText(), lastName.getText(),
email.getText(), filter.getText());
firstName.setText();
lastName.setText();
email.setText();
}
});
// Listener que trata o clique no boto Remover
deleteContact.addClickListener(new ClickListener() {

RootPanel.get(label).add(label);
RootPanel.get(text).add(filter);
RootPanel.get(list).add(list);
RootPanel.get(firstName).add(firstName);
RootPanel.get(lastName).add(lastName);
RootPanel.get(email).add(email);
RootPanel.get(insertContact).add(insertContact);
RootPanel.get(removeContact).add(deleteContact);

private void filtrarLista(ListBox lista, String filtro) {


lista.clear();
for (int i = 0; i < itens.size(); i++) {
String item = (String) itens.get(i);
if (item.toLowerCase().indexOf(
filtro.toLowerCase()) != -1)
{
lista.addItem(item);
}
}
}

66 Java Magazine Edio 38


jm38.indb 66

17/7/2006 14:13:46

menu File>Import>Existing projects into


workspace), para que as configuraes
sejam automaticamente aproveitadas. A
estrutura do projeto deve ficar como na
Figura 2.

Implementando o projeto de exemplo


Neste tutorial, o problema que iremos
resolver a criao de uma busca incremental, ou seja, uma busca realizada conforme caracteres so digitados. Usurios
do navegador Firefox esto acostumados
com esta funcionalidade (basta pressionar
Ctrl+F para abrir o painel de busca). O
exemplo tambm demonstra como fazer
um cadastro simples, mantendo os dados
numa coleo em memria.
Usaremos uma campo de texto comum
para conter o filtro para a busca. Assim que
o contedo desse campo for alterado, uma

Figura 3. Janela de log do navegador local.

lista ir exibir apenas os elementos que


correspondam ao filtro digitado. Observe
que todos os componentes usados (campo
de texto, lista) so tipos de campos de
formulrios HTML comuns, e que no h
nenhum tipo de requisio feita ao servidor web (embora isto possa acontecer na
soluo de outros problemas).
Abra o arquivo TutorialGWT.html, gerado
pelo toolkit, e o modifique para que corresponda ao contedo da Listagem 1. Observe
que o arquivo muda pouco, se comparado
ao que foi gerado. So definidos oito IDs,
que correspondem aos locais onde sero
exibidos os componentes definidos na
classe Java. E o estilo .list definido para
posicionar a lista na tela corretamente.
O prximo passo implementar a classe
TutorialGWT, que ir descrever o comportamento da busca incremental. No exemplo,
foi criado um pequeno catlogo de
endereos, onde possvel cadastrar nome, sobrenome e e-mail de
um contato, e remover os contatos
j cadastrados. A busca incremental usada para filtrar os contatos
j cadastrados. Nesta classe so
definidos mtodos auxiliares para

o preenchimento inicial da lista e para realizar a busca na lista por um determinado


filtro. O cdigo completo para a classe
pode ser conferido na Listagem 2.

Executando e compilando
Aps editar os arquivos HTML e a classe
Java, faa a compilao do projeto com um
duplo-clique (dentro do Eclipse) no arquivo gerado TutorialGWT-compile.cmd. Isso
gera o cdigo JavaScript e cria o diretrio
www/br.com.javamagazine.TutorialGWT,
com arquivos HTML.
Para executar o projeto, d um duploclique em TutorialGWT-shell.cmd. Sero
exibidas duas janelas, uma com o log da
execuo da aplicao (Figura 3) e outra
com o navegador exibindo a aplicao em
execuo (Figura 4).

Concluses
O GWT mostra-se um framework extremamente eficiente e bem escrito. No pacote
de download j esto inclusas todas as
ferramentas necessrias, e sua integrao
com a IDE (atualmente, s o Eclipse suportado) muito simples. uma soluo
robusta para o desenvolvimento AJAX com
o suporte de uma empresa renomada.

code.google.com/webtoolkit/
Google Web Toolkit
eclipse.org/webtools
Projeto Eclipse Web Tools

javamagazine.com.br/downloads/jm38/
jm-gwt.zip

Figura 4. Exemplo de cadastro e busca incremental, exibido no navegador

Douglas Jos
Soares Rodrigues
(douglasjose@gmail.com)
formado em Cincia da Computao pela Unicamp e trabalha
como consultor Java h quatro anos.

Edio 38 Java Magazine


jm38.indb 67

67

17/7/2006 14:13:51

Formatao e Conver s
Estendendo o framework e aumentando a capa

68 Java Magazine Edio 38


jm38.indb 68

17/7/2006 14:14:12

ci

r so no Struts

pa

cidade da sua aplicao web

Utilize Converters para


resolver problemas de
converso no Struts e
deixe seus FormBeans mais
completos

arI dIas neto

Struts oferece muitas


funcionalidades para o
tratamento da entrada
de dados, mas possui ainda
algumas limitaes
nessa rea. Quem
utiliza o framework
sabe da dificuldade
para se tratar, por
exemplo, datas e nmeros decimais, e acaba utilizando strings para
representar muitas informaes que vm do usurio.
Como sabemos, quando o usurio entra com valores em um formulrio e os envia, estes chegam ao servidor em
forma de strings. O Struts tenta converter
essas strings para os formatos mapeados
no FormBean (classe que representa um
formulrio), e caso no consiga, recebemos
erros pouco explicativos ou pginas em

branco; ou pior: os valores podem ser tratados de forma equivocada. Por exemplo, em
uma data como 10/03/06, o ms ser 10, 03
ou 06? Para ns brasileiros, fica claro que o
ms maro mas e para o sistema?
Uma das solues mais utilizadas
criar mtodos no FormBean para tratar os
dados enviados. Dessa forma, existiriam
no FormBean dois mtodos: um para converter para o tipo correto no momento da
entrada dos dados, e outro para converter
para string no momento da exibio. O
problema dessa soluo que ela se repetir para todos os formulrios que precisam
da converso, alm de no se aplicar aos
DynaActionForms (representaes dinmicas de formulrios configuradas no
struts-config.xml). Aqui veremos uma soluo alternativa, que oferece vantagens.

Soluo proposta
Para demonstrar nossa soluo, vamos
construir uma aplicao simples, com uma
pgina JSP, um FormBean e uma Action.
Usaremos uma classe concreta para representar o formulrio, mas poderamos
igualmente utilizar um DynaActionForm.
O exemplo completo est disponvel no site
da Java Magazine.
O JSP, como mostra a Listagem 1, constri
um formulrio com dois campos de texto;
o primeiro para uma data e o segundo
para um nmero decimal. Note que para
a construo do formulrio utilizamos as
tags do Struts <html:form> e <html:text>.
O FormBean que representa este formulrio ter dois atributos, um do tipo java.util.Date
e outro do tipo java.math.BigDecimal. Veja a
Listagem 2; observe que no temos atri-

butos do tipo String. Isso porque faremos o


Struts configurar o FormBean com os tipos
corretos, ou seja, o prprio framework ir
converter os dados enviados pelo usurio
para Date e BigDecimal.
A Action tem uma implementao simples. Ela faz apenas um forward para o JSP
com o formulrio (veja a Listagem 3). Nosso objetivo aqui fazer com que o Struts
configure o FormBean com seus devidos
atributos. No nos importa neste ponto o
que ser feito depois com estes valores.
A Listagem 4 mostra o contedo do
arquivo struts-config.xml. A configurao
simples. Primeiro definimos um formulrio dentro do elemento <form-beans>, com
dois atributos: nome e classe. Usamos o nome
formBeanTeste e a classe FormBeanTeste.
Logo em seguida, temos a configurao da Action dentro do elemento
<action-mappings>. Configuramos o path,
que ser a URL chamada pelo formulrio
no momento da postagem; a classe, atravs
do atributo type; e o mais importante: o
nome do FormBean, atravs do atributo
name. O nome deve ser o mesmo dado na
configurao do FormBean. Note que, aps
a execuo da Action, iremos retornar
para a mesmo formulrio (index.jsp) pois
tambm precisamos exibir/formatar os
dados corretamente. Esse retorno simula,
por exemplo, um formulrio de edio que
j possui os dados populados, ou quando
h um processo de validao e o usurio
redirecionado ao mesmo formulrio
seguido dos erros encontrados.

Primeira parte da soluo


Neste estgio, a aplicao ainda no fun-

Edio 38 Java Magazine


jm38.indb 69

6

17/7/2006 14:14:37

Formatao e Converso no Struts

cionar. Assim que o usurio preencher o


formulrio e clicar em Enviar, receber um
erro. Isso acontece porque o Struts tenta
converter os dados postados para os tipos
correspondentes no FormBean, e no consegue. Por padro o Struts no vem com os
conversores corretos para BigDecimal e Date.
a que entra a nossa soluo.
Voc j deve ter ouvido falar que o
Struts implementa o design pattern Front

Controller (veja links). Isso significa que


ele possui um controlador que gerencia
o tratamento das solicitaes, deixando
para as Actions a responsabilidade de
responder requisio e de definir o que
ser retornado para o usurio.
O Front Controller do Struts o servlet
org.apache.struts.action.ActionServlet, que est
configurado no arquivo web.xml. justamente neste servlet que podemos interferir

Listagem 1. index.jsp: Pgina com o formulrio de exemplo.


<%@ taglib uri=/tags/struts-html prefix=html %>
<html:form action=/PostFormularioAction>

Data: <html:text property=data /><br />

Valor: <html:text property=valor /><br />

<html:submit/>
</html:form>

Listagem 2. FormBeanTeste.java: Classe que representa o formulrio, com dois campos: um Date e outro BigDecimal.
package br.com.jm.formbean;
import java.math.BigDecimal;
import java.util.Date;
import org.apache.struts.action.ActionForm;
public class FormBeanTeste extends ActionForm {
private Date data;
private BigDecimal valor;
}

//... Mtodos get/set

Listagem 3. PerformPostAction.java: Action que apenas retorna para o formulrio com o forward sucesso.
package br.com.jm.action;
// imports
public class PerformPostAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,


HttpServletRequest request, HttpServletResponse response)
throws Exception
{
/* Neste ponto pode-se obter os valores enviados j com os tipos corretos,
/ por exemplo:
*
* FormBeanTeste meuForm = (FormBeanTeste)form;
* Date dataEnviada = meuForm.getData();
*/
return mapping.findForward(sucesso);
}

Listagem 4. struts-config.xml: com a configurao de um FormBean e uma Action.


<struts-config>
<form-beans>
<form-bean name=formBeanTeste type=formbean.FormBeanTeste/>
</form-beans>
<action-mappings>
<action path=/PostFormularioAction
type=br.com.jm.action.PerformPostAction name=formBeanTeste>

<forward name=sucesso path=/index.jsp/>
</action>
</action-mappings>
</struts-config>

e registrar os nossos converters (classes que


executam converses de tipos, por exemplo, de String para Date). Para tal, iremos
substituir, no arquivo web.xml, o servlet do
Struts por um servlet nosso (que estende
o do Struts): MeuStrutsServlet. Esse servlet
deve fazer tudo que o ActionServlet faz,
alm de registrar os converters corretos
para Date e BigDecimal.
A Listagem 5 mostra como fica nosso
servlet. Observe que apenas iremos redefinir o mtodo init() e adicionar as linhas
que registram os converters corretos,
e continuar chamando o mtodo init()
da superclasse. A Listagem 6 mostra a
configurao do web.xml antes e depois
da substituio (apenas a parte alterada).
Simplesmente trocamos a classe do servlet,
apontando para a nossa.
Vamos agora aos converters. Para o
converter de data, utilizamos a classe
DateLocaleConverter do projeto Jakarta Commons BeanUtils (veja links). Passamos
como parmetros o locale e o formato da
data que chegar ao converter. Neste caso,
usamos o formato dd/MM/yyyy.
Infelizmente, para o conversor de
BigDecimal no podemos ainda utilizar
o BigDecimalLocaleConverter (tambm do
BeanUtils), pois h atualmente uma
incompatilidade entre esse conversor
e o Struts. Ento, iremos criar a nossa
prpria classe que implementa a interface org.apache.commons.beanutils.Converter.
Vamos cham-la de BigDecimalConversor
(Listagem 7).
A classe BigDecimalConversor ter um mtodo converter() que receber dois parmetros: um java.lang.Object e o tipo de classe
para qual dever converter o Object. Como
registramos o conversor para apenas o
tipo BigDecimal converteremos sempre para
esse tipo. Alm disso, a implementao de
exemplo j faz o tratamento de excees.
Se houver algum erro, um valor padro
poder ser retornado.

Testando os conversores
Agora que j temos os conversores prontos, vamos fazer um teste. Rode a aplicao
em qualquer container web, como o Tom-

70 Java Magazine Edio 38


jm38.indb 70

17/7/2006 14:14:43

cat. A primeira pgina a ser exibida ser a


index.jsp. Preencha o formulrio conforme
a Figura 1 e envie os dados.
Se tudo correr bem, aps a requisio
nenhum erro ocorrer; ou seja, o Struts
ter utilizado os nossos converters. Mas
ainda temos um problema. Note que tanto
a data como o nmero decimal esto com
formataes erradas aps o retorno (veja a
Figura 2). A data no est formatada para
o padro configurado no converter, e o
nmero decimal no est com a notao
brasileira.
Isso acontece porque os converters tratam
a entrada de dados, mas no a exibio. Os
dados foram convertidos corretamente, porm ao ser reexibido o formulrio, no foi
feita a formatao correta. A tag <html:text>
no trata os atributos do FormBean levando em conta os padres locais. Por isso
muitos desenvolvedores colocam mtodos

Listagem 5. MeuStrutsServlet.java: Servlet que registra os converters e substitui o servlet do Struts.


package br.com.jm.servlet;
import
import
import
import

java.math.BigDecimal;
java.util.Date;
java.util.Locale;
javax.servlet.ServletException;

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import org.apache.struts.action.ActionServlet;
import br.com.jm.converter.BigDecimalConversor;
public class MinhaStrutsServlet extends ActionServlet {
public void init() throws ServletException {
super.init();
Locale locale = new Locale(pt, BR);
//criao dos conversores
DateLocaleConverter dateConverter =
new DateLocaleConverter(locale,dd/MM/yyyy);
BigDecimalConversor bigDecimalConversor =
new BigDecimalConversor(locale, new BigDecimal(0), true);

//registro dos conversores


ConvertUtils.register(dateConverter, Date.class);
ConvertUtils.register(bigDecimalConversor, BigDecimal.class);

Edio 38 Java Magazine


jm38.indb 71

71

17/7/2006 14:14:52

Formatao e Converso no Struts

no FormBean para formatar estes dados


antes da exibio. Essa prtica, no entanto,
no recomendada, pois se repetir para
todos os formulrios que trabalham com
dados diferentes de strings, deixando o
desenvolvimento mais lento e diminuindo a reutilizao do cdigo.

Segunda parte da soluo

<html:text> formate o contedo que ir


exibir. Para isso, iremos substituir a classe
que implementa a taglib.
Aqui importante lembrar que as taglibs so
configuradas em arquivos chamados tag library
descriptors (TLDs), que informam quais atributos
a tag pode ter, alm de indicar a classe que implementa a tag.

Chegamos segunda parte da soluo. Precisamos fazer com que a tag

Para substituir a tag podemos adotar

Listagem 6. Trecho do web.xml, antes e depois da substituio da Action.


Antes da substituio
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

Depois da substituio
<servlet-name>action</servlet-name>
<servlet-class>br.com.jm.servlet.MinhaStrutsServlet</servlet-class>

Listagem 7. BigDecimalConversor.java: Converter personalizado para BigDecimal.


package br.com.jm.converter;
import
import
import
import

java.math.BigDecimal;
java.text.DecimalFormat;
java.text.ParseException;
java.util.Locale;

import org.apache.commons.beanutils.ConversionException;
import org.apache.commons.beanutils.Converter;
public class BigDecimalConversor implements Converter {
private Locale locale;
private BigDecimal valorPadrao;
private boolean useValorPadrao;
public BigDecimalConversor(Locale locale, BigDecimal valorPadrao,
boolean useValorPadrao)
{
this.locale = locale;
this.valorPadrao = valorPadrao;
this.useValorPadrao = useValorPadrao;
}
public Object convert(Class classe, Object valor) {
try {
Object resultado = parse(valor);
if (resultado == null || resultado instanceof BigDecimal) {
return resultado;
}
return new BigDecimal(resultado.toString());
}
catch (Exception ex) {
if (useValorPadrao) {
return valorPadrao;
}
else {
throw new ConversionException(Erro ao instanciar BigDecimal);
}
}
}

private Object parse(Object valor) throws ParseException {


DecimalFormat formatter =
(DecimalFormat) DecimalFormat.getInstance(locale);
return formatter.parse((String) valor);
}

duas abordagens. A primeira criar uma


nova taglib, ou seja, um novo arquivo
.tld e uma nova classe que estende a tag
do Struts. Esta abordagem segue as boas
prticas de utilizao do framework, pois
no altera nenhum arquivo original do
Struts e deixa o cdigo nas pginas JSP
mais lgivel, j que utiliza uma taglib
prpria. a abordagem indicada para
aplicaes que esto iniciando o processo
de desenvolvimento.
A segunda, e a que adotaremos aqui,
apenas editar o arquivo struts-html.tld e
substituir o nome da classe que implementa a tag. Esta soluo indicada para aplicaes que j esto avanadas no processo
de desenvolvimento, e em que um refactoring de todas as JSPs que utilizam esta
taglib seria realmente muito custoso.
O arquivo struts-html.tld utilizado para
configurar vrias taglibs, por isso temos
que fazer a alterao apenas na parte
referente tag <html:text>. A Listagem 8
mostra o trecho relevante do arquivo de
configurao antes e depois da mudana.
Note que alteramos a linha onde est
a definio da classe: o nome da classe
muda de org.apache.struts.taglib.html.TextTag
para br.com.jm.taglib.MinhaTextTag.
A Listagem 9 mostra a classe da nossa taglib,
que estende org.apache.struts.taglib.html.TextTag
e redefine formatValue(). Este mtodo ser
chamado antes da exibio do contedo e
tem implementao simples. Verificamos
o objeto que passado como argumento,

Figura 1. Formulrio preenchido com valores de teste.

Figura 2. Exibio do formulrio aps seu envio. Data e


Valor com formatao.

72 Java Magazine Edio 38


jm38.indb 72

17/7/2006 14:15:08

Edio 38 Java Magazine


jm38.indb 73

73

17/7/2006 14:15:11

Formatao e Converso no Struts

e caso seja uma instncia de BigDecimal,


fazemos a formatao utilizando a classe
java.text.DecimalFormat. Mais uma vez, o parmetro Locale(pt, BR) utilizado. J se o
objeto passado for do tipo Date, formatamos
para o padro de exibio desejado, nesse
caso dd/MM/yyyy.
Esta segunda abordagem que apenas
substitui o nome da classe no arquivo
struts-html.tld, pode, em uma fase de manuteo, deixar os desenvolvedores um pouco
confusos, j que praticamente escondemos
a nova configurao e a criao da nova
taglib. Por outro lado, pode ser a salvao
para aqueles que j possuem milhares de
JSPs e no querem ter de alter-los caso
seja criada uma nova tag. Analise a melhor

soluo para a sua aplicao levando em


conta a legibilidade do cdigo e a facilidade
de manuteno da sua aplicao.

3. E por ltimo, no momento da exibio,


a taglib formatou os dados exatamente
como haviam sido digitados.

Testando a soluo

Dessa maneira, seus FormBeans podero


ter atributos mapeados para qualquer
classe Java, desde que voc registre um
conversor responsvel para ela e estenda
as taglibs. Essa mesma soluo se aplica
tambm para formulrios dinmicos (os
DynaActionForms).

Vamos testar a soluo completa. Reinicie a aplicao e digite os mesmos dados


que usamos na primeira vez, como j mostrado na Figura 1. Aps clicar no boto
Enviar, o formulrio dever aparecer com
os dados formatados corretamente.
Note que trs coisas aconteceram durante
o processamento da requisio:
1. O St r uts conver teu os dados e
configurou o FormBean;
2. A Action redirecionou o usurio para
o mesmo formulrio;

Listagem 8. struts-html.tld, antes e depois da substituio da classe que implementa a tag.


Antes da substituio
<tag>
<name>text</name>
<tagclass>org.apache.struts.taglib.html.TextTag</tagclass>
...
</tag>
Depois da substituio
<tag>
<name>text</name>
<tagclass>br.com.jm.taglib.MinhaTextTag</tagclass>
...
</tag>

Listagem . MinhaTextTag.java: Classe que substituir a implementao da taglib Text do Struts.


package br.com.jm.taglib;
// imports
public class MinhaTextTag extends TextTag{
public MinhaTextTag(){
super();
this.type = text;
doReadonly = true;
}

protected String formatValue(Object value) throws JspException {


Locale locale = new Locale(pt,BR);
if(value instanceof BigDecimal){
try{
DecimalFormat formatter =
(DecimalFormat) DecimalFormat.getInstance(locale);
return formatter.format(value);
} catch(Exception e){
return super.formatValue(value);
}
}
if(value instanceof Date){
try{
SimpleDateFormat sdf = new SimpleDateFormat(dd/MM/yyyy);
return sdf.format(value);
} catch(Exception e){
return super.formatValue(value);
}
}
return super.formatValue(value);
}

Concluses
Neste artigo, vimos como registrar converters personalizados no Struts e como
formatar formulrios para exibio ou
edio. Uma soluo mais rica poderia
aceitar a configurao dos converters via
XML. Dessa forma, parmetros do sistema,
como o padro de formatao da data, no
estariam diretamente no cdigo, e sim num
resource da aplicao. E possivelmente
teramos apenas um objeto java.util.Locale
instanciado por sesso do usurio.

struts.apache.org
Framework Apache Struts: downloads e
documentao.
jakarta.apache.org/commons
Jakarta Commons, componentes reutilizveis para
vrios fins.
java.sun.com/developer/technicalArticles/
Intl/IntlIntro/
Uma viso geral sobre internacionalizao
java.sun.com/blueprints/corej2eepatterns/
Patterns/FrontController.html
Sobre o design pattern Front Controller
javamagazine.com.br/downloads/jm38/
jm-strutsconverters.zip
Ari Dias Neto
(aridiasneto@gmail.com) consultor Java/JEE com experincia
de mais de sete anos em tecnogias
para web. Atualmente atua em projeto
internacional para IBM e tem certificaes SCJP, SCWCD,
EA(I) e de Borland CaliberRM.

4 Java Magazine Edio 38


jm38.indb 74

17/7/2006 14:15:21

jm38.indb 75

17/7/2006 14:15:36

Se voc anda precisando de ajuda para manter a sua empresa na internet,


est na hora de conhecer as solues completas da LocaWeb.
A LocaWeb torna-se mais completa a cada dia que passa. Hoje ela oferece todos os tipos de servios e
ferramentas de internet, atendendo s diversas necessidades de seus clientes. E para estar ainda mais
prxima deles, a LocaWeb no pra de investir para ter um atendimento cada vez mais gil e eficiente. Mude
para a LocaWeb. A gente garante a sua tranqilidade. www.locaweb.com.br

Na contratao de um Plano de Hospedagem* voc tem: Blog Gratuito E-mails LocaMail com antivrus e anti-spam Completo painel de controle
Suporte s linguagens ASP**, .NET 2.0, JSP e Servlets***, PHP 5***, PERL, Python***, C,C++***, Ruby on Rails***, PERL/CGL, XML, WML/WAP
Diversos componentes para ASP e .NET Relatrios de visita em portugus Certificado seguro com SSL Banco de dados Access**, MySQL
5.0*** e PostgreSQL 8.1*** Podcast Backup dirio incluso Garantia de disponibilidade de 99,5%
E ainda pode contratar servios adicionais hospedagem como: comrcio eletrnico, banco de dados MS SQL Server, Oracle compartilhado, MySQL
para Windows, MySQL adicional para Linux, domnios e pacotes de e-mails adicionais e muito mais.
*Para mais detalhes e complementao de condies, consulte o modelo de contrato disponvel no site www.locaweb.com.br **em Windows ***em Linux

jm38.indb 76

17/7/2006 14:15:41

You might also like