Java Magazine - Edição 038

June 4, 2018 | Author: João Ferreira | Category: Net Beans, Java (Programming Language), Google, World Wide Web, Technology
Report this link


Description

Relatórios • Eclipse • Interfaces gráficas • JGoodies • Struts • AJAXA Revista da Comunidade Java Brasileira AJAX fácil com GWT Usando o Google Web Toolkit para a criação produtiva de aplicações AJAX Google Search API Fazendo pesquisas no Google a partir de suas aplicações Java Edição 38 - Ano V - R$ 9,90 Conversores no Struts Estenda o framework para garantir a conversão e a formatação de dados Datas com Swing GUIs com Qualidade Boas práticas para a criação de interfaces gráficas e uma introdução ao JGoodies Usando componentes para manipulação de datas e calendários em aplicações desktop Eclipse Callisto Conheça o novo projeto do Eclipse.org que simplifica a vida do desenvolvedor Relatórios & Gráficos Usando o Eclipse BIRT para criar relatórios completos no Eclipse, passo a passo jm38.indb 1 Agrupamentos, totalizações e gráficos com JasperReports e iReport 17/7/2006 14:07:33 jm38.indb 2 17/7/2006 14:07:45 Conteúdo EXPLORANDO O CD PRODUTOS ORACLE Passos para instalação do JDeveloper 10g, Oracle Containers for J2EE e Oracle Database Express Edition, incluídos no CD-ROM. Seções 10 CAFEÍNA LEONARDO GALVÃO Aprendendo programação 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 correções ortográficas e obter páginas do cache AJAX FÁCIL COM GOOGLE WEB TOOLKIT DOUGLAS JOSÉ RODRIGUES Conheça as tecnologias e ferramentas do Google que tornam extremamente produtivo o desenvolvimento de aplicações AJAX RELATÓRIOS E GRÁFICOS NO ECLIPSE OSVALDO PINALI DOEDERLEIN Usando o Eclipse BIRT para criar relatórios completos e gráficos comerciais dentro do IDE mais popular do mercado 60 64 22 Capa MAIS RELATÓRIOS PASSO A PASSO ANA ABRANTES E YARA SENGER Definindo agrupamentos, calculando totais em vários níveis e criando gráficos de resumo – com JasperReports e iReport DATAS NO DESKTOP Desktop FERNANDO LOZANO Manipulação de datas em aplicações Swing usando componentes de calendário do projeto NachoCalendar, e conceitos sobre JavaBeans e MVC GUIS COM QUALIDADE, PARTE 1 HUGO VIDAL TEIXEIRA Técnicas e boas práticas para o projeto de interfaces gráficas e implementação com a API JGoodies Forms Eclipse Web CONVERSÃO E FORMATAÇÃO NO STRUTS jm38.indb 3 ARI DIAS NETO Estendendo o framework para definir conversores personalizados e garantir a formatação de números e datas PROJETO CALLISTO FERNANDO LOZANO Detalhes sobre o novo projeto da Fundação Eclipse, que simplifica a instalação de dez plug-ins fundamentais do Eclipse.org 36 12 44 68 56 17/7/2006 14:09:05 Encarte de CDs – Faça como nossos maiores anunciantes. Reprints Editoriais – Se foi publicado na Java Magazine um artigo que possa alavancar as suas vendas. o artigo “10 Mais do Eclipse 3. Esta edição traz dois artigos com enfoque na criação de relatórios. mostrando como criar totalizações.br/anteriores. Nesta edição são mostrados mais detalhes sobre o projeto. consultar o status de assinaturas e conferir a data de envio de suas revistas. com artigos sobre o Google Web Toolkit e a Google Search API. Lançado durante o JavaOne 2006.indb 4 17/7/2006 14:10:00 . Além de conhecer o uso de converters no framework. 907.com. Encarte um CD com uma amostra de seus produtos na Java Magazine e atinja um público segmentado e formador de opinião. Um tutorial completo com diversos exemplos apresenta e explora o Eclipse BIRT.(21) 2577-6362 Atendimento ao leitor A DevMedia possui uma Central de Atendimento on-line.2” colocou na primeira posição o Projeto Callisto. você divulga sua marca ou produto para mais de 100 mil desenvolvedores de todo o Brasil. como características dos JavaBeans e o modelo MVC no Swing.devmedia. Esse movimento continua firme. Yara Senger Arte Diretor de Arte Tarcísio Bannwart (phdesign@phdesign. Através da nossa central também é possível alterar dados cadastrais.br. agrupamentos e gráficos. Ainda no desktop. em mais de 200 cidades. e distribua esse reprint personalizado entre seus clientes. e como fazer a instalação no Eclipse e no NetBeans. Douglas José Rodrigues. São exemplos disso os projetos do JGoodies: há desde look-and-feels bem projetados até soluções completas de binding.br) Diagramação Jaime Peters Junior. o suporte a relatórios em Java se encontrava muito aquém do oferecido em outras plataformas.com. tratando de necessidades comuns em relatórios não-triviais. Grajaú . que também trata de técnicas fundamentais para o projeto de interfaces gráficas.RJ CEP 20563-900. com várias lacunas sendo preenchidas por ferramentas e APIs que não param de melhorar.devmedia. Temos ainda um artigo que explica como estender o Struts. Edições anteriores Adquira as edições anteriores da revista Java Magazine ou de qualquer outra publicação do Grupo DevMedia de forma prática e segura.A. Lais Pancote e Tersis Zonato Ilustrações Felipe Machado e Francisco Peixoto Produção Gerência de Marketing Kaline Dolabella Distribuição Fernando Chinaglia Distribuidora S. As tecnologias do Google aparecem aqui em dose dupla. Julio Faerman. ou se preferir entre em contato conosco através do telefone 21 2283-9012.com. uma importante iniciativa que resolve problemas comuns de instalação e versionamento no Eclipse. onde você pode tirar suas dúvidas sobre serviços.com. além de um popular gerenciador de layouts incluído na API JGoodies Forms.br) Editores-Adjuntos Fernando Lozano (lozano@javamagazine. em www. Solicite nossos Media Kits. Fernando Lozano. Discute também questões importantes no desenvolvimento para o ambiente desktop.br) Osvaldo Doederlein (osvaldo@javamagazine. Mas a tecnologia evoluiu muito. O artigo apresenta detalhes sobre os componentes. e hoje nos deparamos com a situação oposta: há diversas opções de qualidade e até mesmo dificuldade para escolher a melhor alternativa para cada caso. O segundo artigo destacado volta-se ao par de ferramentas iReport/JavaReports. Esta API é o assunto de um artigo sobre criação de GUIs. multiplique essa oportunidade! Solicite a reimpressão da matéria junto com a capa da edição em que saiu. Hugo Vidal Teixeira. o GWT torna possível a criação de aplicações AJAX rapidamente usando código Java. Apoio Boa leitura! Leonardo Galvão Parceiros jm38. enviar críticas e sugestões e falar com um de nossos atendentes. 21 2213-0940 Anúncios – Anunciando nas publicações e nos sites do Grupo DevMedia. Rua Teodoro da Silva. Leonardo Galvão. um conjunto de ferramentas que estende o IDE Eclipse oferecendo uma solução integrada para a criação de gráficos e relatórios.br/central.Esp a Ano V • Edição 38 • 2006 • ISSN 1676-8361 Direção Diretor Editorial Leonardo Galvão Diretor de Marketing Gladstone Matos Diretor Comercial Casseano Filho Edição Publisher e Editor-Chefe Leonardo Galvão (leonardo@javamagazine. Realização A té poucos anos atrás. criando e registrando conversores para processar a entrada de dados e garantir uma formatação apropriada.br) Colaboraram nesta edição Ana Abrantes. com detalhes sobre preços e formatos de anúncios.com. Osvaldo Doederlein. são muito configuráveis e podem dar um toque especial e profissional às suas aplicações desktop. Freqüentemente dizemos aqui que a tecnologia Java está ganhando força no segmento de aplicações desktop. você aprende técnicas que permitem mudar o funcionamento interno do Struts e resolver problemas sutis. Acesse www. que simplificam a entrada de datas. incluindo o processo de instalação e possíveis problemas e soluções.com. você verá como incrementar suas aplicações Swing com os componentes NachoCalendar. Ari Dias Neto. passando gradualmente da teoria à prática. O texto demonstra recursos mais avançados dessas ferramentas. Na edição anterior. Publicidade publicidade@javamagazine. (21) 3879-7766 .com. Já a API de pesquisas do Google permite integrar o maior mecanismo de busca mundial às suas aplicações. alguns IDEs. Servlets e JDBC.net. de forma clara. já traduzida para português (com título "Use a Cabeça").com. e o IntelliJ IDEA (jetbrains. Neste caso. você está pronto para desenvolver praticamente qualquer tipo de aplicação Java.com.com. é citada e usada pelos leitores até hoje e mostra como criar uma aplicação com o NetBeans. alguns portais se destacam.org. Você poderia. JSF.).com/javase/downloads. O próximo passo é conhecer a linguagem e suas APIs. Quanto a livros. Já se seu foco é no Java corporativo (enterprise).com/idea). portanto. java. como o NetBeans. será importante conhecer EJB. já publicamos dezenas de artigos voltados ao desenvolvedor iniciante.com/jbuilder. Porém. vai precisar conhecer o MIDP e suas muitas APIs. como funcionalidades para manipulação de bancos de dados e integração com ferramentas e servidores. inspeção de variáveis e objetos etc.p aço do Leitor Iniciando com Java G ostaria de orientações sobre como iniciar com Java. A versão estável mais atual é a 5.Todo IDE Java inclui pelo menos um editor de código e um depurador visual (para execução passo a passo de programas. mas vale a pena ter o JDK à parte. passando pelo acesso a bancos de dados relacionais e a criação de interfaces gráficas completas. Depois de conhecer a sintaxe da linguagem e as APIs fundamentais. inclusive em português.br/javamagazine. Por onde devo começar? William de Jesus Rende A tecnologia Java tem várias“sub-áreas”. como o JDeveloper da Oracle (oracle. Na Java Magazine. e textos sobre várias tecnologias importantes do Java. mas com restrições). por exemplo. como portaljava. da área em que você pretende se especializar. Com o JDK e um IDE. alguns conhecimentos e ferramentas serão essenciais em todos os casos. O caminho do aprendizado vai depender muito. 26 e 27.0. como Ant e Hibernate.br). A maioria dos IDEs já vem com tudo que é necessário para desenvolver com Java. Você pode passar muito tempo apenas usando o JDK. o JBuilder da Borland (borland. onjava. como java. como Swing. Neste ponto. Há vários sites dedicados a desenvolvedores Java na web. há vários populares. Outra fonte rica de informações são as listas de discussão do grupo de usuários SouJava (cadastrese em soujava. por exemplo. Servlets e AJAX. Em ambos os casos. como GCF. como se vê. abre-se muito o leque de opções de aprendizado. também com versão gratuita. LCDUI e MMAPI.org). valerá a pena dominar ferramentas muito usadas. você já poderá criar aplicações que usam centenas de recursos. exigem que um JDK esteja instalado). a série “Head First Java”da O’Reilly. JMS. JNDI e outras tecnologias do Java Enterprise Edition.com cada uma formando um universo de conhecimentos bastante independente.com e javaranch. Comece fazendo o download do JDK (Java SE Development Kit) em java. A série “Aplicação Java Completa” nas Edições 25. com/software/awdtools/developer/application). prática e inovadora. Em inglês. mas terá mais facilidade de evoluir no aprendizado se tiver instalado também um IDE – um ambiente integrado de desenvolvimento. é excelente para o aprendizado da linguagem. do início ao fim. decidir se especializar em programação web. Somente com o JDK. por exemplo. destacam-se o Eclipse (eclipse. gratuito para uso comercial e incluído no CD desta edição). Entre os open source. JSP. Entre os comerciais.indb 5 5 17/7/2006 14:10:09 . JSP.org) e o NetBeans (netbeans. desde a leitura e escrita de arquivos. sem que o conhecimento de conceitos fundamentais possa passar despercebido e me faltar no futuro. Comece com“Use a Cabeça! Java”(Alta Books).com. o Rational Application Developer da IBM (ibm. que cobre toda a sintaxe do Java e suas principais APIs.sun. Se você pretende desenvolver para celulares. vale a pena conhecer Struts. para executar e testar outras aplicações Java (além disso. e talvez do que o mercado pede em sua região. Edição 38 • Java Magazine jm38. Há uma variedade imensa de IDEs disponíveis. e instalar emuladores para os dispositivos alvo. a operações avançadas de rede.br e devmedia. a decisão por qual caminho seguir dependerá muito mais de suas necessidades. a maioria vem também com um editor visual de interfaces e vários recursos auxiliares que facilitam o desenvolvimento. Temos ainda artigos identificados como “Primeiros Passos” em várias edições.com/technology/products/jdev. fica clara a necessidade de um pool de conexões. pois hoje em dia a grande maioria das aplicações Java que acessam SGBDs diretamente. com um atributo int tipo.br Cartas publicadas podem ser editadas por motivos de clareza ou extensão.apache. Participe! Envie sua dúvida. Vocês podem dar algumas sugestões? Carlos Eduardo Privati A princípio. O DBCP é construído sobre outro projeto do Jakarta. Os artigos sobre JDBC nas edições 25 e 26 (“Persistência Turbinada”) são excelentes. comentário. você precisará se preocupar com pools de conexões (e com outros pools. Se for esse o caso. como os de threads). é concreta. Somente os subtipos concretos como ClienteSimples e ClienteEspecial seriam instanciáveis no segundo exemplo. 6 Java Magazine • Edição 38 jm38. correção ou sugestão. mas para quem é iniciante na tecnologia fica difícil avaliar o melhor caminho. o Commons Pool. utilizam servidores Java EE para o back-end (servidor). Carlos Eduardo Privati Correção na Edição 36 Ao me deparar com um trecho de código na página 22 da Ediçao 36 (artigo “Qualidade Aplicada”). e ajudaram a esclarecer muitas questões.com. há uma linha desta forma: public class Cliente { public abstract void venda(). houve um erro neste trecho de código: Cliente deveria ser abstract.indb 6 17/7/2006 14:10:22 . Existem várias APIs que prometem resolver o problema. } Essa classe não deveria ser abstrata. você pode utilizar o recurso de DataSources. Já a primeira versão da classe Cliente mostrada no artigo. cidade e estado.venda() funcione. para: cartas@javamagazine. dê uma olhada no Jakarta Commons DBCP (jakarta. Em qualquer servidor Java EE. Mas note que isso não impede que a invocação cliente. Osvaldo Doederlein Pools Em aplicações que processam várias requisições ao mesmo tempo e exigem múltiplas conexões com o banco de dados. Somente se não quiser ou não puder usar um servidor Java EE. Quanto a não permitir instanciação. com nome completo. que encapsu- lam conexões ao banco de dados e já incluem o suporte a pools. você não precisaria se preocupar com isso. no código referente à escolha de polimorfismo ao switch. era essa a intenção mesmo. que permite construir tipos de pools adicionais.org/commons/dbcp). desde um produto open source e limitado à web como o Tomcat até um servidor Java EE completo como o JBoss ou Weblogic. se forem construídas segundo um paradigma multicamadas. e por conseqüência ela não poderia ser instanciada? Fábio José Fernandes Realmente.Espaço do Leitor JDBC Quero parabenizar toda a equipe de Java Magazine pelo excelente trabalho de conteúdo e de visual da revista. Edição 38 • Java Magazine jm38.indb 7  17/7/2006 14:10:27 . 1 adiantada. armazenamento de estado e localização/internacionalização. que vão de simples objetos para saída de dados. Este novo release incluirá o dojo. Entre as novidades principais estão recursos para versionamento. até componentes complexos como grades e árvores de navegação. Com isso torna-se autônomo na ASF. sendo cada uma construída a partir de componentes. listas Geronimo 1. widgets. Terá. um container web (que pode ser Tomcat ou Jetty) e outros elementos do Geronimo. de discussão. Advanced Multimedia Supplements (JSR234) e Mobile Internationalization API (JSR238).1 A versão 1. Desenvolvido pelo mesmo criador do Struts. Novo WTK Foi lançado o beta do Sun Wireless Toolkit 2.5 exige um JDK 1. Outra novidade é a distribuição “leve” do servidor. shale. Também são suportadas implementações comerciais do repositório de conteúdo. Entre os destaques está o novo suporte a JSON (JavaScript Object Notation). apache. novas anotações e validações no lado do cliente. Criado por uma empresa suíça. automaticamente fazem o download de dependências e não exigem a reinicialização do servidor.org. Magnolia 3 Graduação do Tapestry Um dos mais populares e maduros sistemas de gerenciamento de conteúdo corporativos (ECM). o Tapestry já está com a versão 4. entre elas Mobile Service Architecture (JSR-248). O Tapestry é voltado à criação de aplicações web dinâmicas em Java. que inclui um subconjunto das funcionalidades do Geronimo. Antes subprojeto do projeto Jakarta.Cafeín a News & Bits Shale é top-level O framework web Shale foi aprovado como um projeto “top-level” da Apache Software Foundation. e inclui por padrão o Apache Jackrabbit (uma implementação open source desta JSR). O WTK 2. Craig McLanahan.apache. Será útil para usuários que não precisam de todas as facilidades do Java EE e desejam consumo menor de memória e processamento. www. Várias novas APIs estão implementadas. em vez de um subprojeto do Apache Struts. Divide as aplicações em conjuntos de páginas. da Nokia. O novo WTK inclui ainda a SNAP Mobile API. este framework web agora tem site próprio e passa a se chamar Apache Tapestry. tapestry. Uma novidade de destaque é o suporte a plug-ins: agora aplicações Geronimo.org. As edições Enterprise e Business Process completam as opções. a Obinary. métodos e propriedades. Há localizações para 15 idiomas. mas não é um servidor Java EE completo. Java Content Repository. autenticação integrada (single sign-on) e uma interface gráfica renovada. oferecendo suporte profissional e funcionalidades adicionais. um framework para desenvolvimento com AJAX. recursos do servidor e produtos integrados podem ser distribuídos como plug-ins. e não com URLs e requisições/respostas HTTP (que são abstraídos do desenvolvedor).5 ou superior. chamada Little-G. e opcionalmente descritores XML. O Magnolia está entre os primeiros a suportar a especificação JSR-170. espaço de repositório e Project Management Committee (PMC). As aplicações lidam com objetos. sendo a Community Edition open source.02. Essa estrutura permite que o framework cuide de tarefas comuns como a construção de URLs. Graphics (JSR-226). assim. suporte a Portlets (JSR168). seu próprio website. o popular kit de ferramentas para desenvolvimento de aplicações Java Micro Edition. geronimo.info. que é a base de boa parte das funcionalidades adicionais. O LittleG vem com um gerenciador de transações. Scalable 2D Vector 8 Java Magazine • Edição 38 jm38.org. Atualmente na versão 4.1 do servidor Java EE da Apache traz melhorias de performance e muitas correções de bugs. o projeto fornece uma interface administrativa baseada na web.0 com muitos novos recursos. A distribuição do projeto inclui mais de 50 componentes.magnolia. O Tapestry se graduou para um projeto “top-level” da Apache. como gráficos de utilização de memória e um wizard para a configuração remota do servidor http. que são fáceis de instalar. No Tapestry o desenvolvedor cria templates em HTML puro e os combina com código Java.1 inclui ainda recursos e visualizações adicionais no console administrativo. o Magnolia chega à versão 3. uma API extensa e bem documentada e taglibs para a criação de templates.indb 8 17/7/2006 14:10:34 . que suporta a criação de jogos multiusuário em rede. O produto tem três edições. o Shale é um framework focado na tecnologia JavaServer Faces (JSF) e está chegando a seu primeiro release estável. A versão 1. Payment API (JSR-229).apache.5 para CLDC. validação de entradas do usuários. o de orientação a objetos e Java. além do novo suporte a stored procedures e um esquema mais simples de carregamento de classes.n a Leonardo Galvão Groovy JSR-6 Está disponível a última versão do Groovy antes do lançamento da primeira versão Release Candidate (RC). Guillaume Laforge. um método sobre o mundo que afeta todos os atores. as alterações estão permitindo aumentar a performance para níveis próximos do desempenho do Java. incluindo – que cria um ambiente gráfico bidimen. O novo am. por a estudantes que estão iniciando a progra. O Greenfoot está em desenvolvimento há mais de dois anos. O site do projeto oferece downloads e a documentação da API. Como mostram os vários exemplos incluídos na distribuição. além de um bom tutorial.org. animações e tro. greenfoot. As mudanças visíveis na versão JSR-6 são Aprendendo OO com Greenfoot O basicamente correções de bugs (incluindo algumas submetidas pela Oracle). mas não open source. estão sendo realizadas mudanças significativas no coração da implementação. o Greenfoot é gratuito. BlueJ. o que atrasou um pouco o lançamento do primeiro RC. bem como algumas outras funcionalidades ainda não documentadas. assim como o BlueJ. mas só recentemente teve liberada sua primeira versão pública. o Greenfoot se baseia em dois conceitos fundamentais: “mundos” e “atores” que são representados por imagens e têm seus comportamentos programados por código Java. verificação de colisões. Segundo o líder do projeto. Podem também ser programados para interagir com o mundo e com outros atores. atores podem ser praticamente qualquer coisa. mas se diferencia por privilegiar um de seus construtores em um menu.org. groovy.indb 9  17/7/2006 14:10:36 .exemplo. do nível colegial. o chamado Meta-Object Protocol.recursos que permitem atuar sobre o mosional altamente flexível para estimular o delo de objetos criado (os atores e mundos aprendizado de técnicas OO. permitindo a criação de simulações sofisticadas e até jogos. IDE voltado ao aprendizado cas de imagens. criar um novo ator escolhendo um mação. Com visual bem cuidado. Em compensação. é direcionado atributos e construtores). Pode-se. biente. tem Greenfoot já vem com editor de código Java. tendo inclusive sido apresentado em congressos. desde pequenos mamíferos australianos até foguetes. e programar rapidamente operações comuns em simulações.são objetos Java comuns com métodos. o usuário pode definir novos atores e mundos. como deslocamento na tela. formigas e rochas. por exemplo fazendo-os se mover ou realizar outras operações mais complexas. Como o BlueJ. mas já bastante extensa. Através de uma API simples. e invocar métodos de atores. Por ser baseado no BlueJ. executar público mais jovem.codehaus. um novo derivado – o Greenfoot depurador e inspetor de objetos.Greenfoot: Criação de simulações e jogos para aprender Java e orientação a objetos Edição 38 • Java Magazine jm38. marque todas as checkboxes.jpr. nela você define as extensões de arquivos que serão associadas ao JDeveloper. Isso conclui a instalação. Responda “No”. clique em “I Accept”. será pedida a senha fornecida no passo anterior. apontando para o diretório principal Para instalar o IDE. Depois de fechá-la. Início da instalação O CD inclui um arquivo Autorun.indb 10 17/7/2006 14:10:42 . Vale a pena selecionar pelo menos a segunda opção: . Para iniciar a instalação. você verá instruções para instalação. que. leia a licença a seguir e. e o Oracle Database 10g Express Edition.exe. uma ferramenta de desenvolvimento completa para a criação de aplicações Java de diversos tipos. sua variável de ambiente JAVA_HOME deve estar definida. Para que seja possível usar os scripts de execução do OC4J. Ao Figura 1.zip. Descompacte o arquivo oc4j1013. para um diretório apropriado (por exemplo c:\Java\jdev). Ao executar o JDeveloper pela primeira vez. que será sempre “10gJ2EE” (para os três produtos). se decidir aceitá-la. Veja o JDeveloper em ação na Figura 3. e o IDE será aberto. 10 Java Magazine • Edição 38 jm38. fará com que a página inicial seja carregada automaticamente (veja a Figura 1). em alguns sistemas. localizado na pasta jdev do CD. o Oracle Containers for J2EE (ou OC4J). Página inicial do CD-ROM. Caso não seja. será mostrada uma caixa de diálogo perguntando se você deseja migrar de uma versão anterior do IDE.htm na raiz do CD. expanda o arquivo jdev1013. É então mostrada outra caixa de diálogo exclusiva para a primeira execução (veja a Figura 2). que detalhamos a seguir. clique no botão “Install Now!”. para uma pasta adequada do disco (exemplo: c:\Java\oc4j). Associação de extensões ao IDE JDeveloper.Explorando o CD .zip. um runtime J2EE que é o coração do Oracle Application Server 10g. você estará com o IDE disponível para criar aplicações Java de diversos tipos. A clássica janela de dicas é a próxima a ser exibida. Figura 2. será mostrada uma senha para instalação. localizado no diretório oc4j do CD. que são especialmente úteis para o desenvolvedor Java: o IDE Java Oracle JDeveloper.inf. simplesmente execute jdeveloper. abra a página index. Ao final da página. uma versão “light” do SGBD da Oracle. OC4J A instalação do OC4J é igualmente simples. Será mostrada uma lista de restrições. O CD encartado nesta edição inclui três produtos completos da Oracle. Para inicializar o JDeveloper (no Windows). JDeveloper 10g descompactar. Na próxima página. Para testar a instalação.Figura 3. A partir do site de administração do Oracle XE. poderá ter havido problemas durante a instalação. Se mesmo assim a página não carregar. causados por programas como o Google Desktop ou sistemas de antivírus. O exemplo mostra o uso dos componentes ADF incluídos com o IDE. selecione a opção “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.html. Na tela de login. Para executar o servidor.0. Para testar a instalação.4. Edição Edição 38 •38Java • Java Magazine Magazine 11 11 jm38. Isso carrega o site de administração do servidor. entre outras operações. Siga os primeiros passos do wizard. Administração do Oracle XE: da navegação de dados à criação de aplicações. A página inicial de administração será exibida (veja a Figura 5). Depois de algum processamento. Forneça o login “system” e a senha definida na instalação. pronto para a instalação de aplicações J2EE. um bom site para analisar outros erros possíveis é orablogs. e depois de mais alguns passos o OC4J já estará em execução. Descompacte o arquivo OracleXE. em um prompt de comandos entre no subdiretório bin e execute o comando oc4j –start. será solicitada uma senha de administrador.exe. e realizar muitas outras tarefas. Forneça a senha (note que ao digitar não serão mostrados caracteres. abra seu navegador web e entre na URL http://localhost:8888/em. nem mesmo asteriscos).zip para algum local do disco e execute OracleXE. defina uma senha para contas de sistema e prossiga com a instalação. forneça a senha de administração criada anteriormente. e criar aplicações para cadastro de dados. Desative esses programas e refaça a instalação. Se a página de administração não for carregada. Acompanhando o desempenho do OC4J no site de administração do produto. O site de administração (veja a Figura 4) permite instalar e desinstalar aplicações Java EE.indb 11 17/7/2006 14:10:43 . Também é preciso definir a variável ORACLE_HOME para o diretório onde o OC4J foi descompactado. visualizar estatísticas de execução.com/sergio/archives/001759.0. verificar o desempenho e investigar web services disponíveis. Oracle Express O Oracle Database 10g Express Edition inclui um instalador convencional (para Windows). Figura 4.1:8080/apex). Figura 5. você pode criar e manipular bases de dados. de um JDK 1. O JDeveloper 10g é especialmente forte no desenvolvimento de aplicações com acesso a banco de dados.2 ou 5. net) para fornecer ao leitor um modelo de como incluir componentes Swi ng exter nos em suas apl icações.sf. E n q u a nt o e s t e a r t igo apre s ent a detalhes específicos da instalação e uso do NachoCalendar. Sobre o NachoCalendar O NachoCalendar é um projeto open source criado em meados de 2004 no SourceForge. um componente que permite selecionar uma data num calendário. Como tem licença LGPL. mas decidimos focar este artigo no NachoCalendar (nachocalendar. pode ser incluído também em aplicações distribuídas sob licenças de software proprietário. Ve j a t a m b é m o quadro “Outras bibliotecas Java para calendários”. usando apenas os componentes padrões inclusos no Java SE. A maioria dos usuários prefere este tipo de interface em vez da caixa de texto formatada oferecida pelo Swing (o componente JFormattedTextField). por isso preferimos o termo “componente”. permitindo criar uma grande quantidade de aplicações com qualidade profissional.Java Livre Datas no Desktop Usando Componentes Swing para Manipular Da O Swing é uma biblioteca de componentes visuais muito rica e poderosa. O termo tecnicamente correto para qualificar componentes como um “date picker” em uma aplicação seria JavaBean. sem que isto exija a permissão dos desenvolvedores e sem obrigar a 12 Java Magazine • Edição 38 jm38. Mas sempre haverá situações em que o desenvolvedor poderá se beneficiar de algum componente adicional. Um caso comum é o de um “date picker”. mas este termo ganhou usos comuns fora do seu sentido original. JavaBeans e POJOs” Existem vários componentes proprietários e livres para a seleção de datas. veja o quadro “Componentes. os quadros que demonstram a integração deste componente com os IDEs NetBeans e Eclipse serão úteis também para o desenvolvedor interessado em outros componentes para aplicações Swing. Para mais detalhes sobre esta questão.indb 12 17/7/2006 14:10:51 . Para evitar que o artigo fique muito longo. • DatePanel – É basicamente o pop-up utilizado pelo DateField. A razão disso é Figura 1. components: • DateField – Permite tanto a digitação de datas quanto a seleção em uma janela pop-up. siga o link “Downloads” e baixe o arquivo nachocalendar. execute a seguinte linha de comando.23-demo.23-demo.23. Edição 38 • Java Magazine jm38. visite nachocalendar.sf.indb 13 13 17/7/2006 14:10:52 . onde %NACHO% deve ser substituído pelo diretório contendo o JAR do NachoCalendar: java -jar %NACHO%\lib\nachocalendar-0. A Figura 1 apresenta a aplicação de demonstração inclusa com o NachoCalendar. com navegação e layout customizáveis. Instalação do NachoCalendar Para obter o NachoCalendar. entretanto.text. como integrá-lo ao NetBeans e Eclipse.pdf.jar Os quadros “NachoCalendar no NetBeans 5” e “NachoCalendar no Eclipse VE” apresentam instruções específicas de instalação e uso para esses IDEs. Por isso pode ser posicionado livremente dentro de uma janela para formar telas de entrada de dados customizadas (como numa agenda de compromissos). com estilo semelhante a um combobox. o arquivo manual-0.p lar Datas e Calendários Saiba como usar o NachoCalendar em aplicações Swing. usando recursos presentes no Java SE. que deve ser adicionado ao classpath de compilação e de execução de qualquer aplicação que utilize os componentes do NachoCalendar.nachocalendar.jar. e conheça conceitos gerais sobre componentes visuais em Java Fernando Lozano abertura do código da aplicação que faz uso do componente. Para executar o programa de demonstração do projeto. No entanto.jar Usuários Linux devem executar o comando: java -jar $NACHO/lib/nachocalendar-0. Então descompacte o ZIP em uma pasta qualquer. Observe que o componente já está “localizado” para o português brasileiro. por meio de java.23.text. Será criado o diretório nachocalendar. Agora veremos um exemplo de uso do NachoCalendar em aplicações Swing.0. zip. Exemplo de seleção de datas A Listagem 1 apresenta um exemplo básico de uso do componente DateField do NachoCalendar. Leitura reco- mendada para os usuários do NachoCalendar e componentes similares.DateFormat e classes relacionadas. Aplicação de demonstração do NachoCalendar: observe no DatePanel que a data atual pode ser indicada por uma elipse vermelha (os retângulos vermelhos indicam os componentes em si). todos no pacote net. e depois passa para o DatePanel. um “QuickStart” para a utilização do componente. Em lib está o arquivo nachocalendar-0. formando uma visão de calendário que exibe diversos meses. e demonstra quase tudo o que é necessário saber sobre ele para utilizá-lo em uma aplicação real.0.net. Assim o artigo inicia apresentando exemplos de uso do DateField. entre outros. São fornecidos três componentes principais.sf. de modo que a maior parte do que se aprende sobre o mais simples é válida também para os mais complexos. mas fornecido como uma subclasse de JPanel. que exibe múltiplos DatePanels simultaneamente.23 que contém.DateFormat do componente por meio do método setDateFormat().23. a parte principal da sua utilização será exatamente igual à do DatePanel. A Edição 22 apresenta. na seção “Primeiros Passos”. • CalendarPanel – Outra subclasse de JPanel. um artigo que detalha todas as APIs de manipulação de datas do Java SE. A documentação JavaDoc pode ser encontrada no subdiretório doc. O exemplo modifica a instância de java. Os três componentes compartilham muitos recursos. não serão apresentados exemplos do CalendarPanel. para depois estudarmos em mais detalhes a arquitetura do NachoCalendar e exemplos adicionais de aplicações. util. “17/05/06”).net/projects/palooka Interação com serviços de calendário.sf.indb 14 17/7/2006 14:10:54 .com/php/datepicker.html • jical. Visualização e Controlador (Model.sf. Apesar de a assinatura dos métodos indicar um Object. Dentro do Swing.sf. Isto não significa que uma aplicação Swing tenha necessariamente que seguir a arquitetura MVC. PIMs e Groupware • k5n.jar (Usuários Linux devem usar o comando export em vez do comando set.net que a configuração padrão do componente exibe anos com apenas dois dígitos (por exemplo. publicada nas Edições 25.co. a classe com a qual normalmente o desenvolvedor interage (e que para ele parece ser o próprio componente) é na verdade o controlador na arquitetura MVC.sf.mac.net • sf. plexos como JList ou JTree. agrupados em categorias de acordo com suas finalidades. mesmo que alguns tenham seus próprios domínios DNS independentes e em alguns casos sites independentes do SourceForge. Para tornar Figura Q1. View. que define os métodos get/setValue() da mesma forma. O motivo disto é tornar o componente um substituto direto para o JFormattedTextField.sf.Date irá gerar uma exceção. mas esta interação se cia (por exemplo) apenas um JButton.util.net • jcal.23.sf. de/hans/java/ tinylaf ). O exemplo também ilustra como inicializar e como recuperar a data editada pelo componente. Veja a série “Uma aplicação completa com o NetBeans”.net • web.Object em vez de um java. por exemplo: set CLASSPATH=%CLASSPATH%. 26 e 27 para mais detalhes sobre como construir uma aplicação Swing na arquitetura MVC.swing.Calendar. JLabel.net APIs alternativas para manipulação de datas e horas • joda-time. enquanto que o formato padrão MEDIUM de DateFormat utiliza quatro dígitos.sf.%NACHO%\lib\nachocalendar-0.com/sebsto/iWeb/projects/JSCalendarSync. todos os componentes visuais seguem a arquitetura MVC. Os métodos getValue() e setValue() são declarados para receber e retornar um java. Uso da arquitetura MVC na arquitetura do próprio Swing. pela qual classes diferentes desempenham o papel de Modelo.uk/mseries • opensource.net • jpim.net • recurrance.php • moonbird. Para compilar e executar o exemplo. e tudo torna necessária em componentes mais comfunciona corretamente. o desenvolvedor não tem necessidade É por isso que a maioria das aplicações instande interagir com o Model. exemplificada pelo componente JButton mais fácil a vida dos 14 Java Magazine • Edição 38 jm38. antes acrescente o JAR com os componentes ao c lasspat h do si stema. A Figura Q1 ilustra o relacionamento entre o componente e as classes auxiliares utilizadas por ele para formar a arquitetura MVC. todo componente Swing Em componentes simples como JButton e instancia um Model e um UI Delegate padrão.Java Livre • Datas no Desktop Outros componentes Java relacionados com calendários A qui apresentamos uma breve relação de outros componentes e bibliotecas livres para Java.sf.us/javacaltools. como o TinyLAF (muntjak. Note que são todos projetos hospedados no SourceForge.net • web. Arquitetura do NachoCalendar O manual do NachoCalendar parece in- Arquitetura MVC no Swing N o Swing.Date ou java.) O resultado da execução do programa pode ser visto na Figura 2.net • icalgrabber.php Componentes web para edição de datas e visualização de calendários • calendartag.ukonline.theotherbell. que podem substituir ou complementar o NachoCalendar. Component UI Delegate Já a interação com Model (Controller) (View) a V iew ( chamada pelo Swing de UI Delegate) em geral javax.sf. Controller). desenvolvedores.util. Componentes Swing para edição de datas e visualização de calendários • microba.lang. nem que o uso do Swing torne uma aplicação automaticamente aderente à arquitetura MVC. passar qualquer coisa diferente de um java.plaf é necessária apenas para desenvolvedores de novos lookButtonModel JButton ButtonUI and-feels.swing javax. Execute o commando Tools|Palette Manager>Swing/AWT Components. o JAR correspondente será especializados para selectionMode e outras proacrescentado automaticamente às propriepriedades que exigem a digitação de código dades do projeto. um ícone contendo um ponto de interrogação. embora pareçam para o IDE JavaBeans independentes. eis uma ótima componentes no Palette. Observe que ele é exibido na área de desenho com seu aspecto real. bastaria empacotar tudo em um plug-in do NetBeans (. “DateField” e “DatePanel”. que fogem aos tipos usuais. 2. no NetBeans. Um primeiro passo seria acrestaque de sintaxe e o auto-completamento centar as classes BeanInfo ao NachoCalendar. ele deverá ser corrigido dentro da própria janela de propriedades. Acrescentar este componente no NetBeans é fácil: 1. Podem também ser criados editores classe visual.nbm) que na sua Se o leitor está interessado em participar instalação já acrescente automaticamente os de um projeto de software livre.x.Usando o NachoCalendar no NetBeans A Figura Q2 mostra uma versão do primeiro exemplo deste artigo sendo construída visualmente no editor Matisse do NetBeans 5. além de editores customizados para propriedades. 4. Todos terão. Só isto No momento que um dos componentes já seria um acréscimo apreciado pelos usuários do NachoCalendar for inserido em qualquer do projeto. Porém não será possível expandir a seta para ver o calendário em tempo desenvolvimento (assim como não seria possível expandir um JComboBox). (As demais classes listadas. como dateFormat ou selectionMode.indb 15 15 17/7/2006 14:10:55 . Havendo algum erro. Basta clicar no botão de reticências ao lado do valor da propriedade. no entanto. Figura Q2. 5. o desoportunidade. Edição 38 • Java Magazine jm38. O motivo é que o NachoCalendar não inclui classes BeanInfo para seus componentes. são na verdade classes auxiliares para os três componentes citados.) 6. e que suas propriedades aparecem na janela de propriedades. Clique em Add from JAR. Por fim. 7. que lista todas as classes JavaBean encontradas no JAR selecionado. Selecione (usando Ctrl+Shift+clique) apenas os componentes “CalendarPanel”. e o resultado será semelhante à Figura Q3. podendo gerar erros de compilação na classe por falta de imports e por outros motivos. pois o trecho de código correspondente não será editável pelo editor de código Figura Q3. Clique em Next para ver as categorias do Palette. de código estarão disponíveis 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 código. Localize e selecione o arquivo nachocalendar-0. Será possível ver imediatamente os novos componentes na categoria Beans do Palette.23. Editando a propriedade dateFormat de um DateField Java do NetBeans. 3. que este código será utilizado exatamente da maneira que foi digitado. Java com suporte à edição visual Swing). 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 código Java.jar. Por outro lado. DateField do NachoCalendar no editor visual do NetBeans 5 Note. Clique em Next para ver a lista de componentes disponíveis (available components). Estas classes seriam responsáveis por fornecer o ícone para uma ferramenta visual. Escolha a categoria “Beans” e clique em Finish. entretanto. Em compensação. o que torna mais simples. depois. por exemplo. como qualquer biblioteca Java. ele não restringe a edição de nenhum bloco de código gerado pelo editor.setShowToday(false). digita-se o início do nome de uma classe ou interface e são exibidas todas as correspondências visíveis para o projeto corrente. Figura Q4. embora ainda não seja tão intuitivo nem eficiente quanto o Matisse do NetBeans.setDateFormat( DateFormat. O VE não fornece uma maneira direta de se acrescentar componentes ao Palette. isto é possível apenas por meio de plug-ins que estendem o próprio VE. Usuários experientes do Eclipse irão preferir cadastrar o NachoCalendar como uma “User Library” nas propriedades do IDE (Figura Q6). conforme o código a seguir: return dateField.indb 16 17/7/2006 14:10:57 . } private DateField getDateField() { if (dateField == null) { dateField = new DateField(). Esta variação do diálogo permite limitar as correspondências a apenas os JavaBeans que estendem alguma classe ou interface definida pelo Swing. Localizando o JavaBean DateField do NachoCalendar no Eclipse VE 16 Java Magazine • Edição 38 jm38. é fornecido o ícone “Choose Bean” ( ). que exibe uma pequena variação de um diálogo bastante conhecido dos usuários do Eclipse (veja a Figura Q5). O VE não fornece nenhum mecanismo que facilite a edição de propriedades como selectMode e dateFormat dos componentes do NachoCalendar. Em compensação. dateField.x/3. DateField do NachoCalendar no editor visual do Eclipse 3.2 Figura Q6. Localizando o componente DateField do NachoCalendar no Eclipse VE de data. } Esta mudança será reconhecida pelo VE e incorporada à área de desenho em poucos segundos. O VE é um editor poderoso e flexível. o que permite encontrar rapidamente o componente desejado. Então é possível.MEDIUM)). Para que isto funcione.1. editar manualmente o método getDateField() para modificar o formato Figura Q5. o JAR do NachoCalendar deve ser adicionado manualmente às propriedades do projeto. Nele. acrescentar a biblioteca a cada projeto que venha a utilizá-la. mostrando que o desenvolvedor não precisa se limitar aos componentes fornecidos com o Palette padrão do VE.Java Livre • Datas no Desktop Usando o NachoCalendar no Eclipse VE A Figura Q4 apresenta o primeiro exemplo deste artigo sendo construído visualmente com o Visual Editor (VE) da Fundação Eclipse. dateField.getDateInstance( DateFormat. public EscolheData() throws Exception { setTitle(“Exemplo do NachoCalendar”). public class EscolheData extends JFrame { private DateField dateField. javax. Figura 2. dateField. new JLabel(“Escolha uma data:”)).indb 17 1 17/7/2006 14:10:59 . em especial quando são utilizadas as extensões de feriados e de tarefas. O cuidado na elaboração do NachoCalendar foi tanto que os componentes padrão são capazes até mesmo de incluir as fases da Lua nas visões de calendário. ao indicar o uso de classes de fábrica para a criação dos componentes.CENTER. após o clique sobre o botão de seta.setPrintMoon(true). Os componentes do NachoCalendar delegam sua renderização para um UI Delegate e o gerenciamento das suas informações para uma classe de Model. java.nachocalendar.setVisible(true). no entanto. mantendo-se a separação de papéis. Execução do exemplo EscolheData. e podem ser utilizados sem se recorrer aos métodos de fábrica.*. net. e também alterar o formato de datas utilizado no DateField. dateField = new DateField(). dateField.parse(“17/05/2006”). do NachoCalendar é demonstrada pelas extensões já inclusas no download padrão.sf.nachocalendar. As classes de fábrica são úteis para reduzir a quantidade de código necessária para a configuração dos componentes.createDateField(). que todos os componentes do NachoCalendar são verdadeiros JavaBeans. • Suporte à exibição diferenciada de dias alocados para tarefas (pense em uma aplicação de gerenciamento de projetos Nos componentes DatePanel e CalendarPanel. veja o quadro “A arquitetura MVC no Swing”. frame.setValue(dia).sf. pack().setDateFormat(df). perfeitamente aderentes à especificação. //dateField.NORTH.DISPOSE_ON_CLOSE). public static void main(String[] args) throws Exception { JFrame frame = new EscolheData(). por exemplo: • Uso integrado a um JTable: net.java. EscolheData.util.DateFieldTableEditor.text.components. } Edição 38 • Java Magazine jm38.awt. Se você não está habituado ao design de componentes desse toolkit. } } getContentPane(). • Exibição de feriados dentro dos calendários: net. que fazem parte do download padrão do NachoCalendar.swing.dicar que o componente foge a especificação JavaBeans. por exemplo: DateField datefield = CalendarFactory. Felizmente este não é o caso com o NachoCalendar.sf. inclusive de faixas descontínuas. java.add(BorderLayout. O fato é. Date dia = df.Date.nachocalendar.*.DEFAULT). A flexibilidade dos componentes Listagem 1.DateFormat. dateField). para todos os componentes. que o desenvolvedor pode estender para fornecer funcionalidades adicionais.BorderLayout. getContentPane(). // será um formato DD/MM/AAAA para o Brasil DateFormat df = DateFormat.holidays. Muitos componentes Swing de terceiros não têm aspecto visual “correto” a não ser que sejam utilizados com o LAF padrão Metal ou o LAF nativo do Windows.java – exemplo básico de uso do DateField do NachoCalendar import import import import import java.table.getDateInstance( DateFormat. setDefaultCloseOperation(JFrame.add(BorderLayout. Também é possível modificar a relação de “dias úteis”.HolidayModel e HolidayRenderer dentro do mesmo pacote. Além disso. O efeito imediato da obediência do NachoCalendar à arquitetura do Swing é a compatibilidade com vários look-and-feels (LAFs) alternativos. como foi mostrado no primeiro exemplo deste artigo. o NachoCalendar é construído segundo boas práticas do Swing. é possível fazer seleções múltiplas de datas. } //.setLenient(false).addChangeListener(dataAlterada).java após a adição de um DayRenderer customizado. //. o único listener que interessa registrar em um DateField é um javax. public ExibeCalendario() throws Exception { setTitle(“Exemplo do NachoCalendar”). Na maioria das vezes. Este listener permite agir no momento em que ocorre uma mudança de data.add(BorderLayout. “A data escolhida foi: “ + dateField.nachocalendar..imports omitidos public class EventosData extends JFrame { private DateField dateField.DISPOSE_ON_CLOSE).sf.add(BorderLayout..DISPOSE_ON_CLOSE).add(BorderLayout.sf.showMessageDialog(EventosData. dateField). Ao Listagem 2. Execução do exemplo ExibeCalendario. já citadas. ExibeCalendario.CENTER. ExibeCalendario. gera eventos específicos (veja as interfaces em net. dateField. dateField.. E exibição de tooltips com a descrição das tarefas associadas ao dia sob o cursor (TaskDataModel e TaskRenderer.. getContentPane(). public EventosData() throws Exception { setTitle(“Exemplo do NachoCalendar”). getContentPane(). datePanel).método main omitido } Figura 3. datePanel = new DatePanel().. seja por digitação direta ou pela escolha no pop-up de calendário.método main omitido } Figura 4.add(BorderLayout. sua API básica é bastante simples. capaz de fazer quase tudo o que se espera de um componente deste tipo. getContentPane(). A Listagem 2 demonstra como capturar getContentPane().event). “Data alterada”. new JLabel(“Calendário Swing”)). pack(). pack().setDateFormat(DateFormat.NORTH. JOptionPane.java após um pequeno aumento no tamanho da janela.nachocalendar. mesmo tempo.task) Como se vê.java – demonstra como responder ao evento de mudança da data armazenada no componente //. EventosData. Listagem 3.swing. Seu uso poderia ser validar dois DateFields de modo que um deles aceite apenas datas que sejam posteriores à fornecida no outro.Java Livre • Datas no Desktop ou em um PIM – Personal Information Manager – como os fornecidos em PDAs e aplicativos de Groupware).indb 18 17/7/2006 14:11:02 . setDefaultCloseOperation(JFrame.getDateInstance(DateFormat. 18 Java Magazine • Edição 38 jm38.CENTER. Eventos de edição e mudança de data Toda a navegação pelo calendário. É fornecida uma API genérica para configuração dos componentes. por exemplo mudar de ano ou de mês. dateField = new DateField()..ChangeListener. new JLabel(“Escolha uma data:”)). } }..getValue(). cujo uso é demonstrado pelas extensões padrão de feriados e tarefas. dateField.MEDIUM))..getDateFormat(). mesmo nas aplicações mais sofisticadas.imports omitidos public class ExibeCalendario extends JFrame { private DatePanel datePanel.java – mostra um calendário para o mês corrente //. no pacote net.this. } private ChangeListener dataAlterada = new ChangeListener() { public void stateChanged(ChangeEvent e) { JOptionPane.INFORMATION_MESSAGE). estamos lidando com um componente bastante poderoso. como veremos em mais detalhes nos exemplos.NORTH. setDefaultCloseOperation(JFrame. que é a data corrente. datePanel. Para se restringir a seleção a uma única data.add(BorderLayout. setDefaultCloseOperation(JFrame.java – como lidar com seleções múltiplas em um DatePanel //. não se pode selecionar múltiplas datas no calendário.MEDIUM). O mesmo modelo da Listagem 4 pode ser utilizado para mudar a fonte e as cores de texto e de fundo. que é o responsável pela exibição de cada célula de mês no calendário. o DatePanel fornece uma forma poderosa de customização que é bem coerente com outros componentes Swing sofisticados. }. por exemplo o JTable. Mas com um DatePanel. que simplesmente exibe um calendário para o mês corrente. O resultado pode ser visto na Figura 4. DefaultDayRenderer dayRenderer = new DefaultDayRenderer(). DateFormat df = DateFormat. por exemplo adicionar uma borda... da mesma forma que se faz com JList e JTables.INFORMATION_MESSAGE). datePanel). //. ExibeCalendario.. Em vez disso..model. } } JOptionPane.CENTER. deve ser chamado o método setSelectionMode () do objeto DateField. Exemplo de exibição de calendário A Listagem 3 apresenta um exemplo de uso do DatePanel. Caso a aparência padrão do calendário não lhe agrade. datePanel = new DatePanel(). existe o net. Color. for (Object d : datas) listaDatas += df.LIGHT_GRAY)). Note que este exemplo é quase igual ao apresentado no início deste artigo. um renderizador deve evitar fixar cores como foi feito no exemplo. Edição 38 • Java Magazine jm38. new JLabel(“Calendário Swing”)). é definida uma interface de renderer (renderizador) para cada parte.DateSelectionModel. Em vez de definir muitas propriedades que alteram o aspecto visual do componente. São fornecidas pelo NachoCalendar várias implementações de DayRenderer. Este método pode receber uma de três constantes definidas na interface net. É possível mudar a aparência do renderizador da mesma forma que se faz com um JLabel padrão. Na verdade.nachocalendar.add(BorderLayout. Listagem 4.setBorder(new MatteBorder(new Insets(1.indb 19 19 17/7/2006 14:11:03 .imports omitidos public class EscolheVariasDatas extends JFrame { private DatePanel datePanel.format(d) + “\n”. } } getContentPane(). public EscolheVariasDatas() throws Exception { //. Seleção de múltiplas datas Com um DateField. “As datas escolhidas foram:\n” + listaDatas. } getContentPane(). é possível selecionar inter- valos de datas utilizando Shift+clique ou então várias datas não-contíguas utilizando Ctrl+clique.setRenderer(dayRenderer). pack(). que tem o efeito de inserir “linhas de grade” no calendário. 1. 1).sf.os eventos de mudança de data por meio do ChangeListener. bem como outros atributos da exibição do calendário. “Datas alteradas”.addChangeListener(dataAlterada). pack().control.SystemColor. e que o calendário será redimensionado proporcionalmente (mas note que o tamanho de fonte utilizado não irá aumentar para compensar o aumento da área do calendário).getDateInstance(DateFormat.imports omitidos public class ExibeCalendario extends JFrame { private DatePanel datePanel.add(BorderLayout. dayRenderer. A Figura 3 ilustra a aparência deste exemplo. datePanel).awt.método main omitido and-feels personalizados.getValues(). que é uma subclasse do JLabel do Swing. Para manter a compatibilidade com look- getContentPane().sf.. A Listagem 4 ilustra como fazer esta customização simples. Experimente ainda alterar o argumento da chamada a setLenient(). por exemplo uma das definidas na classe java. JOptionPane. Observe que a janela pode ser redimensionada.nachocalendar..LIGHT_GRAY poderia ser utilizado SystemColor.DISPOSE_ON_CLOSE). e também ter deixado o DateField com o valor inicial padrão. a configuração padrão de um DatePanel permite seleções múltiplas desse tipo.. após um pequeno aumento da janela. public ExibeCalendario() throws Exception { setTitle(“Exemplo do NachoCalendar”). em especial o DefaultDayRenderer.inicialização do JFrame e do DatePanel omitida datePanel. deve usar preferencialmente alguma cor dependente do ambiente do usuário.DayRenderer.. deve ser fornecido um HeaderRenderer. 1.java – adição de um DayRenderer customizado para exibir “linhas de grade” no calendário //.CENTER.método main omitido Listagem 5. No exemplo. Caso se deseje modificar os cabeçalhos com os dias da semana. fornecendo datas do tipo “30/13/2006”. que é similar ao DayRenderer. Por exemplo.this..NORTH. //.. String listaDatas = “”. A novidade é o tratamento do evento. ou a uma única faixa de datas contíguas.showMessageDialog(EscolheVariasDatas. em vez de Color. private ChangeListener dataAlterada = new ChangeListener() { public void stateChanged(ChangeEvent e) { Object[] datas = datePanel. EscolheVariasDatas.components. permitindo por exemplo construir componentes que devam ser instanciados por métodos de fábrica. o IDE deve recorrer ao uso da introspecção para obter as informações não fornecidas pelo BeanInfo). Usando introspecção 2. então o que seria um componente? Há muitas definições de “componente” no meio de TI.1: “A Java Bean is a reusable software component that can be manipulated visually in a builder tool. de acordo com a especificação. Convenções e introspecção O uso da introspecção em JavaBeans é baseado na obediência a algumas convenções. e tem por objetivo substituir esta classe apenas acrescentando alguma funcionalidade. é comum que vários frameworks. na seção 2. os termos “POJO” e “JavaBean” também costumam ser utilizados como equivalentes. fornecendo uma classe BeanInfo customizada. Mas em Java a maior parte das classes construídas seguindo apenas as “melhores práticas” de desenvolvimento OO se tornam automaticamente JavaBeans. A especificação de JavaBeans define ainda muitos outros recursos que podem ser utilizados por JavaBeans. Componentes. quando comparado com os componentes fornecidos por ambientes RAD não-Java. no entanto. Struts e Spring usem o termo “JavaBean” para indicar uma classe qualquer (um POJO) que obedeça a estas convenções. pois a maioria dos métodos desta interface podem retornar null (nestes casos. quando executado dentro de um ambiente de desenvolvimento. Exibição de feriados Encerrando os exemplos de uso do NachoCalendar. é uma pequena modificação do exemplo na Listagem 4. A Listagem 5 demonstra como lidar com seleções múltiplas de datas. Hoje em dia. propriedades e eventos fornecidos por um JavaBean é fornecendo uma classe que implementa a interface java. Nestes ambientes. além de duas maneiras pelas quais um IDE pode relacionar propriedades. O BeanInfo é a única maneira de se fornecer alguns recursos específicos para o uso em IDEs visuais.indb 20 17/7/2006 14:11:04 . o uso do termo “JavaBean” como sinônimo de “POJO” já pegou e não vai desaparecer tão cedo na comunidade Java. será visto como acrescentar feriados ao DatePanel. por meio de especialização ou implementando a mesma interface. eventos e métodos fornecidos pelo componente: 1. em vez de numa aplicação final. 1 Caso seja configurada uma das duas formas de seleção múltipla. Este design pattern é muito usado em aplicações gráficas para acrescentar algum elemento decorativo por cima de outro elemento. Daí o nome. que pode substituir ou estender a classe BeanInfo do componente original. Um JavaBean seria portanto análogo aos componentes fornecidos por IDEs RAD (Rapid Application Development) como Delphi ou VB. Mas a verdade é que um JavaBean pode ser muito mais do que uma classe comum. portanto em vez de discutir livremente o conceito. Para que seja viável a manipulação de JavaBeans por uma ferramenta. em vez de voltadas a recursos particulares de IDEs. ao ponto de se confundir a obediência a elas como sendo a própria definição de JavaBeans. 20 Java Magazine • Edição 38 jm38. a especificação define conceitos como propriedades e eventos. Além disso. de modo que a construção de um componente é um processo bem diferente do processo de construção de uma classe “comum”. É uma pena. vamos ver o que diz a especificação JavaBeans 1.” Ou seja. limitações da linguagem e da plataforma exigem a construção explícita e trabalhosa de tabelas de propriedades e eventos. BeanInfo A outra forma de se relacionar atributos. por isso neste artigo preferiu-se usar o termo “componente” para se referir a JavaBeans criados para complementar aplicações visuais em Swing. Um JavaBean que fornece seu próprio BeanInfo não é obrigado a seguir as convenções definidas para o uso da introspecção. Estas convenções básicas se tornaram bastante populares. também ajuda a se perder o conceito de JavaBeans como componentes para IDEs visuais. Note que o ChangeListener será chamado várias vezes (uma para cada clique) caso seja utilizado Shift+clique ou Ctrl+clique. como Hibernate. Mas. Então o IDE pode oferecer suporte especializado para um dado componente. O uso de um BeanInfo não acrescenta esforço significativo ao desenvolvimento do componente. configurado pelo IDE. o conjunto de datas selecionadas pode ser obtido chamando o método getValues(). se um “POJO” (Plain Old Java Object) é nada mais do que um objeto/classe Java comum. Usando um BeanInfo. O processo envolve duas etapas: 1. JavaBeans e POJOs F reqüentemente os termos “componente” e “JavaBean” são usados como sinônimos pelos desenvolvedores Java. Esta classe deve ser nomeada acrescentando-se o sufixo “BeanInfo” ao nome do JavaBean. como o uso de um construtor sem argumentos e de métodos de acesso getXxx()/setXxx() para propriedades. E APIs complementares definem recursos como serialização de JavaBeans em formato XML. Fornecer um decorator1 para o DayRenderer. como um ícone para ser exibido na paleta de componentes. ou comportamentos alternativos de um JavaBean. como as bound properties (propriedades que geram eventos sempre que seus valores forem modificados). um JavaBean existe para ser manipulado por um IDE visual. No final das contas. e pode estar tanto no mesmo pacote do JavaBean descrito por ela quando num pacote em separado.BeanInfo. que tantos desenvolvedores de componentes sigam o caminho mais fácil e deixem que o IDE use apenas a introspecção para configurar o suporte aos seus JavaBeans.Java Livre • Datas no Desktop cujos significados são auto-explicativos: • MULTIPLE_INTERVAL_SELECTION • SINGLE_INTERVAL_SELECTION • SINGLE_SELECTION Um decorator é uma classe que imita a interface de outra classe. O recurso de introspecção é uma característica única aos JavaBeans.beans.01. sem restrições adicionais. O IDE também pode fornecer classes BeanInfo para JavaBeans que não incluem seus próprios BeanInfos. que retorna um array de Object. Assim o conceito de JavaBean como componente construído para uso num IDE visual acaba sendo esquecido por muitos. O fato de a maioria dos desenvolvedores estar trabalhando na construção de aplicações focadas em ferramentas como Ant e Maven. com/products/jfc/tsc/articles/ architecture Documento da Sun que descreve a arquitetura do Swing e seu uso da arquitetura MVC. Conclusões Figura 5.org/vep Página oficial do VE (Visual Editor). Além disso. Dentro da comunidade. feriado. feriado. Utilizar um HoliDayModel (definido no mesmo pacote do decorator) em lugar do DayModel padrão.org Site oficial do NetBeans.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. //. Execução do exemplo ExibeFeriados. após a seleção do mês de setembro.) Demonstramos os cenários de uso mais freqüentes dos componentes do NachoCalendar. ora usando Holiday.zip Fernando Lozano ([email protected]. public ExibeFeriados() throws Exception { //. DateFormat df = DateFormat.sf. ExibeFeriados. java.sf. feriado.setModel(model). o NetBeans e o Eclipse.net Site oficial do NachoCalendar.com/developer/onlineTraining/ Beans Tutoriais sobre componentes JavaBeans. model. seria interessante obter os feriados de algum arquivo externo. feriado = new DefaultHoliDay().br/downloads/jm38/ jm-datasdesktop. atua como Conselheiro do LPI Brasil. leitura obrigatória para construtores e usuários de componentes de extensão Swing. java. está sobre o número “7”.java.método main omitido nachocalendar. Atualmente é consultor associado à Neki Technologies (www. Webmaster da FSF e Community Manager do Java.. HoliDay feriado. A Listagem 6 apresenta o código que modifica o exemplo ExibeCalendario para configurar o DatePanel com o renderizador decorado e o modelo customizado.br). como o Carnaval. java. javamagazine. feriado. Vimos ainda algumas boas práticas de projeto e de uso de componentes Swing customizados.setName(“Independência”). com recursos sofisticados para programação visual.addHoliDay(feriado).net.java – exibe um calendário com diferenciação gráfica para os feriados //. java.setName(“Natal”). feriado. e acrescentar dois feriados: Independência do Brasil e Natal.setDate(df.br.com/docs/books/tutorial/uiswing Trilha de construção de interfaces Swing do Java Tutorial da Sun.add(BorderLayout.setRecurrent(true).neki.. eclipse.getDateInstance(DateFormat.indb 21 21 17/7/2006 14:11:13 .holidays.... Edição 38 • Java Magazine jm38.setRenderer(new HolidayDecorator(dayRenderer)).sun.com.com. Este decorator é uma instância de net. ora usando HoliDay. A Figura 5 apresenta o resultado da execução deste último exemplo. (O cursor do mouse.br) trabalha há mais de 10 anos com desenvolvimento de sistemas de informações e integração de redes. que podem fornecer às suas aplicações Swing com manipulação de datas aquele “toque profissional” que faltava.com. www. feriado.. sendo um dos pioneiros do uso do Software Livre no Brasil.sun.parse(“07/09/2006”)). Listagem 6. 2. datePanel.eti. ilustrando um dos feriados definidos.lozano.addHoliDay(feriado). datePanel. e também fornecer um novo HoliDayModel capaz de calcular as datas de feriados flutuantes.configuração do JFrame e do DatePanel omitidas HoliDayModel model = new HoliDayModel().imports omitidos public class ExibeFeriados extends JFrame { private DatePanel datePanel. feriado = new DefaultHoliDay(). Note que o NachoCalendar é inconsistente na nomeação das classes e interfaces do subpacote holidays. datePanel). pack(). netbeans. plug-in que permite programação visual Swing e SWT no IDE Eclipse.com/products/javabeans/ docs/spec.setDate(df.MEDIUM).parse(“25/12/2006”)). } } getContentPane(). model.html Especificação JavaBeans.setRecurrent(true).CENTER.sun. que podem ser resumidos por “imite o design dos componentes Swing padrões”. que não aparece na captura.sun. HolidayDecorator. Em uma aplicação real. mostramos como adicionar componentes adicionais aos IDEs livres mais populares. Byte Code Relatórios e Gráficos c Usando o Business Intelligence and Reporting 22 Java Magazine • Edição 38 jm38.indb 22 17/7/2006 14:11:22 T . como o WTP). utiliza definições produzidas pelo ERD ou WRD.x”. o GEF e o BIRT. que vem com tudo que você precisa. inclusive para a edição visual de relatórios.1. Embora o BIRT e este artigo sejam calcados no Eclipse. E mais recentemente. especialmente devido à sua forte integração com o IDE Eclipse. • O BIRT se integra à arquitetura de ferramentas do Eclipse.: contratos de qualidade de serviço). Com o Eclipse 3. é uma nova opção na categoria “independente.0 (distribuição integrada dos principais projetos do Eclipse. Neste artigo. a softwares independentes como Crystal Reports.2 instalado.org. Mas não é apenas mais um gerador de relatórios. 3. Já encontramos o BIRT na sua versão 2. Na pági na de download do BIRT. seja devido à informatização crescente de atividades.1. o que traz vantagens de produtividade claramente além do possível para outros competidores (mesmo os que possuem plug-ins para IDEs). • ECE (Eclipse Charting Engine) – Gerador de gráficos. De fato. 2. O quadro “O BIRT. o EMF.2 e faz parte do Callisto 1. RCP Report Designer.org). outros geradores de relatórios e open source” discute o status do BIRT como projeto do Eclipse. É interessante destacar algumas conseqüências menos evidentes desta definição: • O BIRT não é simplesmente um "plug-in para o IDE Eclipse".indb 23 23 17/7/2006 14:11:28 . • WRD (Web Based Report Designer) – Equivalente ao ERD. guiando o leitor na construção de relatórios com um tutorial prático. o mercado de ferramentas de software há muito tempo oferece produtos de geração (semi-)automática de relatórios. na Edição 29. Pode-se utilizá-lo sem nenhum IDE. Veja mais sobre esse SGBD em “Demonstrando o Apache Derby”. que é baseado no Eclipse 3. Aceite a licença para os componentes a serem instalados.2): 1.1. Componentes do BIRT Como toda ferramenta de business intelligence. o BIRT tem evoluído a passos largos e já é uma tecnologia madura. especialmente as que fazem acesso a bases de dados corporativas. Instalando Existem quatro maneiras de instalar o BIRT de forma a acompanhar este artigo (utilizaremos o BIRT 2. • ERE (Eclipse Report Engine) – Ge- rador de relatórios. ou SDK).s com Eclipse ng Tools – BIRT Crie passo a passo relatórios e gráficos de vários tipos.2 e GEF 3. de exemplos simples utilizando wizards a soluções sofisticadas baseadas em scripts osvaLdo PInaLI doederLeIn A geração de relatórios é uma necessidade comum a muitas aplicações. Depois clique no botão Select Required para selecionar as dependências necessárias para a operação do BIRT. Apesar de relativamente novo. Os componentes de runtime e design do BIRT são os seguintes: • ERD (Eclipse Report Designer) – Editor visual de definições de relatórios. Basta então baixar o pacote birt-report-framework-2. que acompanha o release do Eclipse 3. incluindo o próprio Eclipse (SDK).2 (Platform + JDT. Começando com o Eclipse 3. clique em Next e depois em Finish.zip e descompactá-lo sobre sua instalação do Eclipse.one”. o volume de dados acumulados pelas empresas só faz crescer a cada ano. com muitos novos acrônimos para aprendermos. Instalação tradicional do Eclipse. instale os plug-ins EMF 2. desde produtos amarrados a SGBDs como o Oracle Reports Developer. O Projeto BIRT O projeto BIRT tem o objetivo de construir ferramentas de Business Intelligence e relatórios. escolha “Callisto Discovery site” e selecione um mirror. vá em Help|Software Updates>Find and Install>Search for new features to install.zip. Dentro da árvore de opções “Callisto Discovery Site”. É a opção para quem quer usar o BIRT sem o Eclipse.1. usando o modelo open source e as tecnologias da Fundação Eclipse. baixe o pacote birt-report-designer-all-in-one-2_1.2 (Eclipse Test and Tools Platform). o que significa que haverá outros plug-ins para Eclipse a se beneficiar do BIRT. Certamente por este motivo. seja por força de legislações ou práticas comerciais que exigem o controle e a armazenagem de cada vez mais informações (ex. e clique em Next. Edição 38 • Java Magazine jm38. e o compara com outros projetos competidores no mundo open source. O BIRT (Business Intelligence and Reporting Tools). projeto da Fundação Eclipse. e examinando os recursos e características desta ferramenta. abra o ramo “Charting and Reporting” e selecione a opção “Eclipse BIRT Report Designer Framework 2. veremos como utilizar o BIRT. opções open source como o JasperReports e iReport para Java. open source e para Java”. Isso se traduz numa demanda cada vez maior por funcionalidades de geração de relatórios. usuários de outros IDEs também podem usar o BIRT. Callisto. também utiliza definições produzidas pelo ERD ou WRD. como já é o caso do TPTP 4. mas com interface web (este componente ainda não está disponível). o BIRT traz sua própria sopa de letrinhas. tarefa que não costuma ser das favoritas de muitos desenvolvedores.2 (também exigidos por vários outros plug-ins. Opção “all-in. 1 A versão embutida da base Classic Models usa o Apache Derby. graças ao RCP Report Designer (veja a seção “Instalando”). O BIRT promete revolucionar o cenário dos relatórios para Java. 4. fabricante.zip. para que estes se diferenciem dos dados. customizando a cor de toda a linha selecionada. e você verá que foi criado um novo grupo de projetos para BIRT. que contém um editor visual de relatórios auto-contido. no Data Set. você pode aceitar as opções default e fechá-lo). Se quiser já praticar este cenário mais realista. login e senha. Sample Database. colunas calculadas. exceto que não existe uma etapa de pré-compilação para . a coluna de resultado Fabricante. Detail (dados) e Footer (rodapé). Este banco de dados de teste é embutido no BIRT1. Num projeto real. Selecione com Shift+clique cada célula de cabeçalho. mas este trabalho teria que ser feito repetidamente para cada novo relatório que utilize o Data Set. que permite cadastrar o driver JDBC para seu SGBD preferido (o driver para o Derby em modo embutido já vem registrado. Use então o Property Editor. antes de tudo. clique com o botão direito sobre o nó Data Sources e selecione New Data Source. por exemplo com o Oracle SQL*Loader. editor de propriedades etc. portanto o próximo passo será disponibilizar esses dados. ex. o que num primeiro momento simplificará o acompanhamento desse tutorial. clique na aba Preview. Forneça o nome carros. No novo projeto. pode-se também digitar os comandos SQL diretamente. ordenados por fabricante e depois por nome. O relatório Como o layout básico do relatório está pronto (usamos um template que já inclui um grid de quatro colunas). Dê um nome à data source.mdb para o Microsoft Access. mostrando nome. 24 Java Magazine • Edição 38 jm38. revelando os manipuladores de linhas e colunas. há uma forma mais fácil: passe o cursor do mouse sobre o Grid para mostrar o manipulador Table (sob o canto inferior esquerdo do Grid). Se você não Figura 1. Uma vez criadas as tabelas. Na mesma view. Já a população de dados iniciais está disponível em vários arquivos-texto (formato CSV). e um arquivo . que contém os scripts para criação e população do mesmo banco de dados “Classic Models”. Definindo um data set a partir de uma query SQL. para cada coluna do resultado. depois clique no da primeira linha (a do cabeçalho). precisamos criar agora um “conjunto de dados” (Data Set). descrição e preço de todos os automóveis cadastrados. clique nele. Um a ú lt i m a etapa essencial é ir na aba Output Columns (ainda no diálogo Edit Data Set) e preencher. Faça o mesmo para as outras três colunas de resultado. você verá o ERD lotado de ferramentas atraentes – editor visual de relatórios. crie a data source com a opção “JDBC Data Source”. Crie o Data Set com o nome “carros” e tipo “SQL Select Query”. O projeto Feita a instalação. PRODUCTDESCRIPTION. Este pacote contém scripts de criação de tabelas e po- 2 Para outros SGBDs. de forma a verificar que a query está correta. você usaria um banco de dados externo. PRODUCTNAME fizer isso. execute o comando File|New>Project. só falta associar nosso Data Set ao layout. baixe o pacote birt-database-2.: “carrosDS”.indb 24 17/7/2006 14:11:29 . Assegure que a consulta seja algo como: select PRODUCTNAME. paleta de elementos. PRODUCTVENDOR. Depois de finalizar o wizard. e arraste-a até a linha Detail na primeira coluna (aparece um diálogo Select Data Binding. que podem ser importados com facilidade em muitos SGBDs.sql de uma destas versões.Byte Code • Relatórios e Gráficos com Eclipse ideal para usuários de outros IDEs. Baixe o arquivo birt-rcp-report-designer-2_1_0.) Tendo o driver configurado.rptdesign é o equivalente aos arquivos . o diálogo Edit Data Set permite customizar detalhes como parâmetros. Depois escolha Classic Models Inc. e também se ter um preview dos dados selecionados. Observe que cada coluna do Grid (na aba Layout) possui as linhas (rows) Header (cabeçalho). Depois veremos como combinar o relatório a um projeto Java. pulação de dados para o Derby e para o MySQL2.: BUYPRICE = “Preço”). é fácil criar as tabelas a partir dos scripts create_classicmodels. Um último retoque é alterar o formato dos cabeçalhos. Será apresentado o diálogo de construção visual de consultas do BIRT (Figura 1).1. Para testar o relatório. Você verá o relatório funcionan- Após a criação inicial do Data Set. BUYPRICE from PRODUCTS order by PRODUCTVENDOR. Selecione. Após a criação do projeto. basta entrar com os dados de URL. ainda poderá digitar as legendas nos cabeçalhos dos relatórios. também conhecida como ERD (Eclipse Report Designer). em Data Sets. Escolha a opção Report Project e forneça um nome para o projeto. A database Classic Models modela uma loja de automóveis.jrxml. use New>Report para criar um relatório. o BIRT apresenta a perspectiva Report Design. por isso não é exigida nenhuma outra configuração.zip (ou mais recente). o arquivo . como queremos usar o mesmo estilo para todas as células do cabeçalho. O diálogo de criação de data sources possui um botão “Manage Drivers”. Mas.rptdesign e na opção de templates escolha Simple Listing. O resultado deverá ser parecido com a Figura 2. o seu Display Name (ex. Os nomes da tabela e das colunas podem ser copiados para a consulta com um duplo clique (ou arrastando para a janela que contém o código SQL). e no Property Editor mude o Background Color. cache e filtros. que corresponde a um resultset ou cursor. Isso cria um projeto “puro” de relatório. Os dados Entre na view Data Explorer. Vamos criar um relatório simples. Mas um relatório.class. 3 Para quem já usou o JasperReports. precisa de dados de entrada. o que estamos vendo é um relatório HTML. escolhendo o Data Set “carrosDS” no combobox. você pode escolher muitas opções de formatação do Data Set e de elementos como eixos. Figura 2. Na última aba. e então acione novamente a aba Preview.. fontes de dados. Por exemplo. O documento pode ser utilizado como entrada para o Report Engine.rptdesign. e selecione Interval = 0. associações entre os dados e o layout.. Mas antes de fazer isso. Você verá algo. está na faixa de preço de 90% dos modelos. Primeiro relatório no BIRT. O arquivo . como na Figura 3. e outros formatos como PDF3. O SVG é teoricamente a opção ideal. de volta ao Edit Chart / Format Chart / Series. forneça o título “Preços Médios por Fabricante”. vamos dar mais um passo fácil. Mude também a opção Aggregate Expression para Average. selecione o componente Chart e clique no relatório. Este documento descreve todos os aspectos do relatório: layout. de forma rápida e intuitiva. então o percentil do preço de X é 90. e “Mediana” (= percentil 50).rptdesign. Este preview é uma janela embutida do navegador web default do Eclipse: assim. com a opção Plot as Value (Y) Series. que é um documento XML (editável diretamente na aba XML Source). ajuste o tamanho e a posição do gráfico no relatório. Há nomes para percentis comuns.indb 25 25 17/7/2006 14:11:31 . Dito isto. a opção mais importante é Output Format.’ (outro botão.. também podemos criar estes gráficos sem nenhuma programação. você deverá associar colunas do Data Set às séries de dados que formam o gráfico. finalmente. no diálogo que se abre. mas no caso de relatórios. Isto fará as legendas do eixo X serem exibidas no sentido vertical. pois o ERE (Eclipse Report Engine) precisa antes ser carregado. temos que embelezar um pouco mais. neste novo diálogo. 5 Em estatística. A primeira versão do nosso relatório está pronta. Isto fará o gráfico ter uma única coluna para cada fabricante (ao invés de várias. como “primeiro quartil” ou Q1 (= percentil 25). Por segurança. Em Chart Area / Chart Title. fundo etc. Vamos fazer somente as configurações essenciais para este gráfico. Em Series / Category (X) Series > Grouping. Select Chart Type.rptdesign isolado só funciona porque a aba Preview do Report Designer invoca o Report Engine. Gráficos de relatórios (ou charts) permitem visualizar massas de dados grandes ou complexas. Comece marcando a opção Select Data Set / Use Data Set. Note que a primeira visualização do preview pode demorar alguns segundos para aparecer. mas o suporte a esse formato ainda está longe de ser universal4). Se não queremos perder nossos clientes. legendas. Veja o final desta etapa na Figura 4. São suportados gráficos bitmap (JPG. Gráficos Diz-se que uma imagem vale por mil palavras. Em seguida faça o mesmo para a coluna Preço. clique no botão Text Format. ou seja. mas o MSIE exige um plug-in da Adobe. selecione Label / Font > ‘. e no menu que aparecerá ative a opção Use as Category (X) Axis. no espaço vazio logo abaixo ou acima do Grid (coloquei acima). e 90% dos modelos têm preço na faixa 0-72.do. A tabela Preview exibirá os dados obtidos do Data Set. Um diálogo New Chart permitirá customizar uma série de opções. No download deste artigo. Na primeira aba. altere o valor Rotation para 90º. Selecione com o botão direito o cabeçalho da coluna Fabricante. escolha JPG ou PNG. Para as legendas. formatação e outros itens ainda não vistos. Na segunda aba.. percentil é uma medida de posição de um valor relativamente aos demais valores do conjunto. que gera relatórios em aplicações web (HTML). desktop (Swing. “por mil números” seria mais apropriado. Layout já associado às colunas de resultado do data set. Em Chart Area / Axis / X-Axis. das quais exploraremos uma seleção. com rótulos numéricos embaralhados (dígitos demais) e uma legenda vazia. Na view Palette. feio. o que será importante para acomodar um número grande de itens. preencha o campo 4 O Mozilla Firefox possui suporte nativo a SVG. o arquivo correspondente a esta etapa é o carros1. o que foi que construímos? O projeto possui apenas o arquivo carros. PNG e BMP) ou vetoriais (SVG). De volta ao designer. marque Enabled. Com o BIRT. Format Chart. que abre o diálogo Edit Font). Select Data. uma por registro do mesmo fabricante). se um modelo X tem preço 72. e apresentar o resultado ao usuário. Uma aplicação real precisaria de um pouco de código para invocar o engine. Figura 3. Edição 38 • Java Magazine jm38. SWT). Até este ponto. para relatórios completos. O BIRT faz o serviço de forma totalmente visual e interativa. agora nosso gráfico está razoavelmente apresentável. fontes. Nosso exemplo será uma aplicação desktop (Swing) que invoca o Report Engine e exibe o relatório produzido numa caixa de diálogo. 26 Java Magazine • Edição 38 jm38.rptdesign. Em Series / Value (Y) Series. ela precisará do runtime do BIRT – o ERE. Instalando o Report Engine Uma vez finalizada sua aplicação. com subdiretórios como plugins. Agora vamos ajustar a exibição dos rótulos numéricos dos valores. conforme a Figura 5. Clique no item Value Data e então acione o pequeno botão 0. No download deste artigo. birt-runtime-2. Pronto. mas como veremos. Você verá uma lista Values. que abre um diálogo de mesmo nome permitindo customizar as legendas do eixo Y. O ERE completo (incluindo o ECE) tem 28 Mb.0#. Você pode remover o subdiretório samples. como o leitor certamente terá verificado a essa altura. na pasta /ChartEngine. e é a única opção de runtime que pode ser utilizada facilmente de maneira semelhante à maioria das bibliotecas Java. e outros aspectos visuais buscando tornar o gráfico (e o relatório) mais compreensível ou bonito. já populada com um item: “Value Data” (pode haver várias legendas para cada item: o valor numérico. basta colocar todos os seus JARs no classpath da sua aplicação.zip. configuration. e até workspace. dessa vez com um gráfico. sua categoria. sendo fornecidas duas versões. possui assustadores 86 Mb. Category (X) Series com “Fabricante”. Fraction Digits = 2. sendo que as configurações que mostramos (e outras que ainda teremos espaço para apresentar neste artigo) são uma fração do total disponível. É Antes de entrarmos em mais detalhes sobre funcionalidades do BIRT. ou o ECE (Eclipse Chart Engine). ou percentil5). que traz outro diálogo (ufa!) para editar a formatação desta legenda.7 Mb. o arquivo correspondente a esta etapa é o carros2. proporções. A estrutura de diretórios e arquivos do ERE é semelhante à do Eclipse. cores. Basta selecionar Data Type = Number (o default). Nossa segunda versão do relatório. Customizando as legendas do eixo Y. não escrevemos uma só linha de código Java.indb 26 17/7/2006 14:11:32 . e Value (Y) Series com “Preço”.Byte Code • Relatórios e Gráficos com Eclipse claro. mas inclui várias versões do ERE e ECE. nome. ainda poderíamos retocar legendas. O custo disso. Configurando um gráfico do relatório. O ECE isolado tem 3. somente para gráficos. Uma aplicação real e completa (ou quase) Figura 4. Isso está mais escondido. vejamos como podemos usá-lo para criar aplicações Java reais. Figura 5. ou seja. que aparecerão no tipo de cada barra. clique em Labels. o BIRT também pode ser utilizado por aplicações web. não significa que o BIRT seja assim tão exigente – veja o quadro “Configurando a memória para o BIRT”. Mas se você observar um OutOfMemoryError. está completa. O download destes runtimes. Standard. é que o designer de relatórios do BIRT é bastante pesado.1. devendo se parecer com o mostrado na Figura 6. A primeira fica na pasta /ReportEngine. birt. na prática. Observe. comece pela página eclipse. o Report Engine não possui uma opção para geração em formato de imagem (java. contudo. Mas este componente.birt.awt. e copie para seu source folder raiz o arquivo carros. O ideal seria encapsular partes repetitivas deste código em métodos utilitários.mas não mais que isso (pelo menos. GIF ou semelhante). Assim. primeiro baixe o birt-report-framework-sdk-2. pois o ERE utiliza a infraestrutura de plug-ins da plataforma Eclipse.war. e também métodos que abrem o design e definem opções de renderização que tendem a ser iguais para todos os relatórios produzidos por uma mesma aplicação.1. conforme a Listagem 1. abra novamente o Edit Data Set. Esta classe utiliza a API do Report Engine. significando que podem sofrer alterações incompatíveis em releases futuros (ainda que. Na database. quase todos os relatórios reais precisam de argumentos que determinam opções como filtros de dados. Outra opção seria usar um PDFRenderContext.chart. e exige que a sua estrutura de diretórios e arquivos seja mantida intacta. Também há uma aplicação web.Image. /WebViewerExample. o argumento do WHERE deve ser um parâmetro dinâmico.eclipse. Somente os gráficos produzidos pelo Chart Engine geram imagens. charts. A documentação estará nos seguintes arquivos: • plugins/org. inicialmente você precisará somente do ERE no subdiretório /ReportEngine. Data type = “String” e Default value = “Classic Cars”.birt. acione New Parameter e preencha os valores: Name = “productLine”.zip • plugins/org. que gera o relatório em formato PDF. mas pode tornar inviável embuti-lo em aplicações desktop com download pela internet. Em seguida. Basta instalá-lo no seu servidor de forma normal. ou então apresentado lançando o visualizador de PDF instalado no sistema (como o Acrobat). Figura 6. Observe que o exemplo gera um relatório em formato HTML. porém.indb 27 2 17/7/2006 14:11:33 . Não dá para apenas “pescar” os JARs e colocá-los no classpath da sua aplicação. Este pacote contém o mesmo framework que orientamos a instalar no Eclipse. vamos modificar o relatório para utilizar parâmetros: além do Data Set. precisamos de um componente JEditorPane do Swing para exibir o relatório. de scripting e de extensão de IDE do BIRT.isv_versão/doc. você poderá explorar a abundante API pública dos engines de relatórios. assim como um arquivo prototype. Vamos criar um filtro para gerar relatórios que consideram apenas produtos de determinado tipo.isv_versão/ doc.doc.zip.doc_versão/doc.war. em Re port Parameters. você poderia ter um ServiceLocator com um método que inicializa o ReportEngine. que todas estas APIs estão documentadas como provisórias. Por exemplo. Edição 38 • Java Magazine jm38.org/birt/ phoenix/deploy/reportEngineAPI. como alternativa à birt.js para funcionalidade AJAX. O código da Listagem 1 funciona e ilustra o assunto discutido.zip Ao extrair estes ZIPs. isto seja raro).php.doc. rptdesign que construímos na seção anterior. não sem ser um expert no BIRT). 6 O runtime do iText pode ser baixado pelo site de update do Callisto. que ilustra o uso do ERE embutido numa aplicação web Java EE. Devem ser baixados à parte. como carros ou motos. mas também não é algo assustador. mas não está disponível num download isolado. o que poderia ser exibido numa aplicação Java através da biblioteca iText6. Na view Data Explorer. Utilizando parâmetros Nesta etapa. Isso cria um parâmetro de entrada do relatório. Para nosso tutorial. que não é trivial. o código-fonte e exemplos. não são incluídos nos runtimes do BIRT.eclipse. que inclui diagramas que explicam a arquitetura geral do runtime e das APIs do BIRT. Relatório com um gráfico (inserido acima do grid). Agora. para implantação em servidores Java EE. Mas antes de enveredar por estes JavaDocs. talvez devido a restrições de licença. veja instruções na página de download do BIRT.zip • plugins/org. Instalando a documentação A documentação do BIRT é imprescindível para se utilizar sua API. Para obtê-la. Criando o projeto Java Crie um novo projeto Java vazio. isso exige um filtro como WHERE productLine = ‘Classic Cars’ para filtrar apenas os carros. crie a classe TesteBIRT.) O tamanho dos runtimes do BIRT não é problema para implantação em servidores.eclipse. mas não é igual ao que você faria (ou deveria fazer) numa aplicação real. mas inclui também a documentação. cujo valor deve ser setado pela aplicação antes de invocar o relatório. A segunda distribuição do ERE é o birt. (Veremos como usar esta opção de deployment mais adiante. . o que abre o diálogo Expression Builder. renderCtx).. ReportEngine engine = new ReportEngine(config).setVisible(true).setImageDirectory(“image”). Porém.destroy(). Agora basta confirmar. seu maior brilho sem dúvida é no suporte a relatórios web. Na aba Query.birt. “birt.”). import import import import import import java. você tem duas opções: instalar no container o birt. com uma estrutura de navegação. crie um parâmetro com Name = “productLine”.setEngineHome(“D:/Java/BIRTRuntime/ReportEngine”). sim.OK_OPTION. null.setRenderOption(options). apesar do nome igual.setBounds(0. adicione à query a cláusula “WHERE productLine = ?”.war.setAppContext(ctxMap). De volta à nossa aplicação.createRunAndRenderTask(design).put(EngineConstants. // Carrega o arquivo de design IReportRunnable design = engine. options.html”). ou integrar ao WAR da sua aplicação os arquivos do Report Engine. task. task.indb 28 17/7/2006 14:11:39 ..out. frame. com os dados de entrada variando de acordo com alguma seleção do usuário ou outra fonte. null. Na aba Preview.swing.rt.setEditable(false). java.io.add(htmlPane). javax.getProperty(“java. Data type = “String” e Direction = “Input”.JEditorPane. Não passamos nenhum valor para o parâmetro productLine do relatório. “Tipo”. Basta alterar a classe TesteBIRT para incluir o código em destaque: . options. public class TesteBIRT { public static void main (String[] args) throws EngineException. os parâmetros do relatório podem ser usados em outros lugares além dos Data Sets.. frame. IOException { // Cria o engine (para simplificar. Por limites de espaço. Os dois conceitos – parâmetros de relatório e de Data Set – são necessários porque um relatório pode ter vários Data Sets.setParameterValue(“productLine”.rptdesign”). depois na categoria ---All---. “Escolha o tipo”.eclipse. O novo código simula uma mini-tela de entrada de parâmetros.APPCONTEXT_HTML_RENDER_CONTEXT. e os parâmetros dos Data Sets podem receber valores de outras origens além de parâmetros do relatório.api.tmpdir”). JFrame frame = new JFrame(). veremos que o gráfico e o grid só exibem os modelos de automóveis.IOException. System.totalMemory() .engine. Runtime rt = Runtime.io. javax.setOutputFormat(“html”). configurada para para HTML IRunAndRenderTask task = engine. mas pode-se come- 28 Java Magazine • Edição 38 jm38. JOptionPane. task.run(). htmlPane.io. O BIRT utiliza um sistema de “parâmetros em cascata”.showInputDialog( null. org. Mas veremos o essencial: como definir um valor para um parâmetro interativamente. frame. config. engine. O ‘?’ é o familiar indicador de parâmetro da API JDBC. como “Planes”. 640. // Gera a saída num arquivo temporário File output = new File(System.Byte Code • Relatórios e Gráficos com Eclipse Listagem 1. com uma caixa de diálogo que permite digitar o valor para o parâmetro. // Cria tarefa de renderização.gc(). 480).openReportDesign(“carros3. como os parâmetros do relatório. null)). 0.getAbsolutePath()). ctxMap.report.rptdesign. java. e finalmente no parâmetro {}productLine.JFrame. Queremos que o valor deste parâmetro da query seja preenchido com o valor passado para o parâmetro productLine do relatório. Agora. digite o valor “Planes” para ver um relatório dos modelos de aviões.. Se executarmos o relatório novamente. Pronto. A segunda opção é bem mais complexa. O resultado é a expressão params[“productLine”] (que você também poderia digitar à mão – o que será geralmente mais rápido após se familiarizar com o BIRT). não podemos construir uma aplicação realmente completa.File.setOutputFileName(output. } } // Exibe o consumo de memória do heap System. Código Java para uma aplicação desktop mínima com o BIRT. task. HTMLRenderOption options = new HTMLRenderOption(). // Cria um componente Swing para exibir o HTML JEditorPane htmlPane = new JEditorPane(“file:///” + output. Na aba Parameters. HashMap ctxMap = new HashMap(). portanto foi usado o valor default “Classic Cars”. task. o caso mais simples e comum é o de relatórios com um único Data Set e uma correspondência um-para-um entre os parâmetros.println(rt. clique em Report Parameters. Uso em aplicações web Ainda que o BIRT dê suporte a aplicações desktop.freeMemory()). usamos path fixo do ERE) EngineConfig config = new EngineConfig(). por exemplo com um combobox “Tipo” preenchido dinamicamente com todos os valores distintos da coluna PRODUCTLINE. São parâmetros diferentes. o cenário mais comum seria termos uma tela de seleção de parâmetros. o arquivo correspondente a esta etapa é o carros3. temos um relatório semelhante ao mínimo que se esperaria de uma aplicação real.HashMap. clique em Default Value (no botão “. Executando a aplicação novamente. Para integrar o Report Engine numa aplicação web. menus e telas de parâmetros para relatórios.. renderCtx.*.getAbsolutePath()). HTMLRenderContext renderCtx = new HTMLRenderContext().swing. clique em Show Report Parameters para experimentar outros valores.util. Para associar um ao outro. mostrado na Figura 7. Para alimentar o parâmetro do data set com o do relatório.setRenderOption(options).getRuntime(). No download deste artigo. . options.setOutputFormat(“html”). JOptionPane. no qual os parâmetros de um Data Set podem ser associados a valores disponíveis ou calculados num escopo mais externo. Colunas calculadas Nossa primeira tarefa é gerar no Data Set uma coluna calculada. Tudo que a aplicação precisa fazer. Figura . digite Column name = “Avaliacao” e Data Type = “string”. parâmetros. é possível utilizar suas APIs Java para customizar a construção e a geração de relatórios ou gráficos de uma forma mais dinâmica do que seria possível somente com documentos .çar mais facilmente copiando o conteúdo do WebViewerExample (prática familiar à cópia do struts-blank por desenvolvedores que usam o framework Struts). podemos ir longe no BIRT só com cliques do mouse. Isso é possível. e os demais parâmetros são as opções para o relatório. Mas como somos programadores de verdade. ou para aplicações que já possuam mecanismos de produção e gerenciamento dinâmico de conteúdo (como ferramentas CMS). como __svg. por exemplo “productLine=Planes”. especialmente aquelas com relatórios contendo scripts complexos que acessam classes Java da aplicação. clique em Avaliable Data Sets / carros / Preço para selecionar a coluna de preço. mas sim o resultado de uma expressão arbitrária (possivelmente envolvendo dados retornados pela query). Para mais detalhes sobre o suporte a scripting do BIRT. O uso do birt.1:52939/viewer/run?__report=E%3A%5 COsvaldo%5Ctestws%5CBIRTJava%5Ccarros4. Para a maioria das aplicações. O BIRT possui um abrangente suporte a scripting. permitindo que muitos recursos avançados sejam implementados com pequenos trechos de código embutido nos documentos . Já os parâmetros do relatório podem ser passados de forma normal.0. o parâmetro report contém o path completo do arquivo de design do relatório. e também para operadores. linguagem que será familiar para muitos desenvolvedores de interfaces gráficas baseadas na web. Então.. vamos terminar de digitar esta expressão à mão: row[“Preço”] >= 50 ? “caro” : “barato” Esta expressão (que é um mini script http://127. cujo valor será “caro” ou “barato”. Por outro lado. consulte: eclipse. No outro extremo. No diálogo Edit Data Set. são opções do viewer.war é bem mais simples e permite o compartilhamento do engine por diversas aplicações. recomenda-se usar o servlet do Report Engine. conforme o preço do modelo. Na primeira linha em branco. abra a aba Computed Columns. O Expression Builder permite criar expressões complexas sem usar o teclado – há botões para cada operador e listas de seleção para as colunas (como a que usamos). funções do JavaScript e do BIRT. veja o quadro “Scripting no BIRT e no Eclipse”. aplicações mais sofisticadas. pode estar no meio. já diziam os antigos. Parâmetros em cascata no Expression Builder. Um duplo-clique irá inserir a expressão row[“Preço”] na área de edição da expressão.rptdesign.org/birt/phoenix/deploy/ viewerUsage. Vimos que a API do BIRT pode ser configurada para gerar relatórios em formato HTML. irão preferir a implantação integrada. Scripting Como vimos. em geral. Assim. descobrirá que o relatório é gerado invocando-se uma URL como: Para mais detalhes sobre o uso do viewer.indb 29 2 17/7/2006 14:11:42 .” para abrir o diálogo Expression Builder. mas tem desvantagens sérias. vamos ilustrá-la com uma seleção de exemplos. como gerenciar estes arquivos: deve-se evitar conflitos com outros arquivos de relatórios produzidos por usuários concorrentes. e os arquivos devem ser deletados após a visualização. gerar o arquivo. após permitir ao usuário selecionar valores para os parâmetros de um relatório. e devolver ao cliente a URL do arquivo gerado. clique o botão “. Parâmetros iniciando por dois sublinhados. uma coluna cujo valor não é uma cópia direta de uma coluna retornada pela query.rptdesign estáticos. que facilita o acesso a estas classes.. esta opção de geração de relatório em arquivo só é boa para tarefas de geração em batch. Com a aplicabilidade dos scripts é muito ampla. Vamos demonstrar isso com uma coluna Avaliacao. Na célula Expression.0. Se você examinar a janela do Preview. entre quaisquer opções extremas. bastando então determinar o nome do arquivo e seu subdiretório de imagens. Mas a virtude.php.rptdesign& __format=html&__svg=false&__designer=true&_ _masterpage=true& __rtl=false&__maxrows=&1486415089 Aqui viewer é o contexto de instalação do Report Engine e run é o nome do servlet de geração de relatórios. É suportada JavaScript. é montar a URL exigida pelo viewer. ou seja. Ou seja. Edição 38 • Java Magazine jm38. Byte Code • Relatórios e Gráficos com Eclipse JavaScript) será executada. a plataforma Eclipse. Não abordamos essa funcionalidade neste artigo. o valor resultante pode ser reusado em vários lugares. o BIRT pode criar extensões desse tipo com facilidade 8. os plug-ins instalados e os recursos gerenciados por estes plug-ins. PRODUCTNAME Este tipo de programação é comum quando são usados geradores de relatórios sem capacidade de scripting. 8 Ou seja. para cada linha do Data Set. Embora a prática mais comum seja derivar todos estes dados de colunas do Data Set. como o Mozilla Rhino. verá que existem scripts por todo lado. PRODUCTVENDOR. os scripts do BIRT não são realmente JavaScript puro. Porém apresenta alguns problemas. isto é.indb 30 17/7/2006 14:11:44 . como baixa portabilidade. verá o diálogo Select Data Binding. A falta dessas facilidades é uma das principais lacunas do Eclipse. ganhando suporte até da plataforma Java SE (ver JSR-223. Observe que. como reusar métodos de alguma biblioteca Java. O BIRT já faz isso para o ROM ( Report Object Model. Mas se definirmos esta expressão no próprio Data Set. A sintaxe “CASE” usada no exemplo é uma extensão SQL de um SGBD específico.: task. Poderíamos. Essa deficiência já vem sendo investigada por projetos na incubadora da Fundação Eclipse (como o EclipseMonkey). já incluída no Mustang. agrupamento e colunas de dados para o eixo X. A solução poderia ser o uso de procedimentos armazenados (que o BIRT também pode invocar para gerar um Data Set). Há anos a comunidade Eclipse vem discutindo a implementação de facilidades de scripting para o Eclipse como um todo. Uma terceira alternativa para gerar valores calculados seria fazer o cálculo na própria query do Data Set. mas como linguagens de scripting são por natureza fáceis de manipular. A Fundação parece ter demorado para levar o assunto a sério. neste diálogo. é associada à expressão dataSetRow[“Preço”]. compatíveis com runtimes de JavaScript padrão. Poderíamos ter criado no Grid a expressão que transforma um preço na string “caro” / “barato”. Boa parte do esforço é a definição de um Object Model (OM) que represente. devido à grande ênfase do Eclipse no desenvolvimento de plug-ins. Ela retorna a soma dos valores da coluna BUYPRICE para todas as linhas (rows) do Data Set. e mesmo essa sintaxe não permitiria implementar cálculos mais complexos (por exemplo. Por exemplo. economiza tanto o esforço de edição do relatório. O BIRT também permite invocar classes Java a partir do relatório. O suporte a scripting não requer somente fazer a interface entre Java e o runtime de alguma linguagem de scripting – problema que a JSR-223 já padroniza e resolve. a coluna Preço Scripting no BIRT e no Eclipse A versão atual do BIRT suporta JavaScript (ECMAScript). O código Java não tem os benefícios do Report Object Model ou de extensões de sintaxe. Versões futuras deverão suportar outras linguagens de scripting para a JVM (como Groovy. Em geral. e na versão 2. Jython etc. possivelmente através da JSR-223. sendo obrigado a utilizar APIs do BIRT. da mesma forma como fize- mos para colunas “reais”. PRODUCTDESCRIPTION. os dados e funcionalidades do elementos do ROM.3. a representação em memória do documento . e sim uma extensão. então. Mas mesmo uma ferramenta poderosa como o PDE não supera a facilidade de escrever scripts. Além disso. O mesmo vale para as opções de valor Y. Sem falar em ferramentas que incluem suporte ad-hoc para scripting. além de projetos externos (como o EclipseShell). Estas APIs priorizam flexibilidade e desempenho sobre a facilidade de uso. mas com menos desempenho. Clicando nesta expressão.com/articles/fog0000000356. como o próprio BIRT. getParameterValue(“productLine”). E vai mais além: é possível escrever scripts com expressões como sum(row. como calcular um Data Set muito complexo (o que pode ser feito em JavaScript. produzindo a coluna “Avaliacao”.rptdesign).1 ainda não são APIs estáveis (com garantia contra mudanças incompatíveis em releases futuros). ( CASE WHEN BUYPRICE >= 50 THEN ‘caro’ ELSE ‘barato’ END) AS AVALIACAO FROM PRODUCTS ORDER BY PRODUCTVENDOR. por exemplo. e a JSR-292). se você selecionar o gráfico e acionar Select Data. De que outra maneira poderíamos ter obtido o mesmo efeito? Se você voltar ao design do Grid (o componente de relatório tabular) e der um duplo-clique na célula de detalhe da coluna Preço. por exemplo: SELECT PRODUCTNAME. o que permite ao script utilizar sintaxes especiais como row[nome] e params[nome] para acessar para automatizar qualquer operação do IDE e de todos os seus plug-ins.). podemos querer exibir esta informação tanto no Grid quanto no gráfico.BUYPRICE). utilizar esta coluna no relatório. Mas agora os scripts estão na moda. mas esta prática também tem seus inconvenientes. de uma forma simples. Agora. veremos novamente (sem muita surpresa) o Expression Builder. qualquer cálculo exigindo um loop). como na Figura 8. ambiente. examinando com novos olhos esta aba do diálogo Edit Chart (Figura 4). Esta sintaxe não é suportada por JavaScript. O Eclipse precisa de um suporte robusto e unificado a scripting. BUYPRICE. Calculá-la uma vez só. escrever código JavaScript arbitrário. o campo Category (X) Series tem o valor row[“Fabricante”] – um script. que permitem inclusive cenários de “programação zero” (macros gerados pela captura de ações do usuário no IDE). compartilhado por todas as ferramentas que possam se beneficiar de scripts. Mas o BIRT faz um pré-processamento que trata estas extensões e gera código JavaScript comum. Se clicarmos na aba Preview Results. no lugar disso. você só utilizará Java no lugar de JavaScript se tiver necessidades especiais de integração. ex. mas é uma opção bem mais complexa. O assunto foi discutido num painel da EclipseCon 2006.html 30 Java Magazine • Edição 38 jm38. transferir colunas 7 Este artigo de Joel Spolsky diz tudo sobre a questão “aparência versus funcionalidade”: joelonsoftware. por ser uma linguagem interpretada). no Data Set. quanto tempo de processamento. e provavelmente será materializado numa solução definitiva no Eclipse 3. para usuários avançados que gostam de automatizar seu trabalho com scripts. ou seja. e suportando várias linguagens. veremos a nova coluna preenchida com valores. Ou de desempenho. onde sum é uma função agregada semelhante à do SQL. pode-se. Figura 8.indb 31 31 17/7/2006 14:11:45 . Edição 38 • Java Magazine jm38.. e no terceiro campo. If following condition is true. Figura . clique no segundo botão “B” (bold). É muito mais eficiente fazer uma query que retorna somente os dados brutos. no segundo combobox (para a seleção de operador) escolha Less than.rptdesign. Pronto. não existe uma opção de passar ao gerador uma coleção de objetos Java. Nunca esqueça que você é pago (principalmente) para fazer suas aplicações parecerem boas!7 Digamos que você queira que as linhas do Grid que exibem os modelos mais baratos sejam exibidas em negrito. como os datasets do JasperReports e do Figura 10. No download deste artigo. De volta ao New Highlight.”. O Report Engine procura oferecer uma GUI que permita fazer tudo com o mouse. selecionando opções predefinidas mesmo na edição de scripts. poderão ignorar esta interface gráfica e digitar as expressões diretamente. No caso do highlight.. Clique em Add. que permite definir regras de destaque. que também aceita uma expressão. Data set com uma coluna calculada por script. Crie a expressão row[“Preço”]. Definição de colunas para o data set de scripted data source. acho mais fácil digitar um único script no primeiro campo – row[“BUYPRICE”] < 50 – e deixar os outros como “Equals to” e “true”. Lá está mais uma vez o Expression builder. Para fazer isso. que conheçam JavaScript e já tenham aprendido palavras-chave como row e params. no grupo Then apply following formatting. para destacar informações importantes. Data sources de script Você já deve ter observado que o BIRT só gera relatórios a partir de algum Data Source. e gerar os valores calculados localmente.calculadas no SGBD consome banda de rede desnecessariamente. selecione o manipulador da linha. Usuários mais experientes. o arquivo correspondente a esta etapa é o carros4. clique o botão “. Editando uma regra de destaque. no primeiro campo. digite 50. basta confirmar e testar novamente o relatório. e vá na aba Property Editor / Highlights. Agora. veja a Figura 9. Customizações de layout Vamos a uma outra necessidade importante de relatórios “caprichados”: modificar dinamicamente a apresentação dos dados. trazendo o diálogo New Highlight. Mas ainda mais poderosa é a opção de scripting.indb 32 17/7/2006 14:11:48 . com o tipo Scripted Data Source e nome “scriptDS”.0. sua configuração é um pouco diferente. você deve ter observado que existem opções de flat files (arquivos CSV – texto com campos separados por vírgula). Entre com o seguinte código. Figura 11. Estas opções são muito interessantes para a integração entre aplicações através de arquivos.01.util. queremos calcular os senos de todos os ângulos entre 0 e 8 radianos (i. que não precisa necessariamente ser uma fonte de dados relacional. Crie um novo Data Source. ambas com o tipo Float. com incrementos de um centésimo de radiano (3. close. Ao criar um Data Source. Veja a Figura 10. usamos uma variável de estado do Data Set. (Utilizamos valores fixos para o ângulo inicial. mas poderíamos facilmente ter criado parâmetros do Data Set para estes valores. angulo e seno. No nosso exemplo. Mas o princípio do BIRT é explorar a generalidade do conceito de Data Source. Mas faz sentido.Byte Code • Relatórios e Gráficos com Eclipse JFreeChart. Pode ser preciso redefinir estes métodos. Você verá que o diálogo Edit Data Set é mais simples que no caso de JDBC: não há query. portanto. final e incremento. Para o método open: x = 0. somente colunas calculadas (na aba Output Columns). Para compreender a programação de um Data Set baseado em script. Na view Data Explorer.) Para fazer isso. Figura 12. beforeOpen.sin(x). beforeClose. o fetch deve também setar os valores de todas as colunas para a próxima linha (se houver).6 graus). por exemplo. Crie um Data Set chamado “senoidal” para este Data Source.Iterator. agora. de 0 e 1. } else return false. listando todos os métodos disponíveis para o script do Data Set. calculado por um script. Você verá um combobox no topo. O método open inicializa o Data Set. a variável x. Data Set totalmente baseado em scripting. ou false se não houver mais linhas. Observe que o diálogo não permite a entrada de expressões para calcular o valor destas colunas. O Scripted Data Source exige o uso de scripts para tudo.. x = x + 0. iniciali- 32 Java Magazine • Edição 38 jm38. na view do . return true. deixe o Data Set senoidal selecionado. estas colunas seriam as do resultset da query ou stored procedures. e XML (que usam expressões XPath para extrair um Data Set tabular de um documento XML qualquer). Chart gerado a partir do data set senoidal.e. pois nosso Data Set não possui colunas de dados “primárias” a partir das quais as colunas calculadas possam ser derivadas (no caso de Data Sets JDBC. Neste exemplo. basta pensar que ele funciona como um java. o que pode parecer estranho.rptdesign (área central). Além disso. row[“seno”] = Math. Crie duas novas colunas.440 graus. você verá que o BIRT permite definir cinco métodos: open. para abrir e depois fechar uma conexão com um sistema externo. e o método fetch retorna true se existir mais uma linha. E para o método fetch: if (x < 8) { row[“angulo”] = x. inclusive para determinar quantas linhas existem. clique na aba Script. afterOpen e afterClose. não precisaremos disso. ou 4 voltas na circunferência trigonométrica). com o código que gera cada nova linha. Na aba Script do editor. ocultar/exibir. o Apache Axis. ou invocar um script (que pode fazer praticamente qualquer coisa). Clique no botão Interactivity. o BIRT carrega (na mesma JVM do Eclipse) não só todo o código do Report Engine. não como uma variável local. Nem é necessário usar o -Xmx . em boa parte. embora este exemplo seja um caso extremo – o script gera o Data Set de forma completamente sintética. bastaria então entrar iguais aos do relatório anterior. por exemplo. Vamos ao nosso exemplo.rptdesign. Este tipo de (Figura 13). Interatividade e ações drill-through Relatórios complexos devem não só exibir dados. pois evita a necessidade de voltar um clique na coluna de um Vendedor dia um menu de relatórios. escolher outra recionasse o usuário à página de cadastro opção e preencher muitos critérios de filtro daquele fabricante. mas creio que a resposta é. queremos como este costuma ser bastante trabalhoso. aciona automaticamente a opção -XX:MaxPermSize=160m. Mas no nosso caso. até o servidor Apache Derby embutido. teclado etc. Por exemplo. mas o tamanho máximo default desta região de memória é insuficiente Este problema não é exclusividade do Eclipse ou do BIRT. mas também permitir ao usuário navegar por esses dados.ini) as opções “-vmargs –mxXXXm” onde XXX é o número de Mb. No carros. O problema é contornado com outra opção do HotSpot: -XX:MaxPermSize=128m. implementar recursos micamente). Finalizamos observando que. ou uma query do Hibernate – ou quem sabe invocar DAOs Java que montam queries JDBC – pode-se usar scripts para acessar tais dados. ao visualizar o relatório de preços por fabricante. e diversos tipos de ações. onde são alocadas classes e strings internalizadas. que abre um dialogo de mesmo nome. No download deste artigo. o arquivo correspondente a esta etapa é o senoide. o Apache Tomcat (usado só para servir o relatório HTML para nente” (PermGen).indb 33 33 17/7/2006 14:11:49 . atualizações do BIRT. No entanto.2 com o BIRT (e outros plug-ins pesados.zada no open. que não apresentam esta limitação.. Isso pode ser feito adicionando ao atalho ou script que inicia o Eclipse (ou ao eclipse. Clique no botão Edit Base imediatamente visualizar um outro relaURL. e após um OutOfMemoryError. lang. clique duas vezes no gráfico. a arquitetura nada leve utilizada pela solução como um todo. incluindo o Mozilla Rhino. o BIRT torna funcionalidades como essas relativamente simples. tem atingido outras aplicações Java peso-pesadas em número de classes. devido à dificuldade de programar qualquer tipo de interatividade envolvendo gráficos – o que exige a geração dinâmica de image maps. Figura 13. Felizmente. e se estiver sendo usado o Data Source de teste “Classic Cars”. que abre o diálogo Hyperlink Options tório de preços por fabricante. adicione esta opção somente se observar erros “java. a “geração perma- para o Eclipse 3. sem ler nenhuma fonte de dados externa – é mais comum que este recurso seja utilizado para ler dados de fontes que não sejam suportadas diretamente pelos Data Sets comuns do BIRT. Edição 38 • Java Magazine jm38. É que o HotSpot possui uma região especial de memória. Quando você ler este artigo.OutOfMemoryError: PermGen space”). Quando você faz um preview do relatório. como o WTP e AJDT). mude para a aba Format Chart e selecione Series / Value (Y) Series. foco. O problema não é do Eclipse (embora haja vários bugs do Eclipse. Veja na Figura 11 o Report Designer durante a edição de scripts.org discutindo o assunto). Existem vários tipos de links.rptdesign. seria ótimo poder clicar na Escolha Type = “Mouse Click” e Action = coluna correspondente a um fabricante e “URL Redirect”. funcionalidade é excelente para o usuário Você poderia. O valor desta variável será preservado entre as invocações de método: funciona como um atributo. se os seus dados exigem fazer uma consulta a um EJB. O método fetch atualiza este x até chegar ao valor máximo. Eclipse SDK e JDK podem ter contornado o problema de forma transparente (na dúvida. Na Figura 12 é mostrado um relatório que podemos construir facilmente (exercício para o leitor!) utilizando este Data Set. e sim da JVM da Sun. que configura o limite máximo da PermGen. esta configuração pode não funcionar. Editando opções de drill-through. volte à aba Layout. destacar. solução é sempre a mesma: o NetBeans 5. e se ainda não tiver chegado. como as da IBM e da BEA. Configurando a memória para o BIRT O Report Designer é um ambiente pesado. calcula as colunas angulo e seno para a linha sendo retornada. querer que final. como exibir uma tooltip. Observe (nos combos Type e Action) que o BIRT suporta vários tipos de eventos de mouse. Por exemplo. Resta perguntar: por que o Eclipse + BIRT utilizam tanta memória para código? A funcionalidade do BIRT é impressionante. mas também o de suas dependências. Outra solução é utilizar JVMs alternativas. mesmo com um tamanho de heap enorme. A o preview!). Já para com sua URI (que pode ser gerada dinao programador. você pode querer aumentar o limite de tamanho do heap da JVM que executa o Eclipse. por exemplo. especialmente em interfaces web. segurança. por exemplo. editor de JasperReports integrado ao Eclipse (que apesar do nome. Este é um mercado que está se expandindo. o IDE. As seguintes tendências recentes são críticas para esta competição: • Integração com IDEs. A arquitetura do BIRT me parece superior à do JasperReports e do JFreeChart (embora esta impressão possa ser viciada pela documentação do BIRT. com tantas opções previamente existentes? Em parte isso parece ser um modus operandi da Fundação Eclipse.org e plug-ins de terceiros. e open source E xistem diversos geradores de relatórios puro-Java. e parar de pagar licenças à Business Objects). de alta qualidade e gratuita). somente os serviços e suporte comercial se diferenciam. sistemas operacionais. tornando-se muito mais competitivo. Talvez esta iniciativa não tenha sucesso – os competidores ainda não estão correndo para implementar compatibilidade com o ROM. incluindo a SWT. tratado nas edições 24 e 25. produto que já suporta dois engines de relatórios: JasperReports e o BIRT.end nestes grupos podem não estar presentes em produtos open source ou gratuitos. Este novo movimento “open source corporativo” inclui outros projetos – qualquer um onde 90% dos desenvolvedores sejam pagos pela mesma empresa.org todo o desenvolvimento do BIRT.0. Mas por que a Actuate tinha que criar geradores de relatórios e de gráficos completamente novos. uma nova modalidade de open source desenvolvido primariamente por grandes empresas. o BIRT já se tornou um dos sucessos da Fundação Eclipse. Uma vantagem do JFreeChart. JDT. deve estar ansiosa para excluir de seus IDEs comerciais o Crystal Reports. que permite customizar gráficos praticamente sem limites – ainda que a um custo de escrever muito código Java. E é difícil não perceber as vantagens: nunca ouvimos falar que uma funcionalidade de um projeto do Eclipse.Byte Code • Relatórios e Gráficos com Eclipse BIRT. suporte total à plataforma JEE (ex. ferramentas visuais e integradas não são mais um luxo – são essenciais.org (JFreeChart e JFreeReport). mas totalmente integrado ao IDE. melhorando continuamente. Um fato interessante é que o BIRT pretende estabelecer um padrão com seu ROM (Report Object Model). criado da mesma maneira pela IBM. imagino. empresa que criou e é a principal contribuinte do BIRT. recursos “enterprise” como relatórios agendados. A vantagem de produtividade de um ambiente não só visual. avalie bem a novidade. o que inclui vários projetos open source famosos (IDEs.) . que procura combinar vantagens de modelos extremos9. Tra- 34 Java Magazine • Edição 38 jm38. A Pentaho oferece seu BI Suite. é um produto comercial e de código fechado). Isso significa capacidades de análise e apresentação de dados mais avançadas. sem ligar para os projetos de IDE Java open source anteriores. É suportado por outros pesos-pesados como a IBM (que. vasta. antes de migrar cegamente de uma tecnologia que você já conhece para outra que ainda não domina. tem uma linha de produtos comerciais de BI. lembrando. alta escalabilidade (clustering e caching). oferece o Actuate BIRT. A Actuate. que. As opções open source mais tradicionais são o JasperReports (gerador de relatórios) e iReport (editor visual de relatórios do JasperReports).indb 34 17/7/2006 14:11:51 . No seu primeiro ano de vida pós-1. a Pentaho “adotou” os projetos do JFree. Também não podemos desprezar a vantagem do BIRT como solução de BI oficial da Fundação Eclipse. BIRT e open source O projeto BIRT já foi criticado pela forma como entrou no mundo open source. As perguntas que podem estar na mente de muitos leitores são: Qual é o melhor? Vale a pena migrar para o BIRT? Passados dois anos. não tem relação com a JasperSoft. ou que a nova versão terá seu release de produção “quando estiver pronta”. empresa estruturada para desenvolvimento e suporte comercial do JasperReports e iReport. Já a Infologic produz o JasperAssistant. Não é só o Eclipse. Nenhum outro IDE gratuito / open source para Java inclui capacidade nem remotamente semelhante. servidores Java EE etc. considerando suas necessidades particulares. Mas recentemente. JasperReports. e é cada vez mais um diferencial competitivo.I. EMF e GEF.: EJB e JCA) etc. OLAP. e também porque facilita a integração do BIRT com outros projetos do Eclise. (Business Intelligence). Por outro lado. O produto é o mesmo.rptdesign e dos objetos do relatório visíveis por scripts e APIs (algo semelhante ao DOM para documentos HTML). empresa do ramo de BI que ainda não tinha presença especificamente no segmento de ferramentas Java. O projeto foi uma iniciativa da Actuate. e sofrendo uma forte “comoditização” das funcionalidades básicas. A Fundação incorpora. portanto. que é formal. outros geradores de relatórios. Com o sucesso de “plataformas de IDE” como o Eclipse e o NetBeans. é a riqueza de recursos e grande flexibilidade de extensão. Mas é importante devido ao esforço por trás do design e documentação desse modelo. seria difícil reutilizar muito código de projetos anteriores. é evidente. Os recursos mais high . o BIRT é obrigado a fazer uso intenso de vários componentes desta plataforma. E sendo um projeto integrado à plataforma Eclipse. mas todos os competidores adotaram a mesma estratégia. iReport e JFreeChart continuam disponíveis. Recomeçar do zero às vezes é bom ou mesmo necessário. e agora também contam com suporte comercial. A JasperSoft. que já começa com o produto básico. e o gerador de gráf icos comerciais JFreeChart. cobertos nesta e na edição anterior. talvez emblematicamente. • Suporte a recursos de B. que devem tornar-se preferenciais. é o modelo dos seus arquivos . oferecendo produtos comerciais mais avançados e/ou serviços e suporte.org não é implementada por “falta de recursos”. O BIRT faz parte da distribuição integrada Callisto. e viu a oportunidade de ganhar este mercado “doando” ao Eclipse. obrigando desenvolvedores de aplicação a implementar mecanismos de cache ad-hoc.TTR Conclusões Este artigo pretendeu dar uma introdução abrangente ao BIRT. Quanto à duplicação de funcionalidades. com mesmos parâmetros. membro individual do Java Community Process (tendo participado do Expert Group da JSR-170: Tiger/J2SE 5. • Recursos de filtro e ordenação (geralmente desnecessários para Data Sets JDBC que podem usar WHERE e ORDER. escolha o tipo Drill-through. O diálogo exibido permitirá selecionar o relatório de destino.duzindo: o BIRT não é só um gerador de relatórios. clique em Add para inserir a nova ação na lista à esquerda. Image e Dynamic Text. É só testar (omitimos somente as instruções para criar o relatório por fabricante. Ambos atingiram as versões “1. a proliferação de projetos open source na mesma categoria não é necessariamente um mal.catb. se a ameaça do BIRT tiver servido para agilizar estas melhorias. O projeto JasperReports também é mantido por uma empresa com interesses comerciais. mas relacionados. isso pode transformar o BIRT (ou pelo menos seu ROM) num padrão de fato. para passar para este parâmetro o valor da coluna Fabricante no contexto de ocorrência do evento – ou seja. bem como várias opções para invocá-lo (como seus parâmetros). Em Values. bookmarks etc. então. quebra de página. eclipse.com. o fabricante associado à barra clicada. E o JasperReports e iReport ganharam integração com a JFreeChart. com agrupamentos. para validar parâmetros. No download deste artigo. 9 Ver bazaar/ www. • Localização/Internacionalização. ou desejar uma solução mais simples e leve (ou mais completa e ambiciosa). tarefa que é bastante complexa e arriscada. que enumeramos aqui para completar uma visão geral das capacidades do BIRT: • Relatórios tabulares (em grids) mais complexos. Os recursos que pudemos explorar neste artigo já cobrem a funcionalidade de relatórios exigida por muitas aplicações. digite a expressão row[“Fabricante”]. O BIRT certamente será uma excelente alternativa para muitas aplicações. • Páginas-mestre.org Projeto Eclipse. Também não tivemos espaço para falar em desempenho. e outras operações.x com quebras arbitrárias e freqüentes de APIs.org/esr/writings/cathedral- invocar outro relatório.org/birt/phoenix/ref Referência do BIRT jasperreports. os arquivos correspondentes a esta etapa são carros5. e trabalha na Visionnaire Informática como arquiteto e desenvolvedor. e mais importante que isso. que aliás oferece produtos proprietários mais avançados.rptdesign de destino). após anos de atualizações 0. O JasperReports e JFreeChart avançaram muito em comparação com a última vez que os utilizei seriamente (há cerca de dois anos).com) é Mestre em Engenharia de Software Orientado a Objetos. mas o enorme volume de recursos deste gerador de relatórios só nos permitiu abordar os itens mais essenciais ou interessantes.0). eclipse. • Libraries.rptdesign (relatório base) e carros5porFabricante. Clique no botão Ok e. e considerando sua facilidade de uso. é uma plataforma. não exijam a repetição de todo o processamento de geração do relatório (especialmente a query ao SGBD).net JasperReports.zip Osvaldo Pinali Doederlein (opinali@gmail. Em qualquer caso. Edição 38 • Java Magazine jm38. Ou ainda. cabeçalhos e rodapés. Está feito. os autores do JFreeChart também criaram o JFreeReport. gerador de relatórios open source javamagazine. O suporte a scripts e eventos do BIRT também pode ser utilizado para implementar ações de drill-down (gerar o mesmo relatório com dados mais filtrados). que permitem reutilizar definições comuns (como datasets e páginas-mestre) entre vários relatórios semelhantes.sf.indb 35 35 17/7/2006 14:11:53 . que faz com que invocações freqüentes aos mesmos relatórios. variando apenas as colunas filtradas e selecionadas). Esta funcionalidade muito importante faz falta em alguns geradores de relatórios. com promessa de estabilidade de API. ter em vista a evolução para um modelo de open source com exploração comercial. mas o BIRT possui uma característica muito importante que é seu cache de relatórios. Selecione o parâmetro productVendor (a coluna Parameters já disponibiliza os parâmetros exigidos pelo . como List. devem ilustrar bem o ciclo de trabalho com o BIRT. • Outros componentes importantes.. Tenha em mente este conjunto total de funcionalidades para comparar o BIRT a outras opções.0”. Ficou faltando falar de muitos outros itens. os desenvolvedores que continuarem preferindo estas outras opções só têm a agradecer. o que é um objetivo perfeitamente legítimo. mas necessários para outros Data Sets). um engine de relatórios simples. que é como é conhecida esta ação de navegar entre relatórios distintos. é baixo o investimento de tempo para aprender o restante de suas funcionalidades.rptdesign (relatório filho).br/downloads/jm38/ jm-birt. pois também há vantagens na diversidade e na competição. índices. e seus pontos fortes (como a facilidade de desenvolvimento) e fracos (como o tamanho do runtime). • Refinamentos de layout: suporte a CSS. E na medida em que esta plataforma atrair o interesse de muitos desenvolvedores de soluções complementares. mas este é parecido com o relatório por tipo de produto. Não se trata necessariamente de falta de colaboração: muitas vezes os líderes destes projetos podem ter motivos técnicos para criar um projeto novo. de volta ao diálogo Interactivity. Não vejo as práticas de desenvolvimento do BIRT como nada de excepcional. • Mapas (tabelas "de/para"). Enfim. como preferir uma arquitetura diferente. concorrendo com o JasperReports. clienteHeader e clienteFooter). publicado na edição anterior. Quando um grupo é criado no JasperReports. como o projeto final. A Figura 2 representa o resultado final desse relatório e o quadro “Como criar o relatório inicial” resume os passos para a criação. está disponível no site da Java Magazine. os templates de relatorio. Neste artigo. 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. O projeto inicial completo. Agrupando pedidos por cliente Repare na Figura 2 que. agrupando todos os pedidos de um cliente e imprimindo somente uma vez os seus dados.jrxml e o script para criação do banco de dados. resultado das alterações feitas neste artigo. itens de pedido. quando um cliente tem diversos pedidos.Mais relatórios Pas s Totalizações e gráficos com iReport e Jaspe N o artigo “Relatórios na Web Passo a Passo”. que lista detalhes dos pedidos de clientes. Os leitores que não acompanharam o artigo na edição anterior poderão obter esse exemplo pronto. Os dados do relatório são obtidos a partir de um banco MySQL. o nome) aparecem repetidos para cada pedido. q ue é ut i l i z ad a p e lo JasperReports para fazer a quebra do gru- 36 Java Magazine • Edição 38 jm38. Tam- bém mostraremos como criar e configurar gráficos no relatório Sobre o projeto de exemplo O projeto utilizado neste artigo permite a execução de um relatório a partir de uma aplicação web. que neste caso são o nome e o valor total do cliente. Será disponibilizado no download tanto o projeto inicial. e o modelo de dados é mostrado na Figura 1. apresentamos o JasperReports e o iReport e mostramos como criar um relatório mestre-detalhe completo. automaticamente são criadas duas novas bandas: nomegrupoHeader e nomegrupoFooter (por exemplo. Colocamos nestas bandas as informações associadas ao grupo. Ele é baseado em quatro entidades principais: pedidos. Vamos melhorar o relatório. com todas as classes necessárias. vamos incrementar esse relatório inicial definindo grupos e acrescentando diversas totalizações. já os dados de cada item do grupo permanecem na banda detail (são eles os pedidos e os itens de pedido do cliente). e partir dele para realizar as mudanças detalhadas aqui. Precisamos definir um grupo para fazer quebra de pedidos por cliente. os dados do cliente (no caso. clientes e produtos.indb 36 17/7/2006 14:11:58 r . s so a Passo e Aprenda a definir agrupamentos e calcular totais em vários níveis, num relatório mestredetalhe, e como criar gráficos 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 também esteja ordenada corretamente, ou seja, a consulta SQL deve ter a cláusula “order by” (ou se for usado um datasource de JavaBeans, deve-se passar uma coleção com os objetos já ordenados de forma compatível com os grupos desejados, neste caso o nome do cliente). Pode haver vários grupos “aninhados”; por exemplo um grupo Região, que engloba todos os clientes de uma determinada região; dentro deste um grupo Estado, e assim por diante. Quando o grupo mais “externo” for reinicializado, todos os grupos contidos nele também o serão. Os passos para a criação do grupo são os seguintes: 1. No iReport, abra o arquivo do relatório, 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 descrição “Cliente”. Este texto não será mais necessário, 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 cláusula “order by c.nome”. Desta forma, à medida que o JasperReports Como criar o relatório inicial S iga estes passos para criar os relatórios 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 relatório chamado “RelatorioPedidos”; 4. Defina a conexão de dados a ser usada; 5. Configure a consulta do relatório 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 serão 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 relatório fique com a aparência da primeira imagem da Figura 2; 8. Crie os parâmetros subReport do tipo net.sf.jasperreports.engine.JasperReport para serem passados o arquivo do sub-relatório e pageRoot do tipo java.lang.String para o caminho do projeto quer será usado na localização 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 parâmetro de nome numeroPedido com Default value expression igual a $F{numeroPedido}; 10. Crie um novo relatório chamado Rela- torioItens; 11. O relatório não deve ter margens, e somente as bandas columnHeader e detail serão usadas; as demais devem ser desativadas zerando sua band height; 12. Configure a consulta deste relatório 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 relatório fique com a aparência da segunda imagem da Figura 2; 11. Crie o parâmetro numeroPedido do tipo java.lang.Integer; 12. Ao executar, o relatório ficará como mostrado ao final da Figura 2. Edição 38 • Java Magazine jm38.indb 37 37 17/7/2006 14:11:59 Mais relatórios 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 estão no subrelatório RelatorioItens.jrxml, RelatorioPedidos.jrxml vamos declarar uma variável e exibí-la neste relatório. 1. Abra o RelatorioItens. jrxml, RelatorioItens.jrxml 2 . Cl ique em Visualizar |Variáveis, e depois no botão Novo. 3. Configure uma nova variável fazendo seu atributo name igual a total e Calculation Type = Sum. Mude o tipo da variável (campo Variable class Type) para java.lang. Double. Indique também que a variável deve ser reinicializada sempre que o relatório for executado, configurando ResetType para Report. 4. Ainda falta especificar como a variável total será calculada, ou seja, definir a soma dos valores de cada item do pedido. Para isso, utilizamos o campo Variable expression da variável, fornecendo uma expressão (que deve necessariamente ser do tipo Double, devido à configuração feita no passo anterior). Figura 2. Relatório e sub-relatório iniciais (como criados na edição anterior), e resultado da execução do relatório 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 são itens que pertencem ao ses campos para o tipo primitivo double, mesmo grupo: uma mudança no valor de realizar a multiplicação e armazenar o nomeCliente indicará o início de um novo resultado em um objeto java.lang.Double, ou agrupamento. Vá em Data|Consultas do seja, a expressão ficará assim: Relatório|Report Query e altere a consulta new Double ($F{quantidade}.doubleValue() SQL acrescentando o nome do cliente na *$F{preco}.doubleValue()) cláusula order by: 5. A variável 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 execução do relatório. Feito isso, vamos mostrar o valor obti- do na variável total, após listar todos os itens: 1. Vá em Editar|Propriedades do Relatório 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 Relatório e altere na banda columnFooter a sua band height para 20; clique no botão 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 término da execução do relatório (no caso, o sub-relatório que contém todos os itens do pedido). Para que a variável total seja apresentada com formato de moeda, vamos utilizar o formatador obtido através do método getCurrencyInstance() da classe java.text.NumberFormat, com a seguinte expressão 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 expressão; o JasperReports é capaz de encontrar sozinho a classe no Java SE. Veja na Figura 6 como ficam o layout e o resultado da execução. Total por cliente Nosso próximo objetivo é apresentar o Figura 3. Tela de configuração do grupo de quebra de pedidos por cliente. 38 Java Magazine • Edição 38 jm38.indb 38 17/7/2006 14:12:01 RelatorioPedidos.jrxml Figura 4. Relatório depois de da criação do grupo cliente. Figura 5.Tela de configuração da variável que totaliza o valor de um pedido. valor total dos pedidos de cada cliente. Primeiro será necessário criar uma variável totalCliente no relatório principal, RelatorioPedidos.jrxml. Siga estes passos: 1. Crie uma variável com campo name = totalCliente. 2. Configure o tipo da variável (Variable Class type) para java.lang.Double (pois o total dos pedidos é desse tipo). 3. Faça Calculation type = System: não queremos que o JasperReports faça nenhum tipo de cálculo, mas sim que receba o valor retornado pelo sub-relatório (explicaremos isso a seguir). 4. É necessário também fazer que a variável 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 relatório na Figura 7. Como o valor total de cada pedido está sendo calculado no sub-relatório RelatorioItens.jrxml, através de sua variável total, vamos usar este valor para incrementar a variável totalCliente no relatório principal, RelatorioPedidos.jrxml, enquanto estiver sendo processado o mesmo cliente (na geração do relatório). Para fazer esta ligação entre as variáveis, criamos um parâmetro de retorno no elemento subreport no RelatorioPedidos.jrxml, do seguinte modo: 1. No relatório 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 botão Add e digite o nome da variável do sub-relatório (Subreport variable) que contém o valor que queremos somar, neste caso a variável total. 3. Indique o nome da variável que deve estar definida no relatório principal onde a totalização será armazenada (Local destination variable), ou seja, totalCliente. 4. Indique também que o cálculo representa uma soma: Calculation type igual a Sum. Esta configuração 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 relatório e o resultado da execução na Figura 9. Total geral O próximo passo é apresentar o valor total dos pedidos de todo o relatório. Novamente usaremos a variável com o valor total de cada pedido (no sub-relatório) e teremos de criar uma variável no relatório RelatorioPedidos.jrxml para armazenar o total geral, da mesma forma que foi feito com a variável 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 variável com campo name igual a totalGeral. 2. Configure o tipo da variável (Variable Class type) para java.lang.Double. 3. Defina Calculation type = System. 4. A variável deve ser reinicializada sempre que o relatório é executado; então altere o campo Reset type para Report. Veja o resultado na Figura 10. A seguir, é preciso configurar em RelatorioPedidos.jrxml mais um parâmetro de retorno no elemento subreport, para que o valor da variável total do sub-rela- Falta apenas exibir a variável 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 faça 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. Relatório com total por pedido. guinte forma: Edição 38 • Java Magazine jm38.indb 39 39 17/7/2006 14:12:02 e é possível ter vários subdatasets num mesmo relatório. Ao ser definida a consulta. da seguinte maneira: “Total Geral: “ + java. os campos retornados serão automaticamente declarados no subdataset. Precisamos que os valores sejam agrupados pelo cliente. na banda summary. 3. que neste caso viria de um dos campos do datasource principal). Coloque na banda summary um textfield com Evaluation time = Report. novamente utilizando o formatador de moedas.format($V{totalGeral}. O conceito é muito parecido com o de um subreport. Isso habilita os demais botões da janela.org/ tório: jfreechart). ponível na barra de ferramentas do iReport. Relatório com total por cliente. Vá até Editar|Subdatasets e clique em New.preco) as totalCliente FROM pedidos_itens it JOIN pedidos ped ON ped.”br”)). Gráfico de vendas por cliente SELECT c. Indique o nome da variável que deve estar definida no relatório principal onde a totalização será armazenada (Local destination variable).id = it. Indique também que o cálculo representa uma soma. secundária para um gráfico. Por isso iremos usar um subdataset. é necessário criar uma consulta SQL diferente da definida no relatório principal. Faça o seguinte: 1. e insira a seguinte consulta SQL: Figura 10. 40 Java Magazine • Edição 38 jm38. isso faz com que o textfield seja avaliado ao final da geração do relatório. O elemento de gráfico através de um elemento de relatório que Já podemos incluir o gráfico no relausa a biblioteca JFreeChart (jfree. Veja essas configurações na Figura 11. Configure a Textfield expression de modo que o valor seja apresentado como moeda. Como exemplo. No relatório principal RelatorioPedidos. Subdatasets têm seus próprios parâmetros.quantidade * pro.numero = it. Subdataset Figura 7. Este elemento também está dis1. Clique em Create. SUM(it.id GROUP BY c. e permite a configuração de um subconjunto das propriedades visuais suportadas pelo JFreeChart. e podem ter também uma consulta SQL executada (ou um outro datasource.Tela de configuração da variável que totaliza o valor de pedidos por cliente. ou seja.NumberFormat. 2. 3. 2. Configuração de parâmetro de retorno do subreport.id_cliente = c.indb 40 17/7/2006 14:12:03 . 4.nome as nomeCliente. Para criar o subdataset: 1. Clique em Query.text.getCurrencyInstance( new Locale(“pt”. jrxml.id_produto JOIN clientes c ON ped.jrxml cliente no final do relatório Relatorio­Pedidos. Vá em Visualizar|Bandas do Relatório. Tela de configuração da variável de total geral. clique na aba Subreport (Other) e dentro dela selecione a aba Subreport return values. Figura 8. fazendo Calculation type = Sum. Clique no botão Add e digite o nome da variável do sub-relatório (Subreport variable) que contém o valor a ser somado: total. 2. O JasperReports tem suporte a gráficos.Mais relatórios Passo a Passo tório também seja passado para a variável totalGeral do relatório principal.doubleValue()) Veja na Figura 12 como ficam o layout e o resultado da execução. ou seja. a variável totalGeral. abra a janela de propriedades do elemento subreport.jrxml. Resta apenas exibir a variável totalGeral no final do relatório: 1.nome Depois clique em OK para salvar as alterações. Um subdataset é um elemento do JasperReports usado para fornecer uma fonte de dados Figura 9.numero_pedido JOIN produtos pro ON pro. vamos acrescentar um gráfico de barras que mostra o valor total consumido por cada cliente em todos os pedidos realizados por esse RelatorioPedidos. variáveis e fields. parâmetros e variáveis do relatório principal não estarão disponíveis.jrxml Figura 12. Selecione Show labels. Figura 14. Clique na aba Connection/Datasource exp e selecione Use connection expression. e ajuste suas dimensões para que ocupe a maior parte possível da banda. selecione Sumário a cada nova página (que deveria ter sido traduzido como “Sumário numa nova página”). Em seguida. 3.Figura 11. Altere o campo Chart title expression para “Valores por Cliente”. Isso faz com que o iReport utilize a mesma conexão do relatório. o que vai ajudar na leitura dos nomes dos clientes. na aba More. É importante observar que ao utilizar um subdataset. Altere Value axis label expression para “valores”. Vamos então vincular o gráfico ao subdataset seguindo os seguintes passos: 1. escolha o gráfico de barras. Veja na Figura 14 como ficará o layout. Clique com o botão direito sobre o gráfico e selecione Chart properties. Faça Orientation = Horizontal. Clique na aba Chart data desta mesma janela de propriedades do gráfico para configurar a fonte de dados do gráfico. Figura 17.Configuração dos campos do subdataset usados pelo gráfico. aumente a altura da banda summary para 385 e clique em Apply. Layout do relatório com o gráfico já inserido. temos que indicar os dados a serem exibidos. selecione o subdataset que criamos no combobox Subdataset. Esses dados estão definidos no subdataset criado anteriormente. Vá em Editar|Propriedades do Relatório e. Figura 15. 2. Porém. Configuração de parâmetro de retorno do subreport. Tela de criação e edição de um subdataset. Relatório com total geral. que é a descrição a ser mostrada no eixo dos valores. 4. Na caixa Dataset run da aba Dataset. os campos. para que apareçam os valores correspondentes a cada uma das barras. 3. somente os campos. Agora vamos configurar o gráfico: 1. 2. 2. Edição 38 • Java Magazine jm38. 3. Faça Category axis label expression = “cliente”. esta é a descrição que aparecerá no eixo em que ficam os nomes dos clientes. Figura 16.Configuração da fonte de dados do subdataset do gráfico. Figura 13. RelatorioPedidos. 6.Tela de configuração das propriedades de um gráfico. parâmetros e variáveis definidos no subdataset estarão disponíveis para o gráfico.indb 41 41 17/7/2006 14:12:04 . este valor será exibido no título do gráfico. Veja na Figura 15 as configurações realizadas. adicione um elemento de gráfico . Após configurar visualmente o gráfico. 5. para isso criamos um arquivo build.net Site da biblioteca JasperReports.Última página do relatório gerado.sf. jasperreports. selecione a aba Details e depois clique no botão Add. O relatório e o gráfico já podem ser compilados e executados conforme instruções do quadro “Como executar o relatório”. chegamos ao final deste tutorial. e o relatório será gerado. Conclusões Neste tutorial mostramos como fazer agrupamentos e totalizações e como criar gráficos. se for o caso. Mas o JasperReports já está integrado o suficiente ao JFreeChart. Vimos também como definir variáveis e a importância de indicar o tipo de cálculo e de reinicialização adequados para cada tipo de variável. O uso de variáveis é de extrema utilidade e dificilmente teremos relatórios mais elaborados sem a sua utilização. Yara M. digite ant javac. jfree. SCJP e SCWCD.com. Faça Series expression igual a “valores” (o nome da série). Por fim. em um relatório mestre-detalhe.org/jfreechart JFreechart. • web para os arquivos JSP. comando no Windows ou terminal no Linux. Depois devemos compilar a classe do servlet. Com isso. Figura 18. inicie o Tomcat. temos os seguintes subdiretórios: • reports para os arquivos .br) é desenvolvedora Java na Globalcode. 42 Java Magazine • Edição 38 jm38. copie o WAR para a pasta webapps do Tomcat. Veja a Figura 17.war. vá até o diretório do projeto e digite: ant compile. e percebemos que este é um recurso que ainda tem algumas limitações de configuração no JasperReports.xml que está no diretório raiz do projeto inicial (incluído nos downloads deste artigo). para incluir uma Category series: 1. g e r a m o s o a r q u i v o ecommerce. 3 . novidades etc. H.xml. SCJP e SCWCD).Mais relatórios Passo a Passo Como executar o relatório declarando automaticamente a expressão $ P {REPORT_ CON NECTION}. possui as certificações SCJA. também o grupo) é essencial para se obter o resultado desejado. Veja a Figura 16.abrantes@globalcode. Clique no link que aparece na tela. P a r a f i n a l i z a r. O momento de avaliação Vamos usar o Ant para efetuar algumas operações. Vá ao prompt de comando e digite: ant war. também com downloads.indb 42 17/7/2006 14:12:10 . • web/WEB-INF para o web. abra o seu navegador web e digite a seguinte URL: http://localhost:8080/ecommerce. Primeiro precisamos compilar os dois templates de relatório.br/downloads/jm38/ jm-maisrelatorios. com gráfico inserido. co-autora do curso de JasperReports/iReport e possui algumas certificações em Java (SCJA. a ponto de nos oferecer um resultado satisfatório com facilidade. biblioteca usada para a criação de gráficos no JasperReports/iReport javamagazine.com. ireport. criadora e coordenadora de diversos cursos das carreiras Academia do Java e Academia do Web Developer.jrxml.zip Ana Abrantes (ana. fóruns e mais. É formada pela FATEC-SP e atua na área de informática há mais de 15 anos. Veja como fica o gráfico após a execução do relatório na Figura 18.net Site da ferramenta iReport. Feito isso.br) é formada em Ciências da Computação na USP em São Carlos. D entro do diretório do projeto.sf. • src para as classes Java. que fará a execução do relatório. Atualmente é Instrutora e Diretora Educacional da Globalcode. esta é a expressão que será avaliada para obter os nomes mostrados no eixo de categorias. M u d e Va l u e e x p r e s s i o n p a r a $F{totalCliente}. documentação.com. Senger (yara@globalcode. Abra uma janela de prompt de do textfield que utiliza uma variável (e. Em seguida. • web/WEB-INF/lib para os arquivos JAR necessários. onde se pode encontrar downloads do software. que também utiliza totais. Altere Categor y expression para $F{nomeCliente}. 2 . Na mesma janela de prompt. especialista em desenvolvimento web. Vimos ainda como criar um gráfico simples. que é a expressão a ser avaliada para obter os valores exibidos no eixo de valores. indb 43 43 17/7/2006 14:12:16 .es a Edição 38 • Java Magazine jm38. E veremos como utilizar a API JGoodies Forms para montar telas eficientes e com poucas linhas de código. interfaces gráficas com o usuário). e a AP O T p projeto de interfaces gráficas eficazes exige mais do que conhecimento sobre componentes visuais ou outras questões relacionadas à tecnologia.Interfaces Gráficas co m Parte 1: Conceitos e Técnicas Fundamentais. abordaremos erros comuns e técnicas de organização de interfaces.indb 44 17/7/2006 14:12:18 . Em seguida. Começaremos analisan- do a importância do projeto visual para o desenvolvimento de GUIs (Graphic User Interfaces. e que precisam ser compreendidos antes mesmo de se digitar qualquer linha de código. Este artigo apresenta a primeira parte de uma série voltada para a qualidade das interfaces gráficas. São detalhes mais humanos que fazem a diferença. apresentando técnicas fundamentais para um bom projeto visual. 44 Java Magazine • Edição 38 jm38. Os efeitos que cada elemento visual produz sobre nossos olhos revelam detalhes que complementam o significado das informações e auxiliam o usuário a entender o conteúdo da imagem observada. o desconhecimento de princípios de criação de interfaces ou a simples vontade de embelezar muito a tela podem resultar em interfaces pobres e excessivamente poluídas. Tela de exemplo que ilustra um projeto visual com problemas. A forma com que essas peças são unidas é tão importante qua nto cada peça individual. Além disso. entender a influência e efeitos que diferentes composições cau sa m nu ma GUI.indb 45 45 17/7/2006 14:12:20 . torna apoio de designers e outros especialistas em projeto visual. Você dificilmente encontrará todos esses problemas juntos na mesma tela de um sistema real. A importância dessas questões está relacionada ao papel do projeto visual no desenvolvimento e o momento em que ele deve ser aplicado. o projeto visual precisa estar bem integrado ao ciclo de vida de desenvolvimento.). que às vezes confundem seus usuários por refletirem diretamente as entidades de negócio por trás do sistema (EJBs. Este é um erro comum cometido em muitos projetos e que ainda precisa ser combatido.o m Qualidade a API JGoodies Forms Saiba como projetar interfaces gráficas eficazes que facilitam a vida dos usuários. Para ser eficaz. Embora existam normas e processos de engenharia de software voltados para esse propósito. A segunda questão que precisamos destacar é a suposição incorreta de que o simples uso de componentes e APIs (como os do Swing e do AWT) é suficiente para se alcançar os benefícios de uma boa apresentação. As suas posições horizontais variam de acordo com o tamanho de cada JLabel. Começaremos Figura 1. Em primeiro lugar. Vamos começar explorando algumas questões fundamentais que precisam estar claras para qualquer equipe envolvida na criação de GUIs. Em seguida veremos técnicas de organização de informações e de redução de poluição gráfica. Assim. Ilustraremos esta técnica com um exemplo – veja a Figura 1 – que resume alguns problemas que precisam ser sempre evitados. Erros comuns em interfaces gráficas Uma técnica de aprendizado muito eficiente é a analise de erros comuns cometidos no desenvolvimento de interfaces gráficas. Vejamos os erros. O resultado dessa decisão freqüentemente são sistemas com telas complexas e pouco intuitivas. a tendência de um usuário é determinar a qualidade de algo que não conhece baseando-se naquilo que vê e sente. mas a freqüência com que cada um aparece separadamente é bastante alta. e sem nosso estudo analisando alguns dos principais erros cometidos no projeto de GUIs. É comum vermos empresas que deixam o projeto e a implementação de GUIs apenas nas mãos de programadores sem experiência na criação de interfaces. entre outras. a interface gráfica de um sistema conta muito para uma boa impressão. E é necessário ir além. Edição 38 • Java Magazine jm38. Comece observando os componentes JTextField desalinhados na parte superior esquerda da tela. mas não os componentes relacionados. tabelas etc. Esse problema de alinhar os JLabels. permitindo que interfaces gráficas possam ser elaboradas e melhoradas conforme o entendimento do problema avança ao longo do tempo. qualquer julgamento sobre a qualidade de um software é difícil. e como implementá-las utilizando a API Forms do JGoodies HUGo vIdaL teIXeIra Técnicas de projeto visual P or ser um conceito muito abstrato. o projeto visual não é uma tarefa que pode ser deixada para depois. Um teste os componentes. A borda interna cria uma dimensão desnecessária que polui mais do que realmente enfatiza aquela área. Além disso. enquanto sobra muito espaço ao redor. qualquer trabalho. note que o subgrupo “Comandos” não está alin hado com o resto dos componentes. Swing rais para boa organização e estruturação e SWT. Algumas armadilhas ainda aguardam reduzindo o relacionamento visual entre o desenvolvedor desatento. uma com borda 3D e outra não. e Formatação com Espaços Vazios. e o domínio vem com a tela desproporcional. que não podemos deixar de fazer no desenvolvimento de interfaces é obserTécnicas de organização visual var como a janela se comporta quando é Agora que já vimos um pouco sobre redimensionada.indb 46 17/7/2006 14:12:22 . deixando de aproveitar um espaço valioso. Além disso. Problemas de redimensionamento na tela de exemplo. É prat ica mente i mpossível con seA idéia. são muito valiosos setResizable (false) da classe para causar uma boa impressão em Frame. pouco tempo de prática. e verifique que não existe um “Comandos” permaneceu intacto e popadrão consistente. Os problemas ainda não acabaram. existem duas JTextAreas. além de podemos sempre pensar em proibir o serem apoiados pela área de psicologia redimensionamento através do método cognitiva. ao fazer o redimensionamenguir elaborar GUIs eficazes sem o uso to. por conter um JTextArea. As técnicas que abordaremos layout que formatam e posicionam cada comaqui estão divididas em três categorias: ponente. sem notar a presença da borda. esse problema com a ja nela do nosso Simetria e balanceamento exemplo. design gráfico e ergonomia. JTrees. e Relacionamentos Visuais. Agora observe o grupo “Medidas” e repare como os JTextFields estão colados. Compare ainda Figura 2. e que não ocupa toda a largura disponível na tela. Portanto. sendo que um adicionou o recurso e o outro. É uma inconsistência comum normalmente causada (por exemplo) pelo fato de desenvolvedores diferentes alterarem a mesma tela. Repare que Simetria é uma propriedade que reo subg r upo “Consulta da harmonia e equilíbrio de uma trole” foi favorecido estrutura.Interfaces Gráficas com Qualidade a leitura dos valores muito mais difícil do que poderia ser. O teste de redimensionamento é importante podemos discutir alguns princípios geem GUIs criadas com toolkits como AWT. Já o subgrupo existentes. É muito importante por ser sem necessidade (o facilmente reconhecida e agradável aos que dei xou o bot ão 46 Java Magazine • Edição 38 jm38. Já a borda dos subgrupos distrai os olhos e gera uma separação visual pouco eficaz entre os elementos. deixou de seguir o mesmo estilo. São princípios JTextAreas. Para nossa sorte. Observe ainda que a base dos textos dos JLabels não está alinhada com a base dos textos dos JTextFields. como JTables. o que não fazer em interfaces gráficas. são nentes que podem crescer sem deixar técnicas simples. Para terminar nossa análise. porque estes utilizam gerenciadores de visual. deria ter aproveitado melhor o espaço. A presença de bordas aninhadas normalmente revela um projeto visual pobre. mesmo fora da área A Fig ura 2 most ra de software. Cuidados com redimensionamento vários espaços vazios surgiram na tela. Alinhamento totalmente explicitadas pela GUI. é favorecer sempre aqueles compodessas técnicas. JLists etc. percebemos que a parte inferior da tela está dentro de uma borda interna e ainda contém subgrupos com bordas e títulos. Veremos como combater esse problema na seção “Redução de poluição gráfica”. o t a m a n ho do s botõ e s “Editar” grande demais). seguindo regras próprias que não são Simetria e Balanceamento. Repare a repetição desnecessária da palavra “Controle” tanto no label da JComboBox quanto no título do subgrupo. Caso uma jaque fazem parte de disciplinas como nela não possua componentes deste tipo. o que também atrapalha a leitura dos valores. Descendo mais o olho. mais adiante. Identificar os eixos pelos quais a simetria será estabelecida. A simetria diagonal é mais rara. as figuras mais memoráveis normalmente são muito simétricas. seja com uma margem principal. Uma interface eficaz precisa estabelecer relacionamen- tos visuais entre suas estruturas sempre que possível. Posicionar a informação sobre o eixo de simetria através de um balanceamento cuidadoso de cada lado. Identifique as principais fronteiras da tela e procure um modo de organizar seus elementos em alinhamento com essas fronteiras. Objetos ali n hados criam uma forte atração entre si. tente posicioná-lo de forma a balancear o espaço já ocupado. Para estabelecer um bom alinhamento. No mundo dos símbolos visuais. como a estrela. mas tente igualar aspectos como quantidade e espaço ocupado. a cruz e o yin-yang. seja com algum outro elemento associado a eles. 3. a qual se torna mais limpa e mais fácil de ser compreendida. 4. Para elaborar um layout simétrico. A simetria é um fator importante quando o objetivo do trabalho depende de balanceamento. onde regiões bem definidas podem ser facilmente identificadas. Edição 38 • Java Magazine jm38. elementos desalinhados produzem tensão no observador. Isso acontece porque nossos olhos têm preferência natural por estruturas regulares. a simetria normalmente é vertical e horizontal. 2.indb 47 47 17/7/2006 14:12:26 . o que pode causar incômodo ou dúvida quanto às relações entre os elementos. Identifique elementos mais “soltos” na tela e verifique se estão alinhados com alguma outra coisa. Uma das vantagens em se alinhar elementos é a redução da complexidade da tela. Se um elemento não está relacionado a nenhum outro na tela. Por outro lado. mesmo quando separados por longas distâncias.nossos olhos. mas também é valida. Procure por elementos e margens (internas ou externas) que podem ser alinhados pela alteração de seus tamanhos ou posições. Alinhamento e relacionamentos visuais O alinhamento é o meio mais importante de se estabelecer relacionamentos entre elementos. Em interfaces gráficas. a seta. A informação não precisa formar um espelho perfeito. algumas dicas são importantes: 1. rotação ou reflexão – cria-se uma nova imagem simétrica que compartilha características semelhantes. considere as seguintes dicas: 1. 2. Sempre que uma forma é repetida – seja por translação. ordem e simplicidade. e o alinhamento é um passo necessário a uma apresentação coerente. Redução de poluição gráfica Existem algumas técnicas de identificação e remoção de poluição visual que precisam estar na ponta da língua de quem desenvolve interfaces gráficas. Visuais como o da Figura 4. Isso não consegue passar despercebido mesmo quando usamos um look-and-feel bem projetado. mostraremos como implementar interfaces gráficas lançando mão dos princípios e técnicas apresentadas até aqui. Temos outro exemplo ilustrado na Figura 3.indb 48 17/7/2006 14:12:30 . preste atenção somente nas bordas e linhas que o programador possivelmente colocou em excesso. As seguintes dicas ajudarão você a encontrar os melhores lugares para aplicar essa técnica: 1. volte à Figura 1 e veja como bordas inúteis se confundem com as bordas dos componentes. É importante ressaltar que o objetivo dessa técnica é apenas identificar bordas e linhas que o programador adicionou à i nterface sem necessidade. ele é também o mais custoso. já que trazem informações úteis ao usuário. 2. como mostrado na Figura 4: veja o excesso de bordas causadas pelo aninhamento de componentes JTabbedPane. desenham seus componentes utilizando cores que simulam um pseudo-3D dando a sensação de profundidade. Figura 3. Como primeiro exemplo. mas sim um elemento poderoso para guiar a atenção do observador. Portanto. Garanta uma separação entre os conjuntos de informação através da adição de espaço vazio entre eles (mesmo se já Embora o espaço vazio seja uma variável poderosa em termos de percepção. 3. Agora se forem percebidos apenas alguns níveis. onde duas visões de um mesmo painel são apresentadas. Nesses casos.Interfaces Gráficas com Qualidade existirem fronteiras bem definidas). ut i l i za ndo o pouco e spaço q ue d i s p omo s para mostrar as i n for m aç õ e s. toolkits Java como Swing e AWT. e os de outras linguagens. Aumente o espaçamento entre esses elementos e outros considerados críticos. É exatamente essa sensação de 3D que exploramos nessa técnica. 48 Java Magazine • Edição 38 jm38. Identifique elementos que precisam de uma ênfase visual adicional (como títulos). temos uma tendência natural de tentar incluir o máximo de informações possíveis para o usuário. É daí que vem a importância de se utilizar espaços vazios na organização da informação. não se incomode com elas. a téc n ica deve ser u sada sem exageros. por exemplo. produziriam uma sensação de “ondulação” nas unhas que poderia atrapalhar essa técnica. Uma delas. Espaços vazios na tela não significam desperdício. A s si m. Na próxima seção. Como todos já percebemos. qual grau de vibra- ção você sentiria? Se for “sentida” uma trepidação grande. Repare que a substituição das bordas com título por JLabels reduziu a poluição do painel e resultou em uma tela mais simples e clara para o usuário. Imagine que você fosse capaz de sentir os relevos 3D e passasse suas unhas sobre a tela em um movimento contínuo. não se preocupe com essas ondulações. direcionando os olhos do usuário para certas regiões da tela e permitindo que cada pedaço de informação seja corretamente destacado. Excesso de bordas no painel à esquerda em contraste com a simplicidade do painel à direita. é a chamada técnica das unhas na tela. Lembre-se que as bordas naturais dos componentes são as poucas que devem predominar na tela. sua tela provavelmente não está poluída. Essa técnica é uma das melhores soluções para evitar o uso de bordas e linhas que delimitam áreas da tela. Essa busca por utilizar cada pixel disponível resulta normalmente em telas saturadas e com muita poluição visual. sua tela provavelmente precisa ser revisada. : 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 usuário. Agrupe as informações 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. e na minha opinião. uma das mais divertidas. Outra questão são os novos e modernos look-and-feels que simulam interfaces arredondadas e com componentes brilhantes. Formatação com espaços vazios Quando projetamos telas para sistemas de informação. 3dlu. 1. {3. panel. respectivamente. os quais contêm exemplos. Você verá a partir de agora que o código exigido para a montagem de uma tela normalmente é bem curto e de fácil leitura. Método para criar o painel do exemplo da Figura 5 com o FormLayout.xy (3.add(new JLabel(“Nome:”).indb 49 4 17/7/2006 14:12:31 .Implementação com JGoodies U ma das soluções open source mais interessantes para quem trabalha com Java no desktop é. essa é a principal técnica utilizada pelos designers profissionais. O JGoodies Forms define uma linguagem simples para montar essas strings e especificar cada linha e coluna. 9} }). 5)). exigindo que o desenvolvedor leia partes extensas do código de GUI para entender a estrutura sendo definida.add(new JLabel(“Telefone(Fax):”).add(new JButton(“. 15dlu. panel. As colunas 2. Veremos agora como utilizar a API JGoodies Forms para implementar interfaces eficazes em Java.add(new JTextField(). return panel. pref”. cc. 3dlu. O FormLayout revela-se como uma solução vantajosa por ser simples e intuitivo. 3dlu. 10dlu. Nosso primeiro exemplo é o painel ilustrado na Figura 5. 3dlu. 4 e 8 formam um espaçamento de proporção fixada em 3dlu (dialog units). passamos no construtor duas strings que definem. JLabels ou JTextFields / JComboBoxes). e adequado para a codificação direta sem o uso de editores visuais de interfaces. Consulte o quadro “O que é JGoodies?”. Preparação A obtenção e instalação da API Forms são bastante simples: navegue até o site do JGoodies (jgoodies. cc.xy (1. right:pref. cc. // colunas “pref. código-fonte e o JAR que deve ser incluído no classpath da sua aplicação para executar os exemplos.xy(9. 7}. panel. 7 e 9 determinam que a largura seja a largura preferida dos componentes inseridos em seu interior (no caso.add(new JTextField(). 5)).xy (5. panel. Repare que existem nove colunas. o FormLayout alinha componentes às células da grade retangular que forma a tela. esboçamos a tela em papel e identificamos as linhas e colunas que formam a sua estrutura. as colunas e as linhas que formam a grade da tela sendo projetada.xyw(3. JPanel panel = new JPanel(layout). cc.add(new JLabel(“Categoria:”).add(new JComboBox(). o que facilita a sua compreensão e rápida modificação. documentação. 3)). 3. cc. } organiza e oferece uma maneira consistente de trabalhar com diferentes tipos de elementos interrelacionados. Uma vantagem é que toda a estrutura do painel está centralizada nessas duas strings. Nosso objetivo principal será reconstruir a tela inicial apresentada nas Figuras 1 e 2 (onde muitos erros foram encontrados) seguindo as técnicas de projeto visual apresentadas.setColumnGroups(new int[][] { {1. Observe a Figura 6 e veja como o painel foi projetado. panel. podemos Edição 38 • Java Magazine jm38. sem dúvida. private static Component montaPainelExemplo() { FormLayout layout = new FormLayout( “right:pref. As colunas 1 e 7 exigem ainda que seus componentes estejam alinhados à direita.add(new JLabel(“Telefone:”). cc. Note que a contagem das linhas e colunas começa em 1. 5)). um gerenciador de layout que divide a tela em linhas e colunas flexíveis.”).xy (1. pref”).com). para conhecer melhor essa iniciativa. panel.xy (7. 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 resolução da tela. ao final desta seção. vá até a seção Downloads e clique em Libraries. Assim como a classe GridBagLayout do Java SE.xy(9.add(new JLabel(“CPF:”). // linhas layout.add(new JTextField(10). pref. a estrutura normalmente fica espalhada. De fato. panel. cc. 3)). panel. 3)). Usando o FormLayout Para a criação de uma instância de FormLayout. As colunas 1. cc. cc. Em outros gerenciadores. cc. panel. panel. Para criá-lo utilizando o FormLayout. Começando com o FormLayout A classe central da API Forms é FormLayout.xy (1. 5)).add(new JTextField(). Dessa forma. o conjunto de APIs do JGoodies. panel. 7)). Listagem 1.. 3)). permitindo que cada componente ocupe uma ou mais células. Lá você terá acesso aos arquivos zipados de todas as APIs. 5)).. 1)). cc. 3dlu. Uma grade alinha.xy (3. pref.xy (7. o que aumenta a produtividade do desenvolvedor. Uma das mais importantes vantagens do FormLayout é o uso da grade para dividir o espaço da tela. CellConstraints cc = new CellConstraints(). grow(double) ou g(double): cresce seguindo a proporção passada como parâmetro.componente): assume o tamanho maior entre os valores. 3dlu. pref”. “min” – linha/coluna com a altura/largura mínima dos componentes. a coluna 6. Tamanho Constante Inteiro + Unidade Onde Unidade pode ser: px (pixel). “min(30dlu.: 1 pt = 1/72 polegada) – ou – Double + Unidade Onde Unidade pode ser: in (polegada). Essa definição só faz sentido quando existem mais linhas/colunas que crescem no mesmo painel. “right:pref” – coluna onde os componentes ficam alinhados à direita. right: pref. // colunas “pref. 15dlu. é interessante Figura 4. As linhas da grade seguem o mesmo estilo das colunas. Tamanho de Componente min ou m: tamanho mínimo. a coluna 5 ficará com a largura fixa de 15dlu para o único botão nela inserido. 3dlu. bottom ou b: alinhado ao chão. “pref:grow” – linha/coluna que cresce na mesma proporção do crescimento do painel. “10px” – linha/coluna com 10 pixels de altura/largura. onde todos os componentes estão alinhados na parte de cima (topo). Exemplo simples de um painel para ilustrar o FormLayout. pt (point) ou dlu (dialog unit). mm ou cm. Tabela 1. 10dlu. grow: cresce conforme o painel cresce. Com essas informações.indb 50 17/7/2006 14:12:32 . max(constante. 3dlu. podemos utilizar o recurso de agrupamento de linhas e colunas. onde os componentes são esticados para ocupar toda a largura. pref ou p: tamanho preferido. onde os componentes ocupam todo o espaço vertical. “top:100px” – linha de 100 pixels de altura.5)” – linha/coluna que cresce com a metade da proporção do crescimento do painel.5cm. Right ou r: alinhado à direita. “pref” – linha/coluna com a altura/largura preferida dos componentes. Tamanho Limitado min(constante. e sua largura é a largura preferida dos componentes. (Obs. “fill:30dlu” – coluna de 30dlus de largura. Poderíamos ter inserido uma linha para separar os dois grupos inferiores. Tipo de especificação Valores Exemplos Alinhamento de Colunas fill ou f: preencher com o conteúdo (default). 3dlu. pref.33 cm de altura/largura.p)’ – linha/coluna cuja altura/largura assume o maior valor entre 0. que divide a tela ao meio.p)” – linha/coluna cuja altura/largura assume o menor valor entre 30dlu e a altura/largura dos componentes.33cm” – linha/coluna com 0.15in” – linha/coluna com 0. Redimensionamento none: nenhum (default). “0. top ou t: alinhado ao topo. Bordas aninhadas em um projeto com look-and-feel moderno. default ou d: tamanho default. “fill:3cm” – linha de 3 cm de altura. podemos definir aquelas que crescem mais do que as outras. mas lembre-se que usar espaços vazios é sempre melhor.15 polegadas de altura/largura. enquanto as linhas 2 e 4 são fixadas em 3dlu. Da mesma forma. “p:g(0.5cm e a altura/largura dos componentes. Alinhamento de Linhas center ou c: centralizado (default). pref”). “max(0. 3dlu. left ou l: alinhado à esquerda. as linhas 1. Por fim. pref. No nosso caso. e as proporções serão sempre mantidas. “36pt” – linha/coluna com 36 pontos de altura/largura (36 pontos = ½ polegada). center ou c: centralizado. Figura 5. // linhas Para manter uma boa simetria no painel.componente): assume o tamanho menor entre os valores. possui a largura fixada em 10dlu. 50 Java Magazine • Edição 38 jm38. Assim. que garante tamanhos iguais para conjuntos definidos através dos métodos setColumnGroups() e setRowGroups(). Assim. fill ou f: preencher com o conteúdo.Interfaces Gráficas com Qualidade mudar essas características. já podemos instanciar nosso gerenciador de layout: FormLayout layout = new FormLayout( “right:pref. Valores para especificação de uma linha ou coluna. 3 e 5 ficam com a altura preferida dos componentes. “0. cc. fazemos: CellConstraints cc = new CellConstraints(). com a mesma largura (lembre-se que a simetria é importante). int linha) que posiciona um componente em uma determinada célula.xyw(3. e que cresce conforme o crescimento do painel. Figura 8. e refazer o exemplo inicial do artigo. Agora vamos estudar um pouco mais a linguagem de especificação de linhas e colunas do JGoodies. vamos reprojetar o exemplo inicial usando esse gerenciador de layout. Assim. cuja largura é a largura preferida dos componentes. 9} }). buscando alinhar e balancear a estrutura. Planilha usada para identificar a nova estrutura do painel. panel. linha 1. Essa classe possui o método xy(int coluna. Projeto das linhas e colunas do painel de exemplo.add(new JTextField(). e também demonstrar outros pequenos detalhes ainda não mencionados sobre a API JGoodies Forms. e que cresce a uma taxa de 80% do crescimento do painel. existe o método xyw(). Assim. Utilizar o computador para essa tarefa frequentemente atrapalha mais a criatividade do que realmente ajuda a desenvolver um bom projeto visual. 1. precisamos utilizar uma classe chamada CellConstraints.8)” – linha centralizada. para posicionar os componentes na grade. O resto do código deste exemplo simples está na Listagem 1. para adicionar o primeiro JLabel ao nosso exemplo. Aqui estão mais exemplos de especificações de colunas: • "left:pref:grow” – coluna alinhada à esquerda. 7}. podemos adicionar o primeiro JTextField do exemplo.xy (1. E aqui estão mais alguns exemplos para linhas: • "b:pref:grow” – linha alinhada à parte de baixo. cuja largura é o menor valor entre 20dlu e a largura preferida dos componentes. Reconstrução do exemplo inicial Agora que já vimos o básico sobre o FormLayout. e os valores que podem ser usados para definir a estrutura da tela são detalhados e exemplificados na Tabela 1. // e ocupa a largura de 7 colunas panel. da seguinte forma: // Adiciona o componente na coluna 3. é recomendado que a equipe se afaste do computador e trabalhe um pouco com papel e caneta. 7)). cuja altura é o tamanho default dos componentes.p)” – coluna alinhada à direita. Esboços de layouts para o exemplo.indb 51 51 17/7/2006 14:12:36 . Fazer Edição 38 • Java Magazine jm38. O segundo passo é identificar e especificar as linhas e colunas da grade onde serão inseridos os componentes.setColumnGroups(new int[][] { {1. 1)).add(new JLabel(“Nome:”). Figura 7. Para isso. {3. podemos definir: layout. cuja altura é a altura preferida dos componentes.min)” – linha onde os componentes preenchem todo o espaço vertical. • "fill:max(25mm. Agora só falta adicionar os componentes ao painel. assim como 3 e 9. e que cresce conforme o crescimento do painel. cc.manter as colunas 1 e 7. usado para posicionar um componente que se estende por várias colunas. • "c:d:g(0. Especificando Linhas e Colunas Figura 6. • "r:min(20dlu. Para isso. A especificação de uma linha ou coluna do FormLayout sempre segue este formato: Especificação = [Alinhamento:] Tamanho [:Redimensionamento] Os termos entre colchetes são opcionais. O primeiro passo na reconstrução de uma interface é identificar como os elementos serão posicionados. Além de xy(). e sua largura vale o maior valor entre 25 mm e a altura mínima dos componentes. Portanto. add(new JTextField(15). 7dlu.setLookAndFeel( PlasticXPLookAndFeel.add(new JLabel(“Outro Valor:”). 13)). 9. builder. 6)). cc. 7. p. builder. 3)). builder. 19)).xy(2. 21)).xy(2.add(new JLabel(“Altura:”). 6)). 17)).add(new JButton(“Editar. 21)). cc.xy(6.indb 52 17/7/2006 14:12:36 . builder. 3dlu. 3)). 1. 15)).xy(4. depuração e internacionalização. 23. 17)). 3dlu. que apresenta algumas funcionalidades vantajosas como. frame. builder. right:p. frame. builder. return ButtonBarFactory. o suporte a separadores com títulos. builder. 3dlu. Construiremos o painel utilizando uma classe utilitária do JGoo- dies Forms chamada DefaultFormBuilder. cc. cc. Classe que recria o painel do exemplo inicial. frame.setVisible(true). 15. 6)). 52 Java Magazine • Edição 38 jm38.add(new JLabel(“m”). 3dlu. cc. 3dlu.addSeparator(“Comandos”. Essa estratégia tem a vantagem de deixar o arquivo da planilha como documentação para a equipe. 3dlu. frame. builder. mostrando a definição da grade. cc.xy(8.xy(4. cc. builder. 3. agora utilizando a API Forms do JGoodies. Tela de exemplo reconstruída com a API Forms.add(new JLabel(“m”). cc. btnCancelar). 15)). builder. cc. p:grow”.xywh(8. 3dlu. CellConstraints cc = new CellConstraints(). } } builder.add(new JLabel(“kg”). Uma opção é utilizar uma planilha eletrônica e colorir as células onde ficam os componentes. builder. // linhas “p. A implementação com essa classe não é muito diferente da vista até aqui: Listagem 2.xyw(1.xy(8.. JButton btnCancelar = new JButton(“Cancelar”). min. 8)).add(montaBarraBotao(). builder.class. p.addSeparator(“Valores”. JFrame frame = new JFrame(“Bom Exemplo”). cc.EXIT_ON_CLOSE). 7)).xy(6.xy(2.addSeparator(“Medidas”. cc. builder. builder. 21)). cc. 3)). cc.addSeparator(“Controle”. p.xyw(4.addSeparator(“Descrição”. builder. cc.add(montaPainel()). } catch (Exception e) { . por exemplo.add(new JLabel(“Peso:”). DefaultFormBuilder builder = new DefaultFormBuilder(layout). frame. builder. cc.setDefaultDialogBorder().xyw(1.Interfaces Gráficas com Qualidade isso para telas complexas com lápis e papel tende a ser um pouco trabalhoso. p. 3)). cc. builder.xyw(4.xy(2.add(new JTextField(15). p. cc. 1)). builder.add(new JScrollPane( new JTextArea(2. 7)).xyw(4. 7dlu. 1. builder. 19)). 21)).pack(). builder.add(new JLabel(“Label Comprida:”).xy(4. em modo de depuração. builder.xywh(8. 15)). cc. cc.add(new JLabel(“Comprimento:”). builder.add(new JTextField(6).xyw(2. builder. 11. 3)). 21)). builder.xy(6. 19)).xy(2. } Figura 10. p. p. cc. 5.. cc. 3dlu.xy(4. p. 5)).xy(6.getContentPane().setDefaultCloseOperation(JFrame.setLocationRelativeTo(null). private static Component montaPainel() FormLayout layout = new FormLayout( // colunas “10dlu.buildCenteredBar(btnOK. { 10dlu. cc. cc. builder. A Figura 8 apresenta a planilha criada para o exemplo. Figura 9. } } return builder. 7)).add(new JComboBox(new String[] {“Automático”}).add(new JLabel(“m”).add(new JTextField(6). p. p”). builder.add(new JLabel(“Largura:”). 13. builder. 3dlu. 1. 11)). 17)).add(new JLabel(“Primeiro Valor:”).add(new JScrollPane( new JTextArea(2. builder. p.xy(2. cc. p. cc.add(new JTextField(6).xy(2.add(new JTextField(15). 7dlu.getName()).xy(6.add(new JTextField(6). 3dlu. A identificação das linhas e colunas já é suficiente para iniciar a codificação da interface..”).. Tela do exemplo. 3. cc. public class JanelaBomExemplo { public static void main(String[] args) { try { UIManager.getPanel(). cc. portanto você pode talvez preferir voltar ao computador neste ponto.xyw(1.xyw(1. cc. private static Component montaBarraBotao() { JButton btnOK = new JButton(“OK”). a documentação e arquivos JAR. mostra a Figura 10.html Links sobre projeto visual de interfaces gráficas.com).xyw(1. famoso especialista em Engenharia de Software.nl/enguilin. esse painel é adicionado à última linha do nosso layout. que serve para criar uma borda vazia em torno do painel. As APIs do JGoodies são baseadas em Swing e s ão sub divididas em cinco projetos: • Forms: Suporte para a criação de formulários precisos e elegantes de forma simples.com Site do JGoodies com tutoriais.xy(2. aplicações e APIs para download. Existe uma série de princípios que se deve aplicar corretamente para que o resultado seja satisfatório. como pelo W3C. Edição 38 • Java Magazine jm38.Conclusões O que é JGoodies? J Goodies é uma empresa alemã que oferece. A estrada que leva à alta qualidade de GUIs é longa. ainda na Listagem 2. Cada API está disponível para download no site do JGoodies na forma de um arquivo zipado que contém o códigofonte. builder. basta passar como segundo parâmetro do seu construtor uma instância da classe FormDebugPanel: DefaultFormBuilder builder = new DefaultFormBuilder(layout. mas agora estão disponíveis sob a licença BSD. Por fim. Conc lu i ndo. new FormDebugPanel()).sum-it. Atualmente trabalha como consultor integrado à Sakonnet Technology. jgoodies. um conjunto de APIs open source voltadas para o desenvolvimento de interfaces gráf icas desk top de alta qualidade. o método addSeparator() cria um separador com um título. builder. • Animation: Classes para criar animações com diferentes recursos e estilos. A idéia é reduzir o código de apresentação e permitir uma melhor separação de camadas.addSeparator(“Valores”. como Swing ou SWT. “OK” e “Cancelar”. dentre outras coisas.setDefaultDialogBorder().com/spi/design-interface. incluindo um exemplo prático com a API Forms do JGoodies.add(new JLabel(“Primeiro Valor:”). Além disso. 1994 Um dos livros mais completos sobre projeto de interfaces gráficas que explora diferentes técnicas e examina tipos variados de problemas encontrados em sistemas reais.zip Hugo Vidal Teixeira (hugo. • Validation : Suporte flexível para validação de campos e formulários. artigos. 6)).rspa.indb 53 53 17/7/2006 14:12:40 . mas com os princípios introduzidos aqui já é possível iniciar essa jornada. Prentice Hall PTR. mestre em Engenharia de Software pela COPPE/UFRJ e pesquisador da área de componentes e GUI Design. www.de) e OculusInfo(.de). Centigrade(. javamagazine. • Looks: Uma série de Look-and-Feels permitindo fornecer novos visuais às suas aplicações. ajudando na identificação visual dos grupos. Inicialmente essas APIs não eram open source. cc. É importante lembrar que bons projetos visuais não vêm naturalmente nem dependem de APIs gráficas. além de criar os botões com o mesmo tamanho. como Ergosign(. • Binding: Framework para conectar os componentes de interface com as classes de modelo da aplicação.com. que retorna um painel contendo os dois botões. A tela recriada está ilustrada na Figura 9 e utiliza o Look and Feel Plastic XP da API JGoodies Looks (veja o quadro “O que é JGoodies?”). Apresentamos nesse primeiro artigo um conjunto básico de técnicas fundamentais para o projeto visual de interfaces gráficas. que permite diferentes tipos de técnicas e indicações de erros. mas sem criar linhas desnecessárias. 3)). Para ver as linhas e colunas indicadas em vermelho durante a execução do programa. cc. rápida e consistente. obs er ve o mé to do montaBarraBotao(). ocupando a largura de todas as colunas. Um recurso interessante da classe DefaultFormBuilder é a possibilidade de depurar os painéis criados.tech@gmail. porém utilizando Java para descrever as animações (ao invés de XML). evitando que este fique colado aos limites da janela. Repa re na c ha mada ao método setDefaultDialogBorder(). Ele utiliza o método buildCenteredBar() da classe ButtonBarFactory que. O código completo desta implementação pode ser visto na Listagem 2. Designing Visual Interfaces: Communication Oriented Techniques Kevin Mullet & Darrell Sano. builder. www. os centraliza e mantém uma distância padronizada de separação. onde trabalha diretamente com Karsten Lentzsch (criador do JGoodies) e empresas especializadas em GUI design. Essa API utiliza conceitos definidos pela especificação SMIL (Synchronized Multimedia Integration Language) definida DefaultFormBuilder builder = new DefaultFormBuilder(layout).html Site com informações sobre interfaces gráficas mantido por Roger Pressman. 1.br/downloads/jm38/ jm-guisqualidade-p1.com) é Bacharel em Informática pela UFRJ. ANT .net na Prática .Montando um ambiente Java .O me .Tag Libraries JSP .Form .Processando XML em Java Edição 4 Edição 2 Edição 3 ES G OT AD A ES G Edição 1 .Relatórios Corporativos .Introdução ao J2EE 1.Expr .Dados em J2ME .Extre .Pacotes WAR e JAR .API New I/O (java.Testes de carga com JMeter .Apache FOP .4 .Dados com JDBC .Java.OT AD A .Eclip .Criando Plug-ins para Eclipse .Cocoon Inicial .Raio-X do Tiger .0 .Certificação J2EE .Tutorial de NetBeans .JBos .Eclipse para Web .Concorrência e a JVM Edição 14 Edição 13 Edição 12 ES G Edição 11 Edição 9 Edição 10 OT AD A Complete a sua coleção! .Robocode .nio) .New I/O Fundamental .Java no Governo .Tiger: A Evolução do Java .J2EE Fundamental .Inte .Segu .Cesta de compras com Struts .Preferences API .Automação com Ant .Fome Zero com Java .Game API .Códigos no Eclipse .Paginação na Web .JSTL – Guia Completo .Meta GINAS .Introdução a J2ME .Jogos wireless .Ferramentas livres .Gráficos com Java 2D .EWS• #ARTAS• 4IRA $¢VIDAS%XTREME0ROGRAMMING.Multimídia no celular .Tags Customizadas em JSP 2.Dicas para Web .JavaServer Faces . #OLLECTIONS. Nov .EVEZANO$ESKTOP 5MAALTERNATIVAAO3WINGPARAAPLICA½µES'5) $OMANDOO#LASSPATH 4IRESUASD¢VIDASSOBREESTECONCEITOESSENCIAL %SPECIAL *6-S! %SPECIAL 'ERENCIAMENTOCOM*-8 #ONHE½AMAIS *AVAEEXPLOR EBENCHMARK .Por Dentro do Apache Derby . Edição 34 *ASPER2EPORTSEI2EPORT0ASSAGEMDE 0ARºMETROS.Máq .Examinando o Mustang .Tira-dúvidas Edição 32 .Gráf .JSF Avançado .CD do NetBeans .O Projeto Eclipse .Debate Internacional Sou+Java .NetBeans 5.Test-Driven Development .Fronteiras do Java .0 .Tag .Criptografia aplicada .Segurança em apllicações web .Começando com Java .XML de alto desempenho .Segurança no JBoss .Eclipse Web Tools Project .Datas e Horas em Java /N .Aprendendo Groovy .Validação avançada com Struts .Java Business Integration (parte 1) Edição 24 /)$%LIVR NOVA2EV ESTRUTURA .Clusters com Tomcat e Apache .Mais HttpClient .JSF Passo a Passo .Sup .4OMCAT PÕ *AVA7EB3TARTNAPRÕTICA !2 !TECNOLOGIAPARADISTRIBUI½áODEAPLICA½µES*AVA )NTEGRANDOO*-%EM0$!S !CESSESISTEMASDEARQUIVOSEAPLICA½µESNATIVAS 4HINLET.JavaMail .SWT no Eclipse . 2ELAT˜RIOSDINºMICOS. indb 54 jm24-anteriores_página dupla. )MAGENSE*AVA"EANS Edição 23 2ELAT˜RIOS!VAN½ADOS Edição 33 !PLIQUE0ADRµESDE0ROJETO %SSENCIAISNOSSEUS0ROJETOSE 'ANHEEM1UALIDADEE2EUTILIZA½áO Edição 31 .MVC na web .O rugido do Java livre 0ATTERNS  2ELAT˜RIOS Edição 22 Edição 21 Edição20 Edição 19 %XTRAIAOMÕXIMODASTECNOLOGIASDE GERENCIAMENTODEAPLICA½µES.ind2-3 2-3 -AIS0ATTERNS!PLICADOS .Dúvidas de classpath .Cadastros com Struts .Mais design patterns .br jm38.Performance na JVM .com.Modularizando páginas com Tiles .Benchmarks JME www.JSTL aplicado no Tomcat 5 .Relatórios avançados .Servlet API Avançada .HSQLDB .Threads no Java 5.Internacionalização de MIDlets .Padrões de projeto Edição 30 Edição 29 .Componentes View do Struts .0 .Gerenciamento com JMX .Java Web Start .Caso de sucesso: Procon .javamagazine. Java Business Integration (parte 2) devmedia.QUEHOJEFAZEM PARTEDOCORA½áODE*AVAESáOESSENCIAISEM SISTEMASCOMPLEXOS .Asp .Scri .Hibernate em aplicações web .Web .Processos ágeis .Programação em par .com 17/7/2006 14:12:50 .Test .b .Java 6 (Mustang) .Para . Web Services .Servlets: do básico ao avançado .SwingWT .Memória e desempenho .Anotações no Java 5 .Teste com J2MEUnit .JBoss e Entity Beans .Java na Droga Raia .Validação na Web .Conhecendo o CVS .web (parte 2) om OT AD A Edição 8 Edição 7 ES G OT AD A Edição 6 .Mais Desempenho com JDBC . primeiros passos .JBuilder para web .Fundamentos .Qualidade Aplicada .Formulários com Swing .Primeiros passos com wireless .Java no Lego Mindstorms .Programação com regras .R$ 9.Projeto Looking Glass .Tomcat e o Servidor Apache .indb 55 .ANT .Impress ão com Java .Jakarta Commons Inicial .Logging no Java SE Edição 28 Futuro Presente .Jakarta Velocity .br/anteriores jm38. Usando JVMs Alternativas.Extreme Programming .0 .Novo NetBeans .90 4AGS*30COM4AG&ILES !MANEIRAMAISSIMPLESDECRIARTAGS CUSTOMIZADASPARAPÕGINAS*30 %SPECIAL *6-S!LTERNATIVAS #ONHE½AMAISDEMÕQUINASVIRTUAIS *AVAEEXPLORET£CNICASDEOTIMIZA½áO EBENCHMARKS .Apache Geronimo na Web .O mercado J2ME .JFreeChart Avançado .Ajax: Interatividade Turbinada .Parte 2 .Tutorial de Genéricos .Automatizando Java .Hibernate Fundamental .Para onde vai o Struts .Introdução ao Tomcat . porque e quando fazer o upgrade para o J2SE 5.Migrando para o Maven 2 .Números: Conceitos e Formatação JavaOne 2005 Grandes novidades em produtos e APIs.Guia Completo: tags Core .Metaprogramação e Reflection GINAS .Maven 2 Essencial .Otimização de EJBs no JBoss .Portlets .Conhecendo o Ant .Aplicação Completa .Java ME no Eclipse Edição 27 & .Frameworks de Logging . planos e comemorações no evento mundial da tecnologia Java Migrando para o Java 5 Conheça na prática e em detalhes como.Aspectos no Mundo Real .Eclipse inicial .JSTL.SuperWaba Inicial .O Novo Extreme Programming Edição 35 Edição 34 .Parte 1 .Scripting na JVM .Gráficos com JFreeChart . use em todos os lugares Edição 37 /)$%LIVREPATROCINADOPELA3UN£HOJEUMAFERRAMENTAINTEIRAMENTE NOVA2EVEJAOSFUNDAMENTOSDO)$%.Tag Files do JSP 2.JavaOne 2005 .Ano III .Segurança em aplicações web .Jakarta Taglibs .Ajuda com JavaHelp .Portlets .JBoss Inicial . Relatórios e Driblando Restrições da Máquina .Migrando para o Java 5 .Java 2D: Animações e Impressão Uma Aplicação Java Completa com NetBeans %CLIPSE#ON !SNOVIDADESDO)$%EDEOUTROS PROJETOSDA&UNDA½áO%CLIPSE Parte final – Acesso a Banco de Dados e Gerência de Preferências de Usuários Tira-Dúvidas Especial Caches e DAOs com JDBC.De Volta aos Patterns Leia uma vez.JSP 2 e Servlets no Tomcat 5 .Conhecendo o JDeveloper 10g .Genéricos no Tiger .Guia completo SQL e Format .Otimização de Código .Processamento de imagens .Introdução ao JMX .0 .JavaOne 2004 .Case J2ME Edição 18 Edição 17 Edição 16 ES G Edição 15 Edição 14 OT AD A ava ES G OT AD A ES G Edição 5 Edição 4 .Expressões regulares no J2SE 1.Interfaces ricas com Flash .MIDP 2.JSTL.Struts.OT¤CIASv#ARTAS PÕ 'RÕFICOSCOM*&REE#HART !2EVISTADA#OMUNIDADE*AVA"RASILEIRA Imprimindo com Java #RIEGRÕFICOSDENEG˜CIOSPARAAPLICA½µES DESKTOPEWEBUSANDO!0)SLIVRES Conheça duas APIs de impressão do J2SE e obtenha controle fino sobre layout e formatação 3UPER7ABA)NICIAL $ESENVOLVAPARA0$!SCOM FERRAMENTAS*AVAECONHE½A OMUNDODOSHANDHELDS Gerência de Conteúdo Detalhes sobre a Novíssima API JCR e a Criação de Repositórios de Conteúdo na Web Edição 24 .Aplicação Completa .0 .Gerenciamento de Conteúdo .Java 2D: Animação e impressão .4 Java 5 • Impressão • Java Content Repository • Caches e JDBC • NetBeans • JavaOne *6-Sv*30v%CLIPSEv!NTv3UPER7ABAv*&REE#HARTv.Bancos de dados livres .Desempenho com JDBC e DAOs .Conectivade com MIDP .Testes unitários com JUnit .Segurança com JAAS .Máquinas virtuais alternativas .Automação com XDoclet .Logging .Parte 3 .Collections avançado .JavaOne 2003 .Aplicação Completa .Acessando Código Nativo .Recursos Avançados . Os 10 Mais do Eclipse 3.2 .Relatórios Passo a Passo .Criação de Plug-ins .CONHE½ANAPRÕTICAANOVA ESTRUTURADEPROJETOSBASEADANO!NTESAIBAOQUEVIRÕNAVERSáO Edição 26 .Testes com mock objects 21 2283 9012 17/7/2006 15/7/2006 14:12:52 18:28:08 .JavaOne 2006 .ET Edição 36 /NOVO Edição 25 Edição 24 Java: .ET"EANS . • Integradores que constroem produtos baseados nos projetos da Fundação Eclipse Como diz o próprio site do Callisto (eclipse. em vez de terem que esperar pela cascata de atualizações gerada por cada projeto individual no passado – por exemplo. apenas depois disso um novo WTP. O propósito do Callisto é facilitar a vida de dois tipos de usuários. Dessa forma. o Eclipse Callisto.O Eclipse Callisto A maneira fácil de instalar os principais plug N o final de junho foi finalmente liberado um dos lançamentos mais ag uardados do a no. os projetos não foram 56 Java Magazine • Edição 38 jm38.org/callisto). que reúne 10 dos projetos mais importantes da Fundação 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. hoje sai um novo Eclipse SDK. algumas semanas depois um novo EMF. foi iniciado no começo de 2006 com o ambicioso objetivo de liberar simultaneamente as novas versões de vários dos principais projetos da Fundação Eclipse. destacado no artigo sobre o Eclipse 3. e daí em diante.2 na edição passada.indb 56 17/7/2006 14:13:07 - . os novos recursos ficam disponíveis para uso imediato pelos interessados. 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. ao oferecer uma plataforma unificada com releases simultâneos de componentes-chave dos 10 projetos citados: • Desenvolvedores individuais que usam o Eclipse como ambiente de desenvolvimento de aplicações. Cada um permanece com seus próprios planos de desenvolvimento e cronogramas de releases individuais. O site principal tende a estar saturado. Antes de receber a relação de features que podem ser instaladas pelo Callisto. mas nenhum ainda no Brasil. que fornece um conjunto integrado de plug-ins Eclipse para desenvolvimento Web. garante t a m b é m q u e s e r ão sempre versões estáveis. Figura 2. especialmente logo após o anúncio de um novo release de algum componente popular como o JDT. coisa que nem sempre acontece com as versões mais recentes dos projetos individuais. conforme mostra a Figura 1. O projeto ainda traz uniformidade no controle de versões.2) para a sua plataforma específica. organizadas em categorias como “Java Development” e “Charting and Reporting”. critérios para qualificação de releases como estável ou em desenvolvimento. será exibido um marcador de erros semelhante ao Edição 38 • Java Magazine jm38. o usuário recebe a opção de selecionar um espelho (mirror) para o download dos arquivos. é necessário baixar e instalar manualmente o Eclipse Platform Runtime 3. Relatórios e Modelagem Fernando Lozano detalhes de acompanhamento e gerenciamento dos projetos individuais. Caso uma feature tenha dependências contidas em outras features. de modo a facilitar a localização das features desejadas pelos usuários iniciantes em Eclipse.indb 57 57 17/7/2006 14:13:17 . Visual. Escolha de um dos espelhos.o g -ins do Eclipse Aprenda como instalar o Callisto. unificados. A próxima janela exibe a relação de features disponibilizadas pelo Callisto. A mesma feature pode ser exibida em mais de uma categoria. Como chegar ao site de download do Callisto. o que o torna bastante diferente de “distribuições” do Eclipse como o Yoxos (yoxos.2 (ou então o Eclipse SDK 3. O Callisto garante que cada projeto no seu conjunto de releases funcionará junto com os demais sem problemas.com). Instalação do Callisto Figura 1. Para se obter o Callisto. portanto pode ser interessante selecionar uma das demais alternativas. O próximo passo é escolher a opção Search for new features to install. e outros pequenos Curiosamente. o Callisto não fornece uma página de downloads e nem um instalador integrado. e na página seguinte do assistente selecionar Callisto Discovery Site. Depois deve-se abrir o Update Manager da plataforma (Help|Software Updates >Find and Install). Há uma grande quantidade de espelhos ao redor do mundo (veja a Figura 2). O que o Callisto fornece é a possibilidade de se deixar de acompanhar cada projeto individualmente e utilizar apenas as últimas versões disponibilizadas como parte do Callisto. 58 Java Magazine • Edição 38 jm38. como a criação de ícones no desktop ou a utilização do IDE por vários usuários da mesma máquina (ex. Se for necessário.releng. pelo Update Manager e mantendo a integração estreita com os gerenciadores de pacotes do Linux. Dessa forma são geradas várias ins- talações independentes e paralelas do Eclipse. Mas a solução está a caminho. Apenas depois que todas as dependências sejam satisfeitas será habilitado o botão Finish.redhat. Afinal. clicar no botão Finish faz com que cada feature seja baixada e instalada. o usuário tem a oportunidade de selecionar um local alternativo para a instalação de cada feature. php/Linux_Distributions_Project) visa resolver estes problemas e além disso fornecer plug-ins específicos para o desenvolvedor Linux / Unix. geradores de pacotes RPM e integração com o GNU Autotools (origem do popular script configure usado por quase todos os projetos de software livre escritos em C para Unix). mostrando que uma dependência ainda não foi satisfeita. Finalmente. por exemplo editores de páginas de manual (man pages). Mac OS ou outro sistema Unix-Like. veja o quadro “Empacotando o Eclipse para Linux”. pois o Linux espera que cada pacote seja construído a partir dos fontes originais e de forma automatizada (o conceito de “pristine sources” originado pelo RPM). Instalar features em diretórios separados (em especial. Seleção de features fornecidas pelo Callisto para download e instalação. Usuários de outros sistemas Unix-Like como o Solaris. A ntes de i n iciar o download e instalação das features selecionadas.zip na página de downloads do Eclipse).org/index. Mas não existe um processo padronizado para a obtenção destes fontes na Fundação Eclipse.eclipse. que realize a instalação manual em seu diretório pessoal. mas nenhum deles hoje consegue permitir a instalação de atualizações ou novas features. mas as opções de “aceito” ou “não aceito” se aplicam a todo o conjunto. e usuários do Fedora e Yellow Dog contam com o yum. Em resumo. não apenas para os usuários Linux. Por enquanto. e faça todas as atualizações e acréscimos por meio do Update Manager. o JDT não é gerado diretamente pelo PDE. e faça todas as atualizações e acréscimos por meio do gerenciador de pacotes da distribuição. usado pelo Eclipse para indicar problemas em código Java (Figura 3). Só para citar um exemplo. a situação atual exige que o usuário Linux escolha ter uma instalação do Eclipse bem integrada. A página seguinte (Figura 4) permite que se verifique a licença de uso de cada feature. usuários de Debian. Os resultados deste projeto serão importantes para todos os usuários do Eclipse. FreeBSD e o Mac OS têm problemas semelhantes e serão também beneficiados pelo projeto. Facilita ainda a sua cópia para a máquina de outro desenvolvedor (que assim não precisa fazer o download direto da internet). Os empacotamentos customizados das distribuições resolvem alguns problemas de integração do Eclipse com o ambiente Linux. pois a integração de um melhor gerenciamento de dependências ao Update Manager tornará o Eclipse e seus plug-ins mais fáceis de instalar em qualquer plataforma. Muitas distribuições do Linux já empacotam o Eclipse como componentes padrão.: com clientes magros).com) ou então com o pré-requisito da instalação manual do Java da Sun (como no JPackage. Ubuntu e Kurumim fazem isto há anos usando o apt-get. Infelizmente o Eclipse não suporta (via Update Manager) o compartilhamento de features entre diversos usuários de um mesmo sistema Linux. mas sim por uma ferramenta conhecida como Releng (procure por org.tools-3.indb 58 17/7/2006 14:13:21 . isto sem falar nas ofertas comerciais da Novell/SuSE e da Red Hat. fedora.2. Como mostra a Figura 6. por não ser capaz de gerenciar automaticamente dependências e indicar exatamente quais são as features que devem ser acrescentadas para resolvê-las. mas no futuro poderá haver compo nentes utilizando outras licenças open source. às vezes utilizando um Java Livre como o GCJ (caso do Fedora Core Linux. todos os componentes usa m a mesma l icença padrão da Fundação Eclipse. jpackage. Retorne com o botão Back caso alguma das licenças não lhe agrade. Ta mbém pode ser u m “quebra-galho” interessante em caso de falta de espaço no disco de instalação do Eclipse. ou então. nem para a compilação auto- mática dos plug-ins.org). caso haja outros usuários do IDE no mesmo computador. diferentes da própria Eclipse Platform) facilita a posterior desinstalação ou desabilitação dessas features. O recém-criado Linux Distributions Project da Fundação Eclipse (wiki.O Eclipse Callisto Figura 3. o Eclipse será automa- Empacotando o Eclipse para Linux U suários de Linux poderão achar o Update Manager do Eclipse “primitivo”. A manutenção destes empacotamentos é trabalhosa.eclipse. ou mesmo o compartilhamento de features entre vários sistemas operacionais para quem tem “dual boot ”. ou a seleção do EMF. pode-se considerar o Callisto como um grande sucesso. draw2d”. para baixar o SDK ou plataforma e iniciar o processo Figura 7. ainda mais considerando-se a quantidade de pessoas e empresas envolvidas em cada um desses projetos.apache. O Callisto ainda não é o “Eclipse para Iniciantes”.indb 59 59 17/7/2006 14:13:23 . como no exemplo da Figura 7. que cita o plug-in “org. Aceitação dos termos de licença de todas as features. Baixando e instalando as features selecionadas. por exemplo é estranha a exigência de se incluir o PDE (desenvolvimento de plug-ins) para instalar tanto o VE (para desenvolver visualmente aplicações SWT ou Swing) quanto o JST (que permite o de s envolv i mento de aplicações Java EE). deixando de fora coisas como a criação de um atalho na área de trabalho.2RC-2 (segundo Release Candidate). Afinal.org/downloads Página de downloads do Eclipse. perspectivas e outros recursos acrescentados ao IDE. exceto para usuários já familiarizados com os projetos em questão. as mensagens de erro do Update Manager não serão úteis. onde foi selecionado o VE + GMF. entretanto. Ao fim do processo. o usuário poderá ver os novos menus. Por exemplo. a l g u mas dependências do Callisto parecem estar erradas.eclipse.org/callisto Página principal do Eclipse Callisto eclipse. Nem sempre o Update Manager será útil para quem não conhece os projetos que deseja instalar. ou então serão induzidos a baixar o “Eclipse SDK” e gastar dezenas de megabytes de disco (além de muito tempo de conexão internet) com fontes e plug-ins que eles provavel mente não irão utilizar tão cedo. o VE.t icamente rei n iciado ao final para ativar os novos recursos. Edição 38 • Java Magazine jm38. Em alguns casos. O objetivo de liberar simultaneamente novas versões finais de dez projetos complexos foi bastante ambicioso. General Availability) é quase isso. ele representa um grande avanço em relação à busca e download manual de cada distribuição de cada plug-in fornecido pelos vários projetos da Fundação Eclipse. Segundo qualquer critério de avaliação. Figura 6. muitos não saberão distinguir “x86_64 GTK 2” de “x86 /Motif” na página de dow n lo ad s d a Fu n dação. eclipse. que pede o plug-in “org. Figura 5. pois irão relacionar nomes de plug-ins que muitas vezes não fornecem qualquer “dica” de qual projeto ou feature é fornecido. Seleção do diretório de instalação para cada feature. A l é m d i s s o.batik”. nenhuma feature tem um nome parecido com “draw2d”. que embora não seja uma versão final (GA. Dependências Figura 4. Conclusões Embora o Callisto ainda não forneça a maneira “mais fácil” de se instalar o Eclipse. que foi incluso no Callisto com a versão 1. Apenas um projeto falhou com o objetivo. . Maps. Um detalhe é que. Talk. buscar por Java Magazine (sem aspas) usando a API. que pode ser criada no mesmo site (se você tem uma conta no GMail ou no Orkut. clique no link fornecido no segundo passo (“Create a Google Account”). de país ou de tópicos. para fazer isso no programa Java. Este objeto contém os resultados da busca e algumas informações adicionais. A melhor maneira de se encontrar as informações desejadas usando o Google é construir uma boa consulta. pode ser usada qualquer outra linguagem que suporte web services: o kit de desenvolvimento inclui o descritor do web service publicado pelo Google (GoogleSearch. como o tempo de busca e o total estimado de resultados. Desktop. o problema estaria resolvido. Spreadsheets. SketchUp. com uma caixa de texto e dois botões. até o sofisticado Google Earth. O k it de desenvolvimento contém o JAR da biblioteca e exemplos de uso em Java. usando o metodo setQueryString() – semelhante ao que seria feito normalmente no site google. As buscas são feitas definindo uma expressão de consulta. A chave permite a realização de até mil pesquisas automatizadas por dia. basta adicionar a biblioteca googleapi. Há um mecanismo mais elegante para limitar consultas. executando a consulta “\”Java Magazine\” -JavaWorld -Amazon”. C# e Visu al Basic.Google Search A Incremente suas aplicações Java com con T odo usuário de internet percebe o papel que o Google representa na vida on-line. poucos são os internautas que não usam um dos produtos Google: Gmail. ou seja. Para obter a chave. como mostrado na Listagem 1. Tendo a conta criada. O site google. as aspas devem ser “escapadas” com o caractere “\” para que façam parte da string ao invés de delimitá-la. e a lista não para de crescer. Em Java.com – e depois invocando o método doSearch(). A classe GoogleSearch contém métodos para busca.search.soap. Mas mudar a maneira de como usamos a internet parece não ser suficiente para o Google. é necessário ter uma conta do Google. Por exemplo.wsdl) e exemplos de requisições (no diretório soap-samples).GoogleSearch e configurar nele a chave usando o método setKey(). se antes de buscar por “Java Magazine” configurarmos 60 Java Magazine • Edição 38 jm38. veremos como usar a Google Search API. Finance. entre outras operações. buscar o termo composto pelas duas palavras na ordem dada. Além destas. Um contorno seria excluí-los manualmente dos resultados com o operador “-“. O método setRestrict() da classe GoogleSearch permite que sejam impostas restrições de idioma. colocando o conjunto entre aspas. Um exemplo de uso do método doSearch() pode ser visto na Listagem 1. sugestão ortográfica e obtenção de páginas em cache. Por exemplo. obter sugestões de correção ortográfica e ler páginas armazenadas em cache. Calendar. a consulta seria “\”Java Magazine\””. Pages. Neste artigo.com/apis lista os passos necessários. faça o login e uma chave será enviada para seu e-mail no GMail. e sites de peso em língua inglesa como Amazon e JavaWorld tendem a aparecer primeiro nos resultados. Se a consulta fosse feita através de um navegador web.indb 60 17/7/2006 14:13:27 s . que retorna um objeto da classe GoogleSearchResult. basta fazer o download do kit de desenvolvimento. Como se vê.jar ao classpath. instanciar um objeto da classe com.. Uma primeira melhoria seria ao invés de buscar separadamente os termos Java e Magazine. Instalação e uso Buscas Para usar a Google Search API.google. Mas o web service utilizado pela API não recebe as informações de localidade submetidas pelo navegador. que está oferecendo cada vez mais ferramentas e APIs para que desenvolvedores possam explorar os produtos e tecnologias da empresa em suas próprias aplicações. dificilmente retornará o site desta revista como o primeiro dos resultados. descompactá-lo em algum local do disco e obter uma chave. Desde o inicialmente modesto site de busca. como será mostrado a seguir. para realizar buscas de vários tipos. já tem uma conta no Google). Analytics. java. Conhecer um pouco do funcionamento da internet também ajuda na hora de montar suas consultas. Por exemplo.google.search.h API Use o poder do mecanismo de busca que revolucionou a internet dentro de suas aplicações Java. result.google.getEstimatedTotalResultsCount()). buscar(“Faerman site:www. buscar(“CMMI filetype:doc OR filetype:pdf”). System.getURL()).getSearchTime().getResultElements()) { System.out.com”).GoogleSearch.getSnippet()). if (sugestao == null) { System. import com. busca. busca. import com. //Buscas buscar("Java Magazine").setMaxResults(5).setKey(clientKey). o site da JM será o primeiro resultado (veja a Listagem 1). System. buscar(“Java Magazine”). System. com exemplos de uso. public static void main(String[] args) throws Exception { String clientKey = null.search.br”).doSearch().println(“######”).out.out. A lista completa de operadores suportados pela API. buscar(“jsf OR struts”). buscar(“-inurl:htm -inurl:html intitle:\”index of\”” + “+(\”/ebooks\”|\”/book\”)+( chm|pdf|zip) lewis alice wonderland”). //Pagina em cache obterPagina(“www.setRestrict(“linux.com.javamagazine. buscar(“jsf inurl:java”).search. Exemplo de uso da Google Search API package jm.GoogleSearchResultElement. result. } public static void sugerirOrtografia(String palavra) throws Exception { String sugestao = busca.doGetCachedPage(pagina))).getTitle()).printf(“Busca: %s Tempo: %f s Resultados: %d\n”.println(“Titulo: “ + element.com.soap. buscar(“info:www. }   }  public static void buscar(String consulta) throws Exception { busca. para buscar documentos sobre (digamos) CMMI em arquivos PDF ou DOC. sugerirOrtografia(“lumbriga”).println( “uso: java -cp <classpath_incluindo_googleapi. GoogleSearchResult result = busca.println(“URL:” + element.javamagazine. sugerirOrtografia(“philosophy”). buscar(“link:www.println( “Sem sugestões para \”” + palavra + “\”. //Configuração busca. public class GoogleSearchDemo { static final GoogleSearch busca = new GoogleSearch().br”). System.soap.br”).com”). } else { System. buscar("\"Java Magazine\" -JavaWorld -Amazon").println(new String( busca.br” retorna as paginas do site da JM com artigos deste autor. Por exemplo.javamagazine. } Edição 38 • Java Magazine jm38. uma boa consulta Listagem 1.google.out. buscar(“blackdown”).out.out.jar>” + “ GoogleSearchDemo <clientKey>”). result. buscar(“related:www. } else { System. import com. Além do método setRestrict(). O quadro “Restrições” mostra outras restrições suportadas. buscar(“java daterange:2453371-2453736”).soap. //Sugestoes Ortograficas sugerirOrtografia(“filosofy”). e conheça técnicas avançadas de pesquisa sultas ao Google JULIo FaerMan a restrição “countryBR”. buscar(“allintext:Service Oriented Architecture”). outros limitadores e termos especiais podem ser i ncluidos na própria expressão de consulta.java.GoogleSearchResult.com.doSpellingSuggestion(palavra). }  for (GoogleSearchResultElement element : result.com.err.setRestrict("countryBR").”).out. sugerirOrtografia(“filosopia”). pode ser vista no quadro “Operadores”.out.length == 1) { clientKey = args[0]. if (args.println( “Voce quis dizer \”” + sugestao + “\”?”). a consulta “Faerman site:www.-lang_en”).println(“Trecho: “ + element. buscar(“hibernate intitle:OnJava”).exit(-1).getSearchQuery(). } }  } public static void obterPagina( String pagina) throws Exception { System.indb 61 61 17/7/2006 14:13:31 .setQueryString(consulta).javamagazine. System. busca. Por último. Limitações A Google Search API é uma oferta 1 Obra de Lewis Caroll publicada em 1865 e em domínio público desde o início do século passado. também ajuda acrescentar como critério os formatos comuns de livros eletrônicos – zip. para buscar um termo comum ou com muitos documentos relacionados. exceto em formato PDF info:www. ser mostrado em um navegador web. ou null se não houver sugestão. o Google é capaz de verificar em seu índice gigantesco que esta não é a forma mais freqüente da palavra.com. Páginas em cache No processo de indexação de uma página. é retornado o termo correto “Philosophy” (veja Listagem 1). adicionamos os termos da consulta. Uma maneira simples para obter páginas em cache é mostrada na Listagem 1. o título e a URL.br Informações sobre o site da JM* link: Referenciam link:www. deve ser fornecido o número de dias corridos desde 1 de Janeiro de 4713 a. que será retornada a sugestão de ortografia. ignorando título. E como páginas web não interessam.net Posts contendo o nome Gosling nos blogs do site java.br Páginas com links para o site da JM* Related: Relacionados related:www.Usando a Google Search API seria “CMMI filetype:doc OR filetype:pdf”. como “book” ou “ebooks”. por exemplo o título do livro e o nome do autor. links e URL. como o livro “Alice no País das Maravilhas” (Alice’s Adventures in Wonderland)1. que retorna o código HTML da página. A mesma funcionalidade está dispon ível na API at ravés do método doSpellingSuggestion() da classe GoogleSearch.java. Todas essas buscas são exemplificadas na Listagem 1.javamagazine.com. Sendo assim. Esta versão arquivada pode ser obtida usando o método doGetCachedPage(). “source” e “java” no corpo da página. ou seja. Curiosamente. as datas precisam estar no formato Juliano.com Obtém a cópia do cache do Google da página inicial do site comercial de Java da Sun. cujo título costuma ser “index of”. e educadamente sugerir: “Você quis dizer: JavaScript?”. Esse documento pode ser facilmente reexibido por um componente gráfico ou uma taglib. ignorando o texto. chm. Sugestões de ortografia Quando se faz uma consulta no site do Google usando um termo incomum ou com erros de digitação/ortografia. Normalmente seria ignorado por ser uma palavra muito comum em inglês “” OR site: Exclui Frase Ou No Site windows -microsoft Páginas com “windows” e sem “microsoft” “Java Magazine” Busca a frase toda ao invés dos termos separados jsf or struts Páginas com um ou outro termo gosling site:weblogs.java.c. ou. podemos remover endereços com extensões de páginas. é melhor buscar por páginas de índice de diretórios. como htm e html. filetype: Tipo de arquivo Subversion book filetype:pdf Livros sobre o software de gerência de configuração Subversion em PDF -filetype: info: Exceto tipo de arquivo Sobre Subversion book -filetype:pdf Livros sobre o Subversion.com.javamagazine. txt ou pdf. * Deve ser o único termo da consulta 62 Java Magazine • Edição 38 jm38.net daterange: Entre datas java daterange:2453371-2453736 Páginas com o termo “java” publicadas em 2005. intitle: allintitle inurl: allinurl: No título Todas no título Na URL Todas na URL hibernate intitle:OnJava Páginas sobre Hibernate cujo titulo contenha “OnJava” allintitle:Java Magazine Páginas com os termos Java e Magazine no título inurl:google Páginas com o termo “google” no endereço allinurl:google sketchup Páginas com os termos “google” e “sketchup” no endereço allintext: No texto allintext:open source java Páginas com os termos “open”. Por exemplo. Entretanto.indb 62 17/7/2006 14:13:34 . allinlinks: Nos links allinlinks:google Páginas com o termo “google” nos links. o Google armazena uma cópia em cache. é claro.br Páginas semelhantes à da JM* cache: Cópia em cache cache:www. 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. Neste caso. Operadores Os termos a seguir possuem interpretação especial e podem ser incluídos na expressão da consulta: Operador Significado Exemplo Intenção + Inclui to be +or not to be Incluir o “or” na pesquisa. como “javascripiti”. ao buscar por “Filosofy”. e num diretório de livros. Basta passar o termo como parâmetro. uma busca por tipo de arquivo dificilmente retornaria o livro.javamagazine. Como desejamos o arquivo do livro. As aplicações mais beneficiadas diretamente são aquelas que lidam com gerência de conteúdo e sites. podem ser dribladas.jar. se este não estiver configurado).countryBR Resultados apenas do tópico linux de sites no Brasil | Ou lang_br | lang_en Resultados apenas em português ou inglês () Precedência (linux). countryPY (Paraguai). no entanto. ou que tratem de alguns tópicos indexados separadamente.. Restrições Combinadas – setRestrict() ou setLanguageRestrict() Operador As restrições podem ser combinadas usando os operadores lógicos mostrados na tabela ao lado. “movie:”. Por exemplo.lang_de (Alemão). Deve ser passada como parâmetro a chave de uso (além do classpath. Significado Exemplo Descrição - Não -lang_pt Exclui resultados em português . google. Por brevidade. countryUS (Estados Unidos). só podem ser usados no site. Executando o exemplo Para testar as consultas sugeridas.) Tópico – setRestrict() unclesam (Governo norte-americano). foram apresentadas aqui apenas uma seleção de idiomas.GoogleSearchDemo (Listagem 1). MBA em Gerência de Projetos e Mestrando da Universidade Federal de Uberlândia. Abaixo estão exemplos de restrições que podem ser utilizadas e qual método da classe GoogleSearch usar para configurá-las: Idioma – setLanguageRestrict() lang_pt (Português).Restrições R estrições fazem com que a consulta busque apenas em páginas de um determinado país.com. “define:”.zip Edição 38 • Java Magazine jm38. etc.com Guia de uso para buscas do Google (criado por terceiros) undergoogle. countryEU (União Européia). experimental do Google. para aplicações corporativas. “stocks:”. SCDJWS e SCEA(I). lang_en (Inglês). a sugestão ortográfica é capaz de corrigir termos mais comuns em português. como “Filosopia”. Mas com um pouco de criatividade você poderá usar a API para incrementar praticamente qualquer aplicação. principalmente pelas limitações da sua versão atual.google. e surpreender seus usuários. na área de Inteligência Artificial.com/enterprise1 Portal para desenvolvedores (clientes corporativos) www. Não há previsão pública de se estender o serviço.GoogleSearchDemo sua_chave Conclusões A Google API é poderosa e bastante funcional.blogspot. SCBCD. países e tópicos. lang_es (Espanhol).br/downloads/jm38/ jm-googleapi. Outra limitação é que apenas um subconjunto dos operadores de busca do site está disponível para a API. linux (Sistema Operacional Linux). Entretanto. Algumas destas limitações.com/apis Site principal da Google Search API code. basta executar a classe jm. que é um produto à parte (veja links). A lista completa pode ser vista em google. como Images e Froogle. ou que sejam escritas em um dado idioma. ou outros serviços. por exemplo permitindo que cada usuário cadastre sua própria chave de acesso. jm. mac (Computadores Macintosh). a API é muito mais precisa para termos e sites americanos.html ou em googleguide. com/apis/reference. Certificado SCJP. existe uma API semelhante baseada no servidor de busca corporativo do Google. podendo mostrar conteúdo semelhante ou suges- tões de ortografia. Por exemplo (em uma linha): java -cp c:\Java\GoogleAPI\googleapi.html.google. Por exemplo. como “Lumbriga”.com/advanced_operators_reference. mas falha em outros pouco publicados.html.indb 63 63 17/7/2006 14:13:39 . bsd (Sistema Operacional FreeBSD).(-(countryUS|countryUK)) Resultados do tópico linux que não estejam nos EUA ou no Reino Unido Por último. SCWCD.com) é consultor independente em desenvolvimento de sistemas corporativos e melhoria de processos de software. Mas colocar essa biblioteca de consultas em prática numa aplicação pode não ser tão simples.com Blog com dicas e notícias do Google javamagazine.com Portal para desenvolvedores (geral) code. País – setRestrict() countryBR (Brasil).googleguide. lang_fr (Francês). Julio Faerman (jfaerman@gmail. countryPT (Portugal). integrando-a ao mais popular mecanismo de busca mundial. que está também disponível no site da Java Magazine. pelo volume que estes representam no índice total. (Estas e outras opções de busca podem ser conhecidas em google.com/help/cheatsheet. limitada a aplicações não-comerciais e a apenas mil consultas por dia. E linux. bacharel em Ciência da Computação. e repleta de tarefas tediosas. O GWT abstrai a linguagem JavaScript a partir de uma biblioteca de classes Java. O seu objetivo é esconder do programador a implementação de código JavaScript. na qual está disponível uma coleção de componentes visuais AJAX (os widgets). por permitir que o desenvolvedor utilize a IDE Java de sua preferência. Este tutorial apresenta o GWT e traz um exemplo de implementação utilizando o framework. por exemplo o GMail e o Google Maps. por exemplo. pilador. por exemplo. as vantagens da linguagem Java são bem a p r o ve i t a d a s . Vantagens do uso de classes Java A principal novidade apresentada pelo GWT é o uso de classes Java para representar os componentes visuais da aplicação. Além disso. O uso de código Java é vantajoso. como o tratamento de incompatibilidades entre navegadores. Estas classes são convertidas em código JavaScript por um com- 64 Java Magazine • Edição 38 jm38. considerando que esta tarefa é repetitiva e propensa a erros. com o uso de uma IDE.indb 64 17/7/2006 14:13:43 . já conhecidos dos que usam as aplicações AJAX do Google. já que o GWT é independente do ambiente de desenvolvimento.AJAX com Google W Escrevendo Aplicações Web Altamen te O Google Web Toolkit (GWT) é um framework que define um novo paradigma de desenvolvimento de aplicações AJAX. distribuído no pacote do próprio framework. e Web Toolkit en te Interativas em Java Crie aplicações AJAX a partir de classes Java. A utilização desse Eclipse se justifica porque o GWT traz ferramentas que automatizam o processo de criação de projetos para esse IDE.21 do GWT.0.util) distribuído no formato ZIP e tem 13. A segunda ferramenta é um navegador web local. O exemplo deste artigo é implementado utilizando o Eclipse com o WTP (Web Tools Project). baixar o pacote a partir da página do framework. claro. Arquitetura do Framework Um modelo da arquitetura do GWT é apresentado na Figura 1. Será necessário criar um diretório para conter os arquivos do Figura 2.TutorialGWT é. O navegador local é capaz de exibir os componentes das bibliotecas sem a necessidade da conversão de código. Arquitetura do Google Web Toolkit. de configuração para Windows. serão utilizados dois utilitários fornecidos com o GWT: applicationCreator e projectCreator.lang e java. A camada de bibliotecas contém uma biblioteca de componentes visuais e uma biblioteca de emulação Java. A partir do diretório criado para o projeto.indb 65 65 17/7/2006 14:13:46 . Em seguida. Para isso.9 MB. Estrutura do projeto de exemplo. Estas duas bibliotecas compõem a infra-estrutura básica necessária para representar os componentes AJAX utilizando código Java. que evita que o desenvolvedor tenha de converter o seu código Java em JavaScript cada vez que desejar realizar um teste.lang e java. A arquitetura é dividida em duas grandes camadas. A primeira é o compilador de Java para JavaScript. com referências às tutorial iremos apresentar as instruções bibliotecas já configuradas.javamagazine. que traz a implementação de algumas classes dos pacotes java. Neste projeto para o Eclipse. Foi utilizada a versão Biblioteca de emulação Java Bibliotecas 1. utilizando o novo framework do Google. Neste dire. e deixe que o trabalho pesado seja feito para você doUGLas JosÉ soares rodrIGUes a verificação de tipos pelo compilador e a capacidade de completar código ao ser digitado.client. execute este comando (numa mesma linha): applicationCreator –eclipse TutorialGWT O primeiro passo para utilizar o GWT br. O GWT encontra-se Será criada a estrutura básica de um disponível para Windows e Linux. A outra camada do GWT é composta por duas ferramentas. execute o comando a seguir: projectCreator –eclipse TutorialGWT Isso cria o projeto. e alguns utilitários para a configuração de projetos. Criando um projeto O primeiro passo é a criação de um projeto e uma aplicação. o pacote é componentes visuais (java. tório estarão as bibliotecas do GWT. Recomenda-se também adicionar o diretório do GWT à variável de ambiente PATH.com.Figura 1. para facilitar a criação do projeto. A instalação é bastante Compilador Java Navegador Ferramentas simples: basta descompara JavaScript Local pactar o arquivo ZIP em um diretório de sua preferência. Instalação projeto. lembranbasta importar o projeto criado (item de do que o procedimento é bastante semelhante para o Biblioteca de Linux. No Eclipse.util. Edição 38 • Java Magazine jm38. que é responsável por gerar o código JavaScript representando os componentes visuais utilizados. setText(“”).get(“lastName”).client.javamagazine.toLowerCase()) != -1) { lista. String email.getText().setText(“”).indexOf( filtro. final TextBox lastName = new TextBox(). RootPanel.get(i). } }). // Listener que trata o clique no botão ‘Remover’ deleteContact. email.gwt.addClickListener(new ClickListener() { public void onClick(Widget sender) { inserirContato( list..height:0.ui. final ListBox list = new ListBox().com.add(filter).google. final TextBox filter = new TextBox(). filtrarLista(list. filter.indb 66 17/7/2006 14:13:46 .gwt.TutorialGWT’> </head> <body> <script language=”javascript” src=”gwt. String firstName. filter. public void onModuleLoad() { final Label label = new Label(“Filtro:”). RootPanel.getSelectedIndex(). TutorialGWT.list {width: 100%. if (item..addKeyboardListener(new KeyboardListenerAdapter() { public void onKeyUp( Widget sender.w.*.p{font-family:arial. String filter) { String novoContato = lastName + “. import com.com.add(novoContato). final Button insertContact = new Button(“Adicionar”). filtrarLista(list.size(). import com.core.get(“text”). RootPanel. int modifiers) { filtrarLista(list. char keyCode. private void inserirContato(ListBox list.a. String filtro) { lista. } // Listener que trata o clique no botão ‘Adicionar’ insertContact.setText(“”).add(insertContact). i < itens. for (int i = 0. filter. RootPanel.div. } private void filtrarLista(ListBox lista. i++) { String item = (String) itens.} </style> <meta name=’gwt:module’ content= ’br.html <html> <head> <title>Tutorial GWT</title> <style> body. // Numero de itens exibidos list. TutorialGWT.add(email). RootPanel. RootPanel.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.get(“label”).setVisibleItemCount(5).td. String lastName.getText()).add(label).getText()). firstName. firstName. lastName.AJAX com Google Web Toolkit Listagem 1.java package br.add(firstName).getText().user. } } } 66 Java Magazine • Edição 38 jm38.remove(i).js”></script> <iframe id=”__gwt_historyFrame” style= ”width:0.clear(). final Button deleteContact = new Button(“Remover”).addItem(item). final TextBox email = new TextBox(). itens. } }).get(“email”). //Contatos cadastrados list.getText()).</td> <td id=”firstName”></td> </tr> <tr> <td>Sobrenome:&nbsp.get(“removeContact”).getText(). final TextBox firstName = new TextBox(). “ + firstName + “ (“ + email + “)”.</td> <td id=”lastName”></td> </tr> <tr> <td>E-mail:&nbsp.w a:link{color:#0000cc} a:visited{color:#551a8b} a:active{color:#ff0000} .addClickListener(new ClickListener() { RootPanel.add(lastName).add(list).sans-serif} div.get(“firstName”).*.client.javamagazine. RootPanel. public class TutorialGWT implements EntryPoint { private List itens = new ArrayList(). email.google. list.util.setStyleName(“list”).. } // Listener que trata cada caractere // digitado no campo de filtro filter. import java. public void onClick(Widget sender) { int i = list. lastName.add(deleteContact). itens.</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. } }).toLowerCase().addItem(novoContato).td{color:#000000} a:link.client.get(“insertContact”). filter).get(“list”).EntryPoint. cmd. onde é possível cadastrar nome.indb 67 67 17/7/2006 14:13:51 . São definidos oito IDs. No pacote de download já estão inclusas todas as ferramentas necessárias.br/downloads/jm38/ jm-gwt. se comparado ao que foi gerado. e que não há nenhum tipo de requisição feita ao servidor web (embora isto possa acontecer na solução de outros problemas). code. Isso gera o código JavaScript e cria o diretório www/br. foi criado um pequeno catálogo de endereços. e remover os contatos já cadastrados.list é definido para posicionar a lista na tela corretamente.com) é formado em Ciência da Computação pela Unicamp e trabalha como consultor Java há quatro anos. O próximo passo é implementar a classe TutorialGWT. mantendo os dados numa coleção em memória. No exemplo. dê um duploclique em TutorialGWT-shell. Assim que o conteúdo desse campo for alterado. Janela de log do navegador local.TutorialGWT. só o Eclipse é suportado) é muito simples. o problema que iremos resolver é a criação de uma busca incremental. uma Figura 3. Serão exibidas duas janelas. Executando e compilando Após editar os arquivos HTML e a classe Java. faça a compilação do projeto com um duplo-clique (dentro do Eclipse) no arquivo gerado TutorialGWT-compile.com/webtoolkit/ Google Web Toolkit eclipse. É uma solução robusta para o desenvolvimento AJAX com o suporte de uma empresa renomada. Para executar o projeto. Edição 38 • Java Magazine jm38.zip Figura 4. ou seja. e o modifique para que corresponda ao conteúdo da Listagem 1. Implementando o projeto de exemplo Neste tutorial. para que as configurações sejam automaticamente aproveitadas. Conclusões O GWT mostra-se um framework extremamente eficiente e bem escrito.com. uma busca realizada conforme caracteres são digitados.google. e sua integração com a IDE (atualmente. E o estilo . O exemplo também demonstra como fazer um cadastro simples. com arquivos HTML.menu File>Import>Existing projects into workspace).cmd. Usuários do navegador Firefox estão acostumados com esta funcionalidade (basta pressionar Ctrl+F para abrir o painel de busca). lista irá exibir apenas os elementos que correspondam ao filtro digitado. gerado pelo toolkit.html.org/webtools Projeto Eclipse Web Tools javamagazine. A busca incremental é usada para filtrar os contatos já cadastrados. que irá descrever o comportamento da busca incremental. Observe que o arquivo muda pouco. Nesta classe são definidos métodos auxiliares para o preenchimento inicial da lista e para realizar a busca na lista por um determinado filtro. lista) são tipos de campos de formulários HTML comuns. uma com o log da execução da aplicação (Figura 3) e outra com o navegador exibindo a aplicação em execução (Figura 4). sobrenome e e-mail de um contato. O código completo para a classe pode ser conferido na Listagem 2. que correspondem aos locais onde serão exibidos os componentes definidos na classe Java. Exemplo de cadastro e busca incremental.com. exibido no navegador Douglas José Soares Rodrigues ([email protected]. Abra o arquivo TutorialGWT. Observe que todos os componentes usados (campo de texto. Usaremos uma campo de texto comum para conter o filtro para a busca. A estrutura do projeto deve ficar como na Figura 2. indb 68 17/7/2006 14:14:12 ci .Formatação e Conver s Estendendo o framework e aumentando a capa 68 Java Magazine • Edição 38 jm38. Dessa forma. que será a URL chamada pelo formulário no momento da postagem. vamos construir uma aplicação simples. um FormBean e uma Action. observe que não temos atri- butos do tipo String. ou quando há um processo de validação e o usuário é redirecionado ao mesmo formulário seguido dos erros encontrados. além de não se aplicar aos DynaActionForms (representações dinâmicas de formulários configuradas no struts-config. por exemplo. com dois atributos: nome e classe. Não nos importa neste ponto o que será feito depois com estes valores. um formulário de edição que já possui os dados populados. Note que. Quem utiliza o framework sabe da dificuldade para se tratar. após a execução da Action. A configuração é simples. como mostra a Listagem 1. e acaba utilizando strings para representar muitas informações que vêm do usuário. Usamos o nome formBeanTeste e a classe FormBeanTeste. 03 ou 06? Para nós brasileiros. Solução proposta Para demonstrar nossa solução.BigDecimal. Note que para a construção do formulário utilizamos as tags do Struts <html:form> e <html:text>. A Listagem 4 mostra o conteúdo do arquivo struts-config. Por exemplo. O Struts tenta converter essas strings para os formatos mapeados no FormBean (classe que representa um formulário). O FormBean que representa este formulário terá dois atributos. que oferece vantagens. com uma página JSP. Primeira parte da solução Neste estágio. mas poderíamos igualmente utilizar um DynaActionForm.r são no Struts pa cidade da sua aplicação web Utilize Converters para resolver problemas de conversão no Struts e deixe seus FormBeans mais completos arI dIas neto O Struts oferece muitas funcionalidades para o tratamento da entrada de dados.indb 69 6 17/7/2006 14:14:37 . Esse retorno simula. por exemplo. estes chegam ao servidor em forma de strings. a classe. um do tipo java. Isso porque faremos o Struts configurar o FormBean com os tipos corretos. existiriam no FormBean dois métodos: um para converter para o tipo correto no momento da entrada dos dados. Usaremos uma classe concreta para representar o formulário.xml.Date e outro do tipo java. e o mais importante: o nome do FormBean. Aqui veremos uma solução alternativa.xml). o mês será 10. O exemplo completo está disponível no site da Java Magazine. O JSP. Logo em seguida. em uma data como 10/03/06. O problema dessa solução é que ela se repetirá para todos os formulários que precisam da conversão. e caso não consiga. através do atributo name. através do atributo type. o primeiro para uma data e o segundo para um número decimal. Ela faz apenas um forward para o JSP com o formulário (veja a Listagem 3).math. constrói um formulário com dois campos de texto. quando o usuário entra com valores em um formulário e os envia. a aplicação ainda não fun- Edição 38 • Java Magazine jm38. O nome deve ser o mesmo dado na configuração do FormBean. Primeiro definimos um formulário dentro do elemento <form-beans>. Nosso objetivo aqui é fazer com que o Struts configure o FormBean com seus devidos atributos. ou pior: os valores podem ser tratados de forma equivocada. Como sabemos. A Action tem uma implementação simples. Configuramos o path. Veja a Listagem 2. temos a configuração da Action dentro do elemento <action-mappings>. fica claro que o mês é março – mas e para o sistema? Uma das soluções mais utilizadas é criar métodos no FormBean para tratar os dados enviados. o próprio framework irá converter os dados enviados pelo usuário para Date e BigDecimal.util. datas e números decimais.jsp) pois também precisamos exibir/formatar os dados corretamente. mas possui ainda algumas limitações nessa área. iremos retornar para a mesmo formulário (index. ou seja. recebemos erros pouco explicativos ou páginas em branco. e outro para converter para string no momento da exibição. Converter. Infelizmente. package br. usamos o formato “dd/MM/yyyy”. import org.math. * Date dataEnviada = meuForm. e continuar chamando o método init() da superclasse. com dois campos: um Date e outro BigDecimal. Esse servlet deve fazer tudo que o ActionServlet faz. Assim que o usuário preencher o formulário e clicar em Enviar. É justamente neste servlet que podemos interferir Listagem 1.action.Formatação e Conversão no Struts cionará. Observe que apenas iremos redefinir o método init() e adicionar as linhas que registram os converters corretos.xml. deixando para as Actions a responsabilidade de responder à requisição e de definir o que será retornado para o usuário. Você já deve ter ouvido falar que o Struts implementa o design pattern Front Controller (veja links).action. como o Tom- 70 Java Magazine • Edição 38 jm38. // … imports public class PerformPostAction extends Action { } public ActionForward execute(ActionMapping mapping.java: Classe que representa o formulário. pois há atualmente uma incompatilidade entre esse conversor e o Struts. <%@ 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.getData(). Rode a aplicação em qualquer container web. Se houver algum erro. Então. iremos criar a nossa própria classe que implementa a interface org. index.xml. um valor padrão poderá ser retornado. iremos substituir. receberá um erro. Métodos get/set Listagem 3. por exemplo.com.indb 70 17/7/2006 14:14:43 . apontando para a nossa. private BigDecimal valor.FormBeanTeste”/> </form-beans> <action-mappings> <action path=”/PostFormularioAction” type=”br. import java. É aí que entra a nossa solução. Isso significa que ele possui um controlador que gerencia o tratamento das solicitações. import java. HttpServletResponse response) throws Exception { /* Neste ponto pode-se obter os valores enviados já com os tipos corretos.apache.java: Action que apenas retorna para o formulário com o forward “sucesso”. } Listagem 4. PerformPostAction.struts. Isso acontece porque o Struts tenta converter os dados postados para os tipos correspondentes no FormBean. A Listagem 5 mostra como fica nosso servlet.com. ActionForm form.BigDecimal.jm. <struts-config> <form-beans> <form-bean name=”formBeanTeste” type=”formbean.Object e o tipo de classe para qual deverá converter o Object.apache.action.Date. além de registrar os converters corretos para Date e BigDecimal. que está configurado no arquivo web.jm. FormBeanTeste. de String para Date).ActionForm. */ return mapping. utilizamos a classe DateLocaleConverter do projeto Jakarta Commons BeanUtils (veja links).lang. para o conversor de BigDecimal não podemos ainda utilizar o BigDecimalLocaleConverter (também do BeanUtils). vamos fazer um teste.beanutils. e não consegue..xml: com a configuração de um FormBean e uma Action. no arquivo web..ActionServlet. Além disso.xml antes e depois da substituição (apenas a parte alterada).apache. Passamos como parâmetros o locale e o formato da data que chegará ao converter.com.action.jsp”/> </action> </action-mappings> </struts-config> e registrar os nossos converters (classes que executam conversões de tipos. Vamos agora aos converters. Vamos chamá-la de BigDecimalConversor (Listagem 7). / por exemplo: * * FormBeanTeste meuForm = (FormBeanTeste)form. a implementação de exemplo já faz o tratamento de exceções. A Listagem 6 mostra a configuração do web. Para o converter de data. A classe BigDecimalConversor terá um método converter() que receberá dois parâmetros: um java. HttpServletRequest request.util. o servlet do Struts por um servlet nosso (que estende o do Struts): MeuStrutsServlet. O Front Controller do Struts é o servlet org. Neste caso. package br.PerformPostAction” name=”formBeanTeste”> <forward name=”sucesso” path=”/index.findForward(“sucesso”). Simplesmente trocamos a classe do servlet.commons.jsp: Página com o formulário de exemplo.formbean.jm. Como registramos o conversor para apenas o tipo BigDecimal converteremos sempre para esse tipo. public class FormBeanTeste extends ActionForm { private Date data.struts. } //. Para tal. Por padrão o Struts não vem com os conversores corretos para BigDecimal e Date. Testando os conversores Agora que já temos os conversores prontos. struts-config. Date. new BigDecimal(“0”).java: Servlet que registra os converters e substitui o servlet do Struts. após a requisição nenhum erro ocorrerá.jm.BigDecimalConversor. A tag <html:text> não trata os atributos do FormBean levando em conta os padrões locais.ServletException. java.apache. o Struts terá utilizado os nossos converters. não foi feita a formatação correta.converters. Por isso muitos desenvolvedores colocam métodos Listagem 5.ConvertUtils. Os dados foram convertidos corretamente.locale. import org. //criação dos conversores DateLocaleConverter dateConverter = new DateLocaleConverter(locale. Mas ainda temos um problema. Preencha o formulário conforme a Figura 1 e envie os dados. ou seja. import br.init(). “BR”). public class MinhaStrutsServlet extends ActionServlet { public void init() throws ServletException { super.struts. A data não está formatada para o padrão configurado no converter.DateLocaleConverter.jm. } } //registro dos conversores ConvertUtils.servlet. porém ao ser reexibido o formulário.jsp.converter.commons.util.class).apache.BigDecimal. import import import import java. A primeira página a ser exibida será a index. package br.class).register(dateConverter.math. Date. BigDecimal.apache. import org. Note que tanto a data como o número decimal estão com formatações erradas após o retorno (veja a Figura 2).com. Isso acontece porque os converters tratam a entrada de dados. javax.ActionServlet.register(bigDecimalConversor.beanutils.Locale.cat.com.action.commons. mas não a exibição.servlet.indb 71 71 17/7/2006 14:14:52 . Edição 38 • Java Magazine jm38. ConvertUtils. Locale locale = new Locale(“pt”.beanutils.“dd/MM/yyyy”). true). import org. java.util. Se tudo correr bem. MeuStrutsServlet. BigDecimalConversor bigDecimalConversor = new BigDecimalConversor(locale. e o número decimal não está com a notação brasileira. beanutils. Formulário preenchido com valores de teste. } } } } private Object parse(Object valor) throws ParseException { DecimalFormat formatter = (DecimalFormat) DecimalFormat. BigDecimalConversor.action. O arquivo struts-html. Chegamos à segunda parte da solução.commons.jm. BigDecimal valorPadrao.tld e uma nova classe que estende a tag do Struts. no entanto.util.apache. java. Exibição do formulário após seu envio.useValorPadrao = useValorPadrao. import org.taglib.valorPadrao = valorPadrao. Data e Valor com formatação. this. Object valor) { try { Object resultado = parse(valor). além de indicar a classe que implementa a tag. A Listagem 9 mostra a classe da nossa taglib. return formatter. } return new BigDecimal(resultado. } public Object convert(Class classe. por isso temos que fazer a alteração apenas na parte referente à tag <html:text>.math. this. A Listagem 8 mostra o trecho relevante do arquivo de configuração antes e depois da mudança. } catch (Exception ex) { if (useValorPadrao) { return valorPadrao. import import import import java. Note que alteramos a linha onde está a definição da classe: o nome da classe muda de org. 72 Java Magazine • Edição 38 jm38. deixando o desenvolvimento mais lento e diminuindo a reutilização do código. Segunda parte da solução <html:text> formate o conteúdo que irá exibir. private BigDecimal valorPadrao. pois não altera nenhum arquivo original do Struts e deixa o código nas páginas JSP mais légivel.Formatação e Conversão no Struts no FormBean para formatar estes dados antes da exibição. Este método será chamado antes da exibição do conteúdo e tem implementação simples. Figura 1.TextTag para br.jm. Aqui é importante lembrar que as taglibs são configuradas em arquivos chamados tag library descriptors (TLDs).toString()). } duas abordagens. iremos substituir a classe que implementa a taglib. um novo arquivo . A primeira é criar uma nova taglib. já que utiliza uma taglib própria. ou seja.ParseException.Converter.struts.apache. é apenas editar o arquivo struts-html.html. e em que um refactoring de todas as JSPs que utilizam esta taglib seria realmente muito custoso.DecimalFormat.java: Converter personalizado para BigDecimal.commons.ConversionException. Trecho do web. boolean useValorPadrao) { this. java.struts.apache. e a que adotaremos aqui.parse((String) valor).converter.indb 72 17/7/2006 14:15:08 . Esta abordagem segue as boas práticas de utilização do framework.apache.tld e substituir o nome da classe que implementa a tag.xml.com.ActionServlet</servlet-class> Depois da substituição <servlet-name>action</servlet-name> <servlet-class>br.text.TextTag e redefine formatValue(). private boolean useValorPadrao. Para isso. package br. } else { throw new ConversionException(“Erro ao instanciar BigDecimal”).MinhaTextTag. É a abordagem indicada para aplicações que estão iniciando o processo de desenvolvimento.locale = locale.taglib.getInstance(locale). Esta solução é indicada para aplicações que já estão avançadas no processo de desenvolvimento. Antes da substituição <servlet-name>action</servlet-name> <servlet-class>org.MinhaStrutsServlet</servlet-class> Listagem 7.servlet.com.apache.BigDecimal. Verificamos o objeto que é passado como argumento. não é recomendada.struts. A segunda. que estende org. public BigDecimalConversor(Locale locale.Locale. pois se repetirá para todos os formulários que trabalham com dados diferentes de strings. if (resultado == null || resultado instanceof BigDecimal) { return resultado.beanutils.text. Precisamos fazer com que a tag Para substituir a tag podemos adotar Listagem 6. java. que informam quais atributos a tag pode ter.tld é utilizado para configurar várias taglibs. Essa prática.jm. Figura 2.com. import org.taglib. public class BigDecimalConversor implements Converter { private Locale locale. antes e depois da substituição da Action.html. Edição 38 • Java Magazine jm38.indb 73 73 17/7/2006 14:15:11 . Testando a solução Dessa maneira.com/developer/technicalArticles/ Intl/IntlIntro/ Uma visão geral sobre internacionalização java. fazemos a formatação utilizando a classe java. struts.indb 74 17/7/2006 14:15:21 . E possivelmente teríamos apenas um objeto java..format(value).apache.apache.zip Ari Dias Neto (aridiasneto@gmail. } } return super. “BR”) é utilizado.Locale instanciado por sessão do usuário. parâmetros do sistema.jm. Mais uma vez.. doReadonly = true.com. Atualmente atua em projeto internacional para IBM e tem certificações SCJP. 2.html Sobre o design pattern Front Controller javamagazine. seus FormBeans poderão ter atributos mapeados para qualquer classe Java. if(value instanceof BigDecimal){ try{ DecimalFormat formatter = (DecimalFormat) DecimalFormat.formatValue(value).sun. Essa mesma solução se aplica também para formulários dinâmicos (os DynaActionForms).”BR”).struts. 3. // … imports public class MinhaTextTag extends TextTag{ public MinhaTextTag(){ super(). struts-html. MinhaTextTag.TextTag</tagclass> . SCWCD.. Note que três coisas aconteceram durante o processamento da requisição: 1.format(value). java.br/downloads/jm38/ jm-strutsconverters.com) é consultor Java/JEE com experiência de mais de sete anos em tecnogias para web. } catch(Exception e){ return super. jakarta.DecimalFormat. A Action redirecionou o usuário para o mesmo formulário. Reinicie a aplicação e digite os mesmos dados que usamos na primeira vez.apache. desde que você registre um conversor responsável para ela e estenda as taglibs. em uma fase de manuteção.org/commons Jakarta Commons. package br. como o padrão de formatação da data. Antes da substituição <tag> <name>text</name> <tagclass>org. pode ser a salvação para aqueles que já possuem milhares de JSPs e não querem ter de alterá-los caso seja criada uma nova tag. } } if(value instanceof Date){ try{ SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yyyy”). Analise a melhor solução para a sua aplicação levando em conta a legibilidade do código e a facilidade de manutenção da sua aplicação.taglib. o parâmetro Locale(“pt”. Esta segunda abordagem que apenas substitui o nome da classe no arquivo struts-html. } Conclusões Neste artigo.sun. Dessa forma.taglib. deixar os desenvolvedores um pouco confusos. e sim num resource da aplicação. } catch(Exception e){ return super. return formatter.tld.taglib. } } protected String formatValue(Object value) throws JspException { Locale locale = new Locale(“pt”.java: Classe que substituirá a implementação da taglib Text do Struts.getInstance(locale). a taglib formatou os dados exatamente como haviam sido digitados.util.com/blueprints/corej2eepatterns/ Patterns/FrontController. 4 Java Magazine • Edição 38 jm38. vimos como registrar converters personalizados no Struts e como formatar formulários para exibição ou edição.com.formatValue(value). pode. nesse caso “dd/MM/yyyy”.Formatação e Conversão no Struts e caso seja uma instância de BigDecimal. Vamos testar a solução completa.org Framework Apache Struts: downloads e documentação.tld. já que praticamente escondemos a nova configuração e a criação da nova taglib. Já se o objeto passado for do tipo Date. this. return sdf.formatValue(value). EA(I) e de Borland CaliberRM. </tag> Listagem . como já mostrado na Figura 1. formatamos para o padrão de exibição desejado. antes e depois da substituição da classe que implementa a tag. E por último.com. Uma solução mais rica poderia aceitar a configuração dos converters via XML. Listagem 8.text. O St r uts conver teu os dados e configurou o FormBean.html. </tag> Depois da substituição <tag> <name>text</name> <tagclass>br. componentes reutilizáveis para vários fins.jm. não estariam diretamente no código.. Após clicar no botão Enviar. o formulário deverá aparecer com os dados formatados corretamente.type = “text”.MinhaTextTag</tagclass> . Por outro lado. no momento da exibição. jm38.indb 75 17/7/2006 14:15:36 . 0. a LocaWeb não pára de investir para ter um atendimento cada vez mais ágil e eficiente.locaweb. XML. MySQL para Windows. domínios e pacotes de e-mails adicionais e muito mais.NET • Relatórios de visita em português • Certificado seguro com SSL • Banco de dados Access**. banco de dados MS SQL Server. PHP 5***. . Python***. A gente garante a sua tranqüilidade. www. está na hora de conhecer as soluções completas da LocaWeb. E para estar ainda mais próxima deles. C. WML/WAP • Diversos componentes para ASP e .5% E ainda pode contratar serviços adicionais à hospedagem como: comércio eletrônico.com. Ruby on Rails***.com. *Para mais detalhes e complementação de condições.C++***. atendendo às diversas necessidades de seus clientes.indb 76 17/7/2006 14:15:41 . MySQL 5.Se você anda precisando de ajuda para manter a sua empresa na internet.0*** e PostgreSQL 8.NET 2. JSP e Servlets***. A LocaWeb torna-se mais completa a cada dia que passa. PERL.1*** • Podcast • Backup diário incluso • Garantia de disponibilidade de 99. MySQL adicional para Linux. PERL/CGL. Oracle compartilhado. Mude para a LocaWeb. Hoje ela oferece todos os tipos de serviços e ferramentas de internet.br **em Windows ***em Linux jm38.br Na contratação de um Plano de Hospedagem* você tem: Blog Gratuito • E-mails LocaMail com antivírus e anti-spam • Completo painel de controle • Suporte às linguagens ASP**.locaweb. consulte o modelo de contrato disponível no site www.


Comments

Copyright © 2024 UPDOCS Inc.