SUMÁRIO - Projetos

Propaganda
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
Download