UNIVERSIDADE FEDERAL DE SANTA CATARINA DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA CURSO DE CIÊNCIAS DA COMPUTAÇÃO FRANCISCO DE ASSIS BESEN HILLESHEIM X SWING MENU: UMA FERRAMENTA PARA CONSTRUÇÃO DE MENUS UTILIZANDO JAVA SWING E XML FLORIANÓPOLIS, 2004 2 UNIVERSIDADE FEDERAL DE SANTA CATARINA DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA CURSO DE CIÊNCIAS DA COMPUTAÇÃO FRANCISCO DE ASSIS BESEN HILLESHEIM X SWING MENU: UMA FERRAMENTA PARA CONSTRUÇÃO DE MENUS UTILIZANDO JAVA SWING E XML Orientador: Prof. Dr. Leandro José Komosinski Membros da Banca: Prof. Dr.José Leomar Todesco Prof Dr. Roberto Carlos dos Santos Pacheco FLORIANÓPOLIS, 2004 3 1 INTRODUÇÃO 1.1 Contexto No desenvolvimento de software em geral, a construção de interfaces gráficas de usuário (GUI) consiste em uma tarefa que requer um alto grau de esforço na maioria das linguagens de programação usuais. Em decorrência desse fato, várias tentativas de simplificar este processo foram realizadas, com e sem sucesso, ao longo dos anos. Em Java Swing, biblioteca incorporada à linguagem Java que permite o desenvolvimento de interfaces gráficas de usuário, este fato também ocorre. Com a ascensão da especificação XML nos últimos anos e o surgimento de diversas bibliotecas para sua utilização, principalmente em Java, é razoável que seu uso para especificação de interfaces gráficas de usuário seja uma alternativa para minimizar o esforço necessário no seu desenvolvimento. 1.2 Objetivos 1.2.1 Objetivo Geral Definir uma linguagem baseada em XML para especificação de objetos visuais da biblioteca Swing de Java, juntamente com uma ferramenta para manipulação de documentos XML baseados nessa linguagem. 1.2.2 Objetivos Específicos Permitir a especificação de barras de menu através da linguagem a ser criada. Além disso, desenvolver uma biblioteca Java que, quando incorporada a uma aplicação, gere objetos Swing (interface gráfica em Java) relativos ao menu desta aplicação a partir de um documento XML. Assim, para o programador, a implementação do menu de seu programa se resumiria a especificar os seus itens no formato XML. 4 Outro objetivo específico seria o conhecimento e contato com diversas tecnologias relacionadas à manipulação de documentos XML. 1.3 Metodologia Na fase inicial, uma pesquisa bibliográfica sobre os conceitos e tópicos abordados será realizada. Em seguida, a biblioteca Java responsável pela interpretação dos documentos XML será desenvolvida, juntamente com uma especificação referente a objetos gráficos. 5 2 ESTADO DA ARTE 2.1 Soluções existentes Durante muitos anos, várias tentativas de se melhorar o desenvolvimento de GUI foram realizadas. Atualmente, pode-se encontrar diversas tecnologias multi-plataforma que melhoraram, sim, o desenvolvimento de GUI´s, porém não são muitos eficientes (Ex: XWindows e Xt, Smalltalk, e diversas bibliotecas de classes como Xaw, GTK, Qt, Java AWT e Swing). Essas soluções são poderosas, mas ainda precisam do aprendizado de uma biblioteca. Em contrapartida, a utilização de XML ao invés de bibliotecas representa uma solução interessante. Uma prova disso é a linguagem XUL (Extensible User Interface Language) que faz parte do projeto Mozilla e que já é utilizada, como por exemplo, no browser Mozilla. Outra linguagem é XAML (Extensible Application Markup Language) que é um dialeto XML que desenvolvedores utilizarão para construir aplicativos para o Longhorn, a nova versão do sistema operacional Microsoft Windows. 2.2 XUL XUL é uma linguagem de interface de usuário baseada em XML do projeto Mozilla que permite construir aplicativos multi-plataforma que podem rodar conectados ou desconectados da Internet. A seguir segue suas principais características: Linguagem de marcação poderosa com suporte aos elementos clássicos de GUI (widgets); Baseada em padrões existentes (Ex: Javascript e Cascading Style Sheets); Multi-plataforma; Separação da apresentação da lógica da aplicação; Fácil manutenção. Além disso, existem outras tecnologias que são utilizadas pelo XUL como: 6 XBL (Extensible Binding Language): uma linguagem de marcação que define novos elementos para os widgets do XUL. Overlays: representam arquivos XUL utilizados para descrever conteúdos extra para a UI. XPCOM/XPConnect: tecnologias complementares que permitem a integração de bibliotecas externas à aplicações XUL. XPInstall: Mecanismo de instalação multi-plataforma do Mozilla. XUL representa uma nova idéia de desenvolvimento de aplicações visto que desenvolvedores habituados com os padrões tecnológicos do W3C podem utilizar seus conhecimentos de programação em browsers diretamente nas aplicações desktop. 2.3 XAML XAML define uma UI de aplicação com marcações representando controles padrões do Windows. A seguir segue um exemplo para um formulário de Login: <Canvas xmlns="http://schemas.microsoft.com/2003/XAML" ID="LoginPage"> <Label ID="lblUserId" FontFamily="verdana" FontSize="8" Canvas.Top="10" Canvas.Left="10"> User ID:</Label> <TextBox ID="txtUserId" FontSize="8" Canvas.Top="8" Canvas.Left="75"></TextBox> <Label ID="lblPassword" FontFamily="verdana" FontSize="8" Canvas.Top="35" Canvas.Left="10">Password:</Label> <TextBox ID="txtPassword" FontSize="8" Canvas.Top="33" Canvas.Left="75"></TextBox> <Button ID="cmdOK" Width="50" Canvas.Top="60" Canvas.Left="155">OK</Button> </Canvas> Neste exemplo, pode-se observar a idéia de XAML onde cada página é definida por um arquivo XAML. Cada página possui um painel raiz (Canvas) onde os elementos gráficos são definidos. Para criar uma aplicação, basta desenvolver um arquivo .proj para agrupar os 7 arquivos XAML e definir as opções de compilação, como informação sobre a versão e se a aplicação irá rodar em um browser ou em uma janela. O processo de renderização está demonstrado a seguir: O grande problema de XAML é que ele constrói, a partir dos documentos XML, objetos Avalon (que são nativos da nova versão do Microsoft Windows) que serão renderizados. Tal fato torna essa tecnologia dependente da plataforma Windows. Atualmente, como o novo sistema operacional ainda não foi lançado, a utilização de XAML ainda é bastante incipiente. 2.4 Um Exemplo utilizando XUL e Java Swing A seguir, será visto um exemplo de como se pode utilizar esses novos conceitos com a biblioteca Java Swing. 2.4.1 SwiXML SwiXML é um pequeno motor de geração de interfaces gráficas de usuário para aplicações Java e applets. A interface gráfica é definida através de documentos XML que são analisados e renderizados em tempo de execução em objetos Swing. Suas principais características são listadas a seguir: 8 Focada exclusivamente na biblioteca javax.swing; Programadores acostumados com a biblioteca Swing podem utilizar SwiXML sem maiores preocupações; SwiXML é rápido pois não adiciona novas camadas sob os objetos Swing; SwiXML é pequeno visto que seus componentes, presentes no arquivo swixml.jar, ocupam 40 Kbytes. Só se preocupa com a interface gráfica. O comportamento dinâmico da interface e a lógica de negócio devem ser implementados em Java. Para se utilizar o motor do SwiXML basta acoplar, a um aplicativo Java, sua biblioteca de classes contida no arquivo swixml.jar. Em seguida, basta invocar a classe org.swixml.SwingEngine que é responsável pela renderização do documento XML. Eis um exemplo de documento XML que pode ser usado: <?xml version="1.0" encoding="UTF-8"?> <frame size="640,480" title="Hello SWIXML World" DefaultCloseOperation="JFrame.EXIT_ON_CLOSE"> <panel constraints="BorderLayout.CENTER"> <label LabelFor="tf" Font="Comic Sans MS-BOLD-12" Foreground="blue" text="Hello World!"/> <textfield id="tf" Columns="20" Text="Swixml"/> <button Text="Click Here" Action="submit"/> </panel> </frame> Arquivo Helloworld.xml A seguir, a sua renderização: 9 Pode-se notar, através do exemplo, que usuários já habituados com a biblioteca Swing não teriam problemas em utilizar este motor visto que a linguagem utilizada no seu documento XML é parecida com a nomenclatura utilizada na biblioteca Java Swing. Apesar, claro, de apresentar um número de linhas de código menor e código mais claro. A questão agora é como os eventos e o comportamento dinâmico dos objetos Swing seriam tratados. Pois bem, nas marcações utilizadas no documento XML pode-se definir o atributo id, que deve ser único no documento, que representará o nome do objeto Swing correspondente à marcação. Se desejado enviar mensagens ao objeto Swing, basta declarar uma variável com o mesmo nome do atributo id. Caso um evento seja registrado no documento XML, um objeto da classe javax.swing.Action deve ser declarado, onde o evento será tratado. Estes atributos devem estar presentes em uma classe qualquer que deve ser passada como parâmetro para a classe responsável pela renderização do documento. Portanto, SwiXML é um exemplo prático de como a utilização de XML e Java Swing pode ser realizada. 10 3 SOLUÇÃO PROPOSTA A seguir, será descrita uma maneira de se alcançar os objetivos propostos utilizando-se de padrões de manipulação de documentos XML estabelecidos pelo W3C para criação da biblioteca XSwingMenu. Esta proposta de solução está divida em duas partes distintas: 3.1 Primeira parte A primeira parte da solução do problema consistiria na geração de código Java a partir de um documento XML, o que representa um diferencial em relação às outras soluções existentes. Para que isto possa ser realizado, uma especificação de linguagem baseada em XML deve ser criada. Para isso será utilizada uma especificação definida em Schema. Com a especificação em mãos, uma ferramenta de verificação e validação dos documentos XML, de acordo com as especificações Schema definidas, será desenvolvida para encontrar erros no documento XML e simplificar o processo de geração de código, que seria o último tópico referente à primeira parte. Para a geração de código Java, considerada a tarefa mais complexa, a idéia inicial é utilizar XSL e XSLT para especificar como a transformação dos documentos XML, já checados e validados, será realizada. Caso a utilização de XSL e XSLT não seja viável, parte da biblioteca, escrita em Java, será responsável por esta tarefa. Para o desenvolvimento de todas essas tarefas, bibliotecas como Xerces e Xalan, provenientes do projeto Apache, serão utilizadas para a manipulação dos documentos XML. 3.2 Segunda parte A segunda parte da solução seria permitir o processo inverso da primeira parte, ou seja, gerar um documento XML a partir de uma classe Java existente. Para isso, utilizaremos reflexão computacional, além das bibliotecas já citadas na primeira parte. 11 Essa tarefa teria como objetivo automatizar, em partes, a migração de aplicações já existentes que possuem barra de menu definida para que a solução tenha uma maior abrangência. Porém, esta parte do projeto só será realizada se o andamento de desenvolvimento da primeira parte terminar em tempo hábil. Além disso, esta parte pode ser considerada um bom desafio devido a sua complexidade. 12 4 DESENVOLVIMENTO 4.1 Primeiro ciclo de desenvolvimento Na primeira etapa de desenvolvimento, foram alcançados dois objetivos: a especificação da linguagem a ser utilizada nos documentos XML e o desenvolvimento de um validador referente a esta especificação criada. 4.1.1 Especificação da linguagem A criação da linguagem foi baseada na linguagem aceita pelo SwiXML, porém com diversas modificações. Primeiramente, foi levado em consideração apenas as marcações referentes à barra de menu e seus subcomponentes que serão apresentados a seguir: <menubar> - filhos: <menu> <menu> - filhos: <grupo>, <menuitem>, <checkboxmenuitem>, <radiobuttonmenuitem>, <separador> e <menu> <grupo> - filhos: <radiobuttonmenuitem> <menuitem> <checkboxmenuitem> <radiobuttonmenuitem> <separador> As quatro primeiras marcações descritas acima possuem atributos, sendo que todas essas marcações possuem o atributo “id” que serve como identificação dos objetos que serão futuramente descritos. Para um entendimento mais completo da linguagem, a seguir será apresentada a especificação feita em Schema: 13 <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="mneumonicos"> <xs:restriction base="xs:string"> <xs:pattern value="VK_[A_Z _]+"/> </xs:restriction> </xs:simpleType> <xs:element name="menubar"> <xs:complexType> <xs:sequence> <xs:element ref="menu" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="id" type="xs:string" use="optional"/> </xs:complexType> </xs:element> <xs:element name="menu"> <xs:complexType> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element ref="separador" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="menuitem" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="checkboxmenuitem" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="radiobuttonmenuitem" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="grupo" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="menu" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="id" type="xs:string" use="optional"/> <xs:attribute name="texto" type="xs:string" use="optional"/> <xs:attribute name="mneumonico" type="mneumonicos" use="optional"/> </xs:complexType> </xs:element> <xs:element name="separador" /> <xs:element name="menuitem"> <xs:complexType> <xs:attribute name="id" type="xs:string" use="optional"/> <xs:attribute name="texto" type="xs:string" use="optional"/> <xs:attribute name="icone" type="xs:string" use="optional"/> <xs:attribute name="mneumonico" type="mneumonicos" use="optional"/> <xs:attribute name="acelerador" type="xs:string" use="optional"/> </xs:complexType> </xs:element> <xs:element name="checkboxmenuitem"> <xs:complexType> <xs:attribute name="id" type="xs:string" use="optional"/> <xs:attribute name="texto" type="xs:string" use="optional"/> <xs:attribute name="icone" type="xs:string" use="optional"/> <xs:attribute name="mneumonico" type="mneumonicos" use="optional"/> <xs:attribute name="acelerador" type="xs:string" use="optional"/> <xs:attribute name="selecionado" type="xs:boolean" use="optional"/> </xs:complexType> 14 </xs:element> <xs:element name="radiobuttonmenuitem"> <xs:complexType> <xs:attribute name="id" type="xs:string" use="optional"/> <xs:attribute name="texto" type="xs:string" use="optional"/> <xs:attribute name="icone" type="xs:string" use="optional"/> <xs:attribute name="mneumonico" type="mneumonicos" use="optional"/> <xs:attribute name="acelerador" type="xs:string" use="optional"/> <xs:attribute name="selecionado" type="xs:boolean" use="optional"/> </xs:complexType> </xs:element> <xs:element name="grupo"> <xs:complexType> <xs:sequence> <xs:element ref="radiobuttonmenuitem" minOccurs="1" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> 4.1.2 Validador da linguagem O validador tem como função analisar um documento XML de acordo com a especificação Schema desenvolvida e, após essa análise, determinar se o documento XML é válido ou não indicando, em caso negativo, onde estão as inconsistências. Para a construção do validador foi utilizada a biblioteca Xerces Java Parser 1.4.4 (Projeto XML Apache) que apresenta suporte para a recomendação XML Schema versão 1.0. Sendo assim, a tarefa se resumiu em utilizar classes já prontas da biblioteca e em construir um tratador de erros mais amigável para usuários iniciantes. 15 5 REFERÊNCIAS http://xul.sourceforge.net/ http://www.xulplanet.com/ http://www.w3c.org/ http://xml.apache.org/xerces-j/ Artigos: http://www.devx.com/dotnet/Article/20785?trk=DXRSS_LATEST http://www.mozilla.org/projects/xul/joy-of-xul.html http://www.devx.com/DevX/Article/9605