Вы находитесь на странице: 1из 88

Java Swing Draw

Alfredo Casado Bernardez

This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/bysa/2.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

Pgina 1 de 88

Java Swing Draw

Alfredo Casado Bernardez

ndice
..........................................................................................................................................2 ..........................................................................................................................................2 1. Introduccin..................................................................................................................3 2. Estado del arte...............................................................................................................5 2.1 Aplicaciones ......................................................................................................5 2.1.1 OpenOffice Draw...................................................................................8 . 2.1.2 Microsoft Visio.....................................................................................10 2.1.3 Dia............................................................................. ............................12 2.1.4 Tablas Comparativas.............................................................................14 2.2 APIs..................................................................................................................15 2.2.1 Open JGraph.........................................................................................17 2.2.3 GEF......................................................................................................19 . 2.2.4 Tablas Comparativas.............................................................................21 3. Metodologas y Tecnologas........................................................................................23 3.1 Metodologa ....................................................................................................23 3.2 Tecnologas Software......................................................................................25 3.2.1 Orientacin a Objetos...........................................................................25 . 3.2.2 Java.......................................................................................................27 3.2.3 JFC/Swing............................................................................................27 . 3.2.4 XML ....................................................................................................28 3.3.5 SVG......................................................................................................30 4. Especificacin de requisitos........................................................................................33 4.1. Descripcin general........................................................................................33 4.1.1 Perspectiva del producto......................................................................33 4.1.2 Funciones del producto.........................................................................34 4.1.3 Caractersticas del usuario....................................................................34 . 4.2. Requisitos Especficos....................................................................................35 4.2.1 Requisitos Funcionales.........................................................................35 4.2.2 Requisitos no funcionales.....................................................................47

Pgina 2 de 88

Java Swing Draw

Alfredo Casado Bernardez

4.2.2 Interfaces..............................................................................................48 . 5. Diseo e Implementacin............................................................................................51 5.1 Elementos principales.....................................................................................52 5.2 Grupos de Componentes.................................................................................59 5.3 Puntos de extensin del API...........................................................................61 5.4 Interfaz.............................................................................................................65 5.5 Serializacin.....................................................................................................70 5.6 Mecanismo de Pintado....................................................................................75 6.Pruebas.........................................................................................................................82 7. Conclusiones...............................................................................................................86 Bibliografa.....................................................................................................................89

Pgina 3 de 88

Java Swing Draw

Alfredo Casado Bernardez

1. Introduccin
En los ltimos aos ha habido un creciente inters por visualizar de manera grfica y mediante computadoras cualquier tipo de datos para facilitar su comprensin. La visualizacin de la informacin ya se aplica desde hace tiempo en diversas reas de conocimiento. Recientemente se han empezado a aplicar las tcnicas de visualizacin al desarrollo software [Stasko98]. Uno de los principales pioneros en la visualizacin del software fue Baecker con Sorting out Sorting [Baecker81], una animacin de 30 minutos que mostraba el funcionamiento de diferentes algoritmos de ordenacin. Esta disciplina estudia cmo representar los elementos que aparecen en el desarrollo software. En el caso de este proyecto se entender visualizacin del software como la representacin visual -tngase en cuenta que visualizacin, que es una traduccin directa del ingls, no tiene exclusivamente el significado grfico- de aquellos artefactos que estn presentes en un proyecto software. Dentro del grupo ViDo1 una lnea importante es la visualizacin del software. En esta lnea se hace necesaria una API de diagramas que facilite la labor de visualizacin de los artefactos software permitiendo visualizaciones personalizadas. Existen distintas APIs disponibles, pero o bine son comercies o no disponen de las caractersticas requeridas en cuanto a extensibilidad e interactividad con los distintos elementos del diagrama. Las que ofrecen estas caractersticas lo hacen de una forma que no es estndar, obligando al programador a escribir cdigo especfico para una API determinada. Esto requiere un tiempo superior de aprendizaje y supone un excesivo acoplamiento entre la API y el cdigo. Sera deseable que la extensibilidad proporcionada fuera estndar. Esto puede conseguirse definiendo los componentes de diagrama mediante Swing. En el presente Proyecto Fin de Carrera se define e implementa una API (Application Programming Interface), denominada Java Swing Draw (JSD), implementada en Java y una interfaz de usuario paralela, que permite la creacin de todo tipo diagramas interactivos de una forma sencilla y potente. Los componentes que pueden formar los diagramas no estn limitados a un conjunto predefinido proporcionado por la API. Se pretende que la API pueda extenderse o personalizarse con todo tipo de

Pgina 4 de 88

Java Swing Draw

Alfredo Casado Bernardez

componentes creados por el programador y con toda la interactividad que necesite, dentro de las posibilidades que ofrece el lenguaje Java. Java Swing Draw proporciona, como otras herramientas para diagramas, mtodos para alinear componentes, distribuirlos dentro de una regin o agruparlos en varios niveles para tratarlos de forma conjunta, entre otras funcionalidades. Pero adems, stas pueden ser ampliadas mediante puntos de extensin de la API. Un punto de extensin es un mecanismo que permite incorporar funcionalidad adicional sin modificar la ya existente. El proyecto ha sido implementado teniendo especial cuidado en el diseo del mismo aprovechando toda la potencia que brinda la orientacin a objetos y permitiendo crear un modelo extensible. De esta forma JSD permite crear diagramas de clases de UML2 o de cualquier otro tipo simplemente creando componentes estndar Swing de Java. El uso de componentes estndar de Swing facilita la creacin de diagramas mediante reutilizacin. Aquellos componentes que en su da se disearon con el objetivo de visualizar cierto tipo de datos pueden incluirse directamente en los diagramas de JSD mediante las tcnicas habituales que se utilizan en las interfaces Swing para aadir componentes en la interfaz de usuario. El proyecto se ha diseado en dos niveles diferentes: por un lado la API JSD ha sido enfocada hacia programadores con conocimientos de Java Swing, estos programadores haran uso de la API para construir aplicaciones que permitan mostrar visualmente los datos; por otro lado se ha recubierto esta API con una interfaz de usuario que permite interactuar con el diagrama mediante el ratn de una forma similar a como ocurre en las aplicaciones con interfaz grfica de usuario.

Unified Modeling Language. Define el formato de una serie de diagramas para el modelado de

aplicaciones.

Pgina 5 de 88

Java Swing Draw

Alfredo Casado Bernardez

2. Estado del arte


En esta seccin se pretende analizar las diferentes herramientas y APIs existentes para la confeccin de diagramas. Se analizarn varias de las herramientas disponibles para realizar un estudio comparativo de las capacidades que ofrecen, este anlisis se centra principalmente en los distintos mtodos de interaccin con el usuario ofrecidos por estas herramientas, las posibilidades de agrupacin, distribucin y serializacin y las posibilidades de integracin de las diferentes APIs entre otras. Vamos a agrupar las diferentes herramientas existentes para la construccin de diagramas en dos grupos: Aplicaciones. Dentro de este primer grupo analizaremos distintas utilidades como por ejemplo la utilidad Draw incluida en el paquete ofimtico OpenOffice3, as como otras herramientas especficas para la creacin de diagramas como Microsoft Visio4 o Dia5. De estas herramientas nos interesan sus posibilidades en cuanto al diseo interactivo de diagramas. Veremos qu facilidades ofrece cada una de estas aplicaciones y cules de ellas sera interesante incluir dentro de JSD. APIs que permitan integrar utilidades de diseo en nuestros programas. Dentro de este grupo encontramos diversas APIs como OpenJGraph [OJG01] , yFiles [YF01] o JGraph [JGO1]. Analizaremos cada una de estas APIs para determinar qu posibilidades ofrecen de cara al programador que quiera incorporar en sus programas la posibilidad de disear o mostrar diagramas. Analizaremos estas APIs utilizando diversos criterios como su facilidad de uso, capacidad de ampliacin de sus funcionalidades, interactividad, etc.

http://www.openoffice.org/ http://office.microsoft.com/es-es/FX010857983082.aspx http://www.gnome.org/projects/dia/

Pgina 6 de 88

Java Swing Draw

Alfredo Casado Bernardez

2.1 Aplicaciones
En esta seccin se analizarn diversas herramientas para la construccin de diagramas, se realizar una comparativa de las distintas herramientas centrndonos en diversos aspectos de las mismas para posteriormente incluir en el diseo del API JSD (Java Swing Draw) aquellas que resulten ms interesantes as como algunas otras que no se encuentren soportadas. Las capacidades que consideraremos en la comparativa se enumeran a continuacin. Manejo de componentes Analizaremos la capacidad de la herramienta para gestionar los componentes de un diagrama. Dentro de este punto tendremos en cuenta los siguientes aspectos: Alineacin de componentes: capacidad para alinear los componentes automticamente de distintas formas como alineacin a la izquierda, a la derecha, centrado, etc. Distribucin de componentes: capacidad de distribuir los componentes de distintas formas: igual espacio entre centros, igual espacio entre bordes principal o secundario, etc. Componentes personalizados: capacidad para que el usuario defina o incluya en la herramienta sus propios componentes personalizados. Esta caracterstica puede resultar muy interesante en determinados casos ya que ofrece una gran flexibilidad al usuario que puede adaptar la herramienta para que se ajuste mejor a su problema particular. Agrupacin de componentes. Se analizarn las capacidades de la herramienta para trabajar con grupos de componentes, para ello definimos una serie de capacidades deseables con las que debera contar la herramienta a la hora de trabajar con grupos de componentes. Movimiento en grupo: capacidad de que todos los componentes se desplacen conjuntamente al definir un grupo. Redimensin en grupo: capacidad de que se pueda redimensionar el grupo en su conjunto como si se tratase de un componente aislado. Subgrupos: posibilidad de crear grupos de componentes y a su vez grupos formados por otros grupos y por componentes bsicos.

Pgina 7 de 88

Java Swing Draw Conectores

Alfredo Casado Bernardez

Los conectores son elementos que unen dos componentes del diagrama, quedan anclados al componente y en caso de mover el componente el conector debe dibujarse convenientemente en funcin de la nueva posicin de los componentes a los que une. Definimos las siguientes capacidades en cuanto a conectores: Anclaje a puntos predefinidos: capacidad para fijar un conector a varios puntos predefinidos de un componente. Anclaje arbitrario: capacidad de fijar un conector a cualquier posicin sobre el borde de un componente sin la limitacin de los puntos predefinidos. Decoracin de conectores: capacidad para dibujar conectores de diversos tipos: lneas simples, lneas con flechas, posibilidad de incluir etiquetas, etc.

Ilustracin 1 - Decoracin de conectores

Codos en conectores: capacidad para dibujar codos en conectores, de esta forma el dibujo del diagrama es ms flexible ya que permite al usuario una mejor organizacin y distribucin en el diagrama de los componentes y sus conectores.

Ilustracin 2 Codos en conectores

Pgina 8 de 88

Java Swing Draw

Alfredo Casado Bernardez

Conectores grupo-componente: capacidad para dibujar un conector que relacione un grupo con un componente bsico. En los siguientes puntos se analizarn varias aplicaciones para posteriormente confeccionar unas tablas comparativas en base a las caractersticas enumeradas anteriormente.

2.1.1 OpenOffice Draw


Esta herramienta viene incluida con el paquete ofimtico OpenOffice, es una herramienta muy completa que cumple con un gran porcentaje de las funcionalidades antes mencionadas adems de incluir otras como la posibilidad de manejo de objetos 3D, algo que quedan fuera del anlisis de este proyecto. A continuacin analizaremos en qu grado cumple esta herramienta todas las funcionalidades antes mencionadas: Componentes La aplicacin dispone de capacidad para alinear y distribuir componentes. En las Ilustracin 3 y Ilustracin 4 se muestran los mens con los diferentes tipos de alineacin y distribucin contemplados.

Ilustracin 3 Men de alineacin de componentes de OpenOffice Draw.

Pgina 9 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 4 Men de distribucin de componentes de Open Office Draw

La mayor limitacin de esta herramienta es su reducida paleta de componentes, incluye nicamente varios tipos de figuras rectangulares y varios tipos de elipse. Por contra permite importar como elementos incrustados dentro del diagrama objetos OLE, applets o bitmaps. Agrupacin de componentes En este apartado OpenOffice Draw cumple todas las capacidades mencionadas. Es capaz de agrupar componentes y hacer que stos se comporten como si de un componente bsico se tratara, de este modo los componentes se mueven en grupo, es posible redimensionar un grupo completo, as como crear grupos formados por otros grupos.

Conectores Permite dibujar y anclar conectores a varios puntos predefinidos en los componentes. No es posible fijar el conector a un punto arbitrario del conector seleccionado por el usuario. No es posible definir varios codos, el conector se pinta de forma automtica y es la propia herramienta la que decide en que puntos colocar los codos, restando de esta forma capacidad de decisin al usuario. Para incluir ms codos, es necesario primero convertir la figura en un polgono, slo entonces tiene el usuario control sobre dnde situarlos. Permite dibujar conectores que unan componentes con grupos de componentes.

Pgina 10 de 88

Java Swing Draw -

Alfredo Casado Bernardez

En cuanto a la decoracin de los conectores dispone de varios tipos distintos: normales, en curva, con flecha, etc. Aun as para ciertos diagramas es posible que no encontremos ningn conector que se ajuste a nuestras necesidades. La Ilustracin 5 muestra la paleta de conectores disponible.

Ilustracin 5 Paleta de conectores de Open Office Draw

En conclusin es una herramienta muy completa pero con limitaciones debido al reducido nmero de componentes y conectores que maneja. No se centra exclusivamente en la confeccin de diagramas, que hace que pierda flexibilidad en este aspecto concreto.

2.1.2 Microsoft Visio


Microsoft Visio es una aplicacin especfica para la creacin de diagramas, tiene una muy amplia paleta de componentes y conectores para dibujar prcticamente cualquier tipo de diagrama, adems es ampliable mediante pluggins y dispone de otro tipo de funcionalidades avanzas como la definicin de macros mediante VBA (Visual Basic For Aplications), definicin de estilos o incorporacin de restricciones en los diagramas. Centrndonos en la parte que nos interesa para nuestro anlisis vamos a determinar cmo cumple Visio las capacidades enumeradas al inicio de esta seccin. Componentes Visio cuenta con una muy amplia gama de componentes distribuidos en diferentes paletas, desde componentes para diseo UML, hasta diagramas de flujo, pasando por componentes para el diseo de redes de ordenadores y un largo etctera. Tambin permite la creacin de nuevos componentes como combinacin de otros existentes que posteriormente pueden ser aadidos a las paletas de componentes para ser utilizados en futuros diagramas.

Pgina 11 de 88

Java Swing Draw

Alfredo Casado Bernardez

Alineacin de componentes: Visio permite alinear componentes, el planteamiento es ligeramente diferente a OpenOffice Draw: en Visio se seleccionan varios componentes y el primero seleccionado es el que acta como gua para el resto de componentes, as si por ejemplo alineamos a la izquierda todos los componentes se colocarn en la misma posicin de inicio respecto al eje x que en la que se encuentre el componente gua. En OpenOffice Draw si decidimos alinear a la izquierda marcaremos un grupo de componentes y stos se colocarn en la posicin del eje x en la que se sita el componente ms a la izquierda del grupo marcado. Son enfoques diferentes pero las posibilidades para el usuario son las mismas.

Ilustracin 6 Men de alineacin de componentes de Microsoft Visio

Distribucin de componentes: no se incluye en Visio operaciones para la distribucin de componentes, no es posible por ejemplo igualar el espacio existente entre varios componentes. Agrupacin de componentes En este apartado cumple todas las capacidades mencionadas: es capaz de agrupar componentes y hacer que stos se comporten como si de un componente bsico se tratara, de este modo los componentes se mueven en grupo, es posible redimensionar un grupo completo y crear grupos formados por otros grupos. Conectores Del mismo modo que con OpenOffice Draw, en Visio no es posible anclar un conector a un punto arbitrario del componente, sino que se dispone de varios puntos predefinidos donde se deben anclar los conectores. Tampoco es posible

Pgina 12 de 88

Java Swing Draw

Alfredo Casado Bernardez

definir varios codos en un conector, la propia herramienta se encarga de colocar codos cuando lo considera necesario. No es posible definir conectores que unan grupos de componentes con componentes bsicos, los puntos de anclaje de los conectores siguen estando en cada componente bsico y no en las lneas que delimitan en el grupo. En cuanto a la decoracin de conectores Visio cuenta con una amplia gama de conectores para todo tipo de diagramas. Visio es una aplicacin muy completa para la generacin de diagramas, siendo destacable sobre todo su amplia gama de componentes y conectores que abarcan multitud de mbitos. Adems la posibilidad de crear nuevos componentes como combinacin de otros ofrece mucha flexibilidad al usuario. Es una herramienta muy potente pero quizs en ocasiones su uso resulta poco intuitivo y requiere un esfuerzo de aprendizaje por parte del usuario.

2.1.3 Dia
Dia es una herramienta que se distribuye bajo licencia GPL para la creacin de diagramas, se ha incluido el anlisis de esta herramienta ya que incorpora interesantes funcionalidades como por ejemplo permitir al usuario definir sus propios componentes mediante XML [XML01], usando un subconjunto de SVG6 para dibujar el componente. Manejo de Componentes Dia cuenta con una amplia paleta de componentes para distintos tipos de diagramas como UML, diagramas de flujo o entidad-relacin. Aun as no alcanza el nmero de componentes predefinidos de Visio. Una caracterstica interesante de esta herramienta es la posibilidad de definir nuevos componentes y paletas de componentes mediante ficheros XML, usando SVG como lenguaje para definir su aspecto, de este modo el usuario puede personalizar la herramienta para adaptarla mejor a sus necesidades. Alineacin de componentes: Dia cuenta con un men de alineacin de componentes que permite realizar las operaciones tpicas de alinear a la izquierda, derecha, arriba, etc.
6

Scalable Vector Graphics. Es un formato para representar mediante XML grficos vectoriales.

Pgina 13 de 88

Java Swing Draw

Alfredo Casado Bernardez

Distribucin de componentes: cuenta con algunas opciones de distribucin de componentes como son: equiespaciado horizontal y vertical, o colocar los componentes de forma adyacente.

Ilustracin 7 Men de alineacin y distribucin de Dia

Agrupacin de componentes Dia permite la creacin de grupos de componentes, as como la creacin de grupos compuestos por componentes bsicos y por grupos, sin embargo no es posible redimensionar un grupo de componentes, opcin que s estaba disponible en Microsoft Visio y OpenOffice Draw. Conectores Los conectores, como en las herramientas anteriores, slo se pueden anclar a puntos predefinidos del componente, no es posible fijar el conector a un punto arbitrario del componente. No es posible definir conectores que unan grupos de componentes con componentes bsicos, los puntos de anclaje de los conectores siguen estando en cada componente bsico y no en las lneas que delimitan en el grupo. Los codos, como en las herramientas anteriores, son colocados automticamente por la herramienta.

Pgina 14 de 88

Java Swing Draw -

Alfredo Casado Bernardez

En cuanto a la decoracin de conectores Dia dispone de una amplia gama de ellos, adems de la capacidad de definir nuevos conectores personalizados mediante XML y SVG.

Dia es una buena alternativa GPL a herramientas comerciales como Microsoft Visio. Aunque dispone de un menor nmero de paletas de componentes y conectores, su sistema de personalizacin de componentes mediante XML es muy potente y flexible.

2.1.4 Tablas Comparativas


ALINEACIN DISTRIBUCIN PERSONALIZACIN OpenOfficeDraw Microsoft Visio Dia

Mediante composicin de otros componentes.

Mediante ficheros XML/SVG

Tabla 1 - Manejo de componentes

ANCLAJE PUNTOS PREDEFINIDOS

ANCLAJE ARBITRARIO

DEFINICIN DE CODOS

DECORACIN DE CONECTORES

CONECTORES GRUPOCOMPONENTE

OpenOfficeDraw Microsoft Visio Dia


Tabla 2 - Manejo de conectores

MOVIMIENTO OpenOfficeDraw Microsoft Visio

REDIMENSION

SUBGRUPOS

Pgina 15 de 88

Java Swing Draw

Alfredo Casado Bernardez

Dia

Tabla 3 - Agrupaciones de componentes

2.2 APIs
En esta seccin analizaremos brevemente distintas APIs o libreras existentes para la construccin y manipulacin de diagramas. En primer lugar determinaremos en qu medida soportan estas APIs las capacidades de diseo interactivo que hemos analizado en la seccin anterior y posteriormente analizaremos sus capacidades atendiendo a los siguientes puntos: Extensibilidad. Analizaremos en qu medida son extensibles las diferentes APIs: si permiten definir nuevos tipos de componentes, conectores u operaciones para grupos. Integracin con Java-Swing. Veremos si estas APIs se pueden integrar dentro de una aplicacin Java-Swing, y si permiten que componentes Swing estndar puedan formar parte del propio diagrama. Esto tiene especial inters porque los componentes Swing de Java son capaces de responder ante eventos lo que permite disponer de interactividad sin ningn esfuerzo por parte del programador. Exportacin. Veremos en qu formatos permiten exportar los diagramas generados: formatos de mapas de bits como JPEG o GIF o bien formatos vectoriales como SVG. En la siguiente tabla se muestran todas las APIs relacionadas con el dibujo y manipulacin de diagramas que se han encontrado durante esta fase de estudio del estado del arte: Nombre OpenJGraph JGraph Jazz and Piccolo URL http://openjgraph.sourceforge.net/ http://www.jgraph.com http://www.cs.umd.edu/hcil/jazz/ Lenguaje Java Java Java

Pgina 16 de 88

Java Swing Draw

Alfredo Casado Bernardez

Mica yFiles Arakhn JhotDraw GEF Grappa GraphViz Graphlet Grace

http://www.swfm.com/mica.htm http://www.yworks.com/ http://galland.stephane.free.fr/arakhne.org/neteditor/ http://www.jhotdraw.org/ http://gef.tigris.org/ http://www.research.att.com/~john/Grappa/ http://www.research.att.com/sw/tools/graphviz/ http://www.infosun.fmi.uni-passau.de/Graphlet/ http://plasma-gate.weizmann.ac.il/Grace/

Java Java Java Java Java Java C++ C++ C++

No se va a realizar un estudio detallado de todas ellas por motivos de limitacin de espacio en esta memoria. De todas las listadas seleccionaremos slo aquellas que estn programadas en lenguaje Java y que adems dispongan de soporte para Swing. Dentro de este subgrupo hemos seleccionado las siguientes APIs para realizar un estudio ms pormenorizado de cada una de ellas: OpenJGraph yFiles GEF

2.2.1 Open JGraph


Es una API distribuida bajo licencia LGPL. Esta API est enfocada a la construccin de grafos y sus principales caractersticas son: Permite dibujar grafos dirigidos, no dirigidos, grafos dirigidos acclicos y grafos con pesos. Incluye algoritmos bsicos para grafos, por ejemplo resolucin de caminos mnimos.

Pgina 17 de 88

Java Swing Draw

Alfredo Casado Bernardez

Interaccin del usuario para la creacin de nodos, conectores, borrado, movimiento, etc.

Distribucin avanzada de componentes mediante layouts, o algoritmos que se encargan de distribuir los componentes de una forma comprensible de acuerdo a ciertas restricciones. Esta API, por estar muy enfocada al diseo de grafos, cuenta con limitaciones

importantes para nuestros propsitos: Los elementos del grafico sern siempre los nodos y conectores predefinidos, no es posible incluir otros tipos de nodos o conectores definidos por el programador. Cuenta con limitaciones en cuanto a la interaccin con el usuario, no es posible definir grupos de componentes y tampoco dispone de capacidades para alineacin de componentes. En cuanto a los conectores slo dispone de los predefinidos para grafos, pudiendo ser dirigidos o no dirigidos. Pueden estar decorados con los pesos del grafo, pero no es posible definir nuevos conectores o redefinir la decoracin de los existentes. Se trata de una API muy til para el dibujo y trabajo con grafos, pero no es posible utilizarla para la construccin y manipulacin de otro tipo de diagramas como por ejemplo diagramas UML, topologas de redes de ordenadores, etc.

2.2.2 yFiles
yFiles es una API que se distribuye con licencia comercial. Se trata de una API extensible que dispone de componentes y mtodos para visualizar y dibujar cualquier tipo de diagramas, como por ejemplo diagramas UML, diagramas de workflow o diagramas de redes de ordenadores. Esta API est dividida en tres paquetes: ybasic : contiene los mecanismos necesarios para la construccin de diagramas de cualquier tipo, as como una coleccin de algoritmos bsicos para el anlisis de redes y grafos. yViewer: principalmente contiene un componente Swing que permite la visualizacin y manipulacin mediante interaccin del usuario de los diagramas

Pgina 18 de 88

Java Swing Draw

Alfredo Casado Bernardez

creados. Este paquete tambin incluye las capacidades para exportacin de diagramas en diversos formatos como GML, YGF, JPG, GIF. yLayout: este paquete contiene diversos layouts para la distribucin de componentes de diversas formas, por ejemplo distribuciones jerrquicas, circulares u ortogonales. Adems de estos paquetes tambin existen otros paquetes de extensin que aportan diversas funcionalidades: LEDAGraphAlgo : interfaz JNI para la utilizacin de los algoritmos para grafos de la librera LEDA [LED01] de C++. yWays: extensin para la visualizacin de redes bioqumicas. ySVG: extensin para soportar el formato SVG. yFiles es una API realmente completa, incluye mecanismos de extensin que permiten definir nuevos componentes para incluir en el modelo. El paquete yViewer dispone de mecanismos de interaccin con el usuario para dibujar diagramas que permiten alineacin, distribucin, agrupacin de componentes, etc. Tambin contiene mtodos de layout avanzados. Sin embargo en esta librera tampoco se incluye el soporte para integrar componentes Swing dentro de los diagramas y adems no es gratuita.

Ilustracin 8 diagrama de actividades UML con yFiles

Pgina 19 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 9 red de clusters de gran tamao con yFiles

2.2.3 GEF
GEF se distribuye bajo licencia BSD, es una librera creada con la intencin de facilitar la labor de construccin de aplicaciones para dibujar diagramas, los objetivos fundamentales de esta API son: La construccin de una librera bien diseada que permita ser extendida fcilmente. Proporcionar mtodos para la interaccin del usuario en la creacin de diagramas que incluyan movimiento, redimensin, alineacin de componentes, etc. Formato de fichero para la serializacin de diagramas XML basado en el estndar PGML, el soporte para el formato SVG est actualmente en desarrollo. Modelo basado en Swing para minimizar en lo posible el tiempo de aprendizaje de la librera. Edicin de las propiedades de los componentes basadas en mecanismos de introspeccin usando la tecnologa JavaBeans [JBN01].

Pgina 20 de 88

Java Swing Draw

Alfredo Casado Bernardez

GEF ofrece la posibilidad de adaptar la librera para la construccin de diferentes tipos de diagramas mediante mecanismos de herencia de las clases bsicas proporcionadas. Tambin dispone de un buen soporte para la interaccin del usuario en la creacin de diagramas aunque no incluye mecanismos para la creacin de grupos y subgrupos de componentes. Tampoco permite la inclusin de componentes Swing dentro del diagrama, para crear un nuevo componente que pueda usarse dentro de GEF es necesario investigar la API para averiguar de qu clases heredar y qu mtodos sobrescribir. Esto requiere un tiempo extra de aprendizaje por parte del programador al no estar claramente definidos los mecanismos de extensin de la API. A continuacin se muestran algunos ejemplos de diagramas construidos mediante la librera GEF.

Ilustracin 10 Diagrama simple con GEF

Ilustracin 11 Dibujo de polgonos con GEF

Pgina 21 de 88

Java Swing Draw

Alfredo Casado Bernardez

2.2.4 Tablas Comparativas


En esta seccin realizaremos un resumen del anlisis mediante varias tablas comparativas. ALINEACIN DISTRIBUCIN PERSONALIZACIN OpenJGraph Yfiles GEF
Algoritmos de layout


ANCLAJE PUNTOS PREDEFINIDOS

Algoritmos de layout Algoritmos de layout


DECORACIN DE CONECTORES CONECTORES GRUPOCOMPONENTE

Tabla 4 - Manejo de componentes


ANCLAJE ARBITRARIO DEFINICIN DE CODOS

OpenJGraph Yfiles GEF

Tabla 5 - Manejo de conectores

MOVIMIENTO OpenJGraph Yfiles GEF

REDIMENSION

SUBGRUPOS

Tabla 6 - Agrupaciones de componentes

EXTENSIBILIDAD INTEGRACIN AADIR CON SWING OpenJGraph YFiles GEF COMPONENTES SWING

EXPORTACION

GML, YGF, JPG, GIF PGML

Tabla 7 - Consideraciones especficas para APIs

Pgina 22 de 88

Java Swing Draw

Alfredo Casado Bernardez

3. Metodologas y Tecnologas
En el presente captulo se va a justificar la metodologa seguida en el desarrollo del sistema, as como las tecnologas software empleadas.

3.1 Metodologa
La metodologa seleccionada para el desarrollo de este proyecto es la programacin extrema [BECK99] (XP), a continuacin se expondr una breve descripcin de esta metodologa y posteriormente se justificar su uso para el desarrollo de este proyecto. Programacin Extrema La programacin extrema es una de las metodologas de desarrollo de software con ms xito en la actualidad. Se utiliza en proyectos con equipo de desarrollo pequeos y con plazo de entrega corto. La metodologa consiste en una programacin rpida o extrema. Una particularidad es tener como miembro del equipo al usuario final. Esta metodologa tiene las siguientes caractersticas: Pruebas Unitarias: las pruebas se realizan a los principales procesos sistemticamente durante todo el desarrollo. Refactorizacin: el cdigo se cambia constantemente para que sea lo ms reutilizable y flexible posible. La refactorizacin consiste en el cambio del cdigo para aadir ms calidad al mismo pero sin cambiar la funcionalidad de la aplicacin. Programacin en pares: una particularidad de esta metodologa es que propone la programacin en pares, la cual consiste en que dos desarrolladores participen en un proyecto en un mismo puesto de trabajo. Cada miembro lleva a cabo la accin que el otro no est haciendo en ese momento. Es como el piloto y el copiloto: mientras uno conduce, el otro consulta el mapa. XP propone que el desarrollo comienza dotando a la aplicacin de poca funcionalidad que va siendo aumentada a medida que avanza el desarrollo con retroalimentacin continua. La gestin del cambio se convierte en parte esencial del desarrollo. El coste del cambio no depende de la fase o etapa. Por ltimo no se introducen funcionalidades antes de que sean necesarias.

Pgina 23 de 88

Java Swing Draw

Alfredo Casado Bernardez

XP incorpora activamente al cliente en el proceso de desarrollo. El cliente decide qu se implementa. Sabe en todo momento el estado real y el progreso del proyecto. Puede aadir, cambiar o quitar requisitos en cualquier momento. Puede obtener un sistema funcionando en 3 4 meses. XP ofrece al desarrollador el poder de decidir cmo se implementan los procesos y crear el sistema con la mejor calidad posible. Puede disponer del cliente en cualquier momento para que le aclare algunos requisitos. Puede estimar el esfuerzo necesario para implementar el sistema y puede cambiar los requisitos en base a nuevos descubrimientos. Lo fundamental de XP es: La comunicacin entre los usuarios y los desarrolladores. La simplicidad al desarrollar y codificar los mdulos del sistema. La retroalimentacin concreta y frecuente del equipo de desarrollo, el cliente y los usuarios finales. Justificacin de la seleccin de metodologa Los principales motivos para la seleccin de esta metodologa determinada para el desarrollo de este proyecto son los siguientes: Equipo de desarrollo formado por una persona. El proyecto construye una API que ser usada por programadores, por tanto es ms adecuado una metodologa que integre al usuario final en el desarrollo. Un Proyecto Fin de Carrera est destinado a una sola persona y tiene una duracin estimada de 150 horas de trabajo (15 crditos). El tamao de la aplicacin construida es muy inferior a la gran mayora de las aplicaciones comerciales. Dado que se trata de construir una API es muy probable que se vayan incorporando nuevos requisitos a medida que se vayan necesitando. Por tanto habr que volver a negociar los que se implementan. Es importante disponer de versiones funcionando a medida que se avanza en el desarrollo para realizar pruebas de viabilidad.

Pgina 24 de 88

Java Swing Draw

Alfredo Casado Bernardez

3.2 Tecnologas Software


Dentro de este apartado se expondrn brevemente las diferentes tecnologas software relacionadas con el desarrollo de este proyecto para justificar su utilizacin: Orientacin a Objetos Java Swing XML BATIK

3.2.1 Orientacin a Objetos


La orientacin a objetos es el paradigma de programacin ms utilizado actualmente en el desarrollo de aplicaciones. Esto se debe a la existencia de lenguajes como Java, C# y otros que aportan otras muchas caractersticas que los hacen fciles de usar, potentes, compatibles con muchas plataformas y sobre todo seguros y fciles de depurar. El paradigma de programacin orientada a objetos establece una asociacin entre la informacin y las sentencias encargadas de gestionar dicha informacin. Desde un punto de vista de la programacin procedimental, la orientacin a objetos se puede ver como la asociacin entre funciones y procedimientos a los tipos de datos que manejan. En programacin orientada a objetos una clase es el conjunto formado por la definicin de la estructura de la informacin y las sentencias que la gestionan. A los subprogramas que gestionan los datos, se les denomina mtodos. A cada uno de los items de informacin que definen la estructura de la informacin se les denomina atributos o campos. En esta forma de organizar el cdigo el mdulo mnimo de programacin es la clase. Cuando ejecutamos un programa orientado a objetos, a la entidad que tiene los valores de los tems definidos en una clase se le denomina objeto. Adems de esta organizacin del cdigo existen primitivas de encapsulamiento, de forma que los atributos existentes en una clase quedan ocultos a los usuarios de esa clase. Para comunicar esa informacin se utilizan los mtodos. Al conjunto de mtodos de una clase que pueden ser usados por otras clases se le denomina interfaz pblica.

Pgina 25 de 88

Java Swing Draw

Alfredo Casado Bernardez

Las principales aportaciones de este paradigma al desarrollo de sistemas software son la herencia y el polimorfismo La herencia es una caracterstica que permite construir una clase (conocida como clase hija) basndose o teniendo como plantilla otra clase construida previamente (conocida como clase padre). Al utilizar una clase padre como base para definir una clase hija los atributos y mtodos definidos en la clase padre estn disponibles en la clase hija. Es decir, los objetos de la clase hija tendrn valores para los atributos definidos en la clase hija y tambin tendrn valores para los atributos definidos en la clase padre. Esta caracterstica permite una mayor reutilizacin del cdigo, ya que si dos clases de un programa tienen ciertas caractersticas en comn, se puede construir una clase que sea clase padre de las dos clases que alberga los atributos y mtodos que sean comunes a ambas. El polimorfismo es una caracterstica de la programacin orientada a objetos, muy relacionado con la herencia, que solventa un conjunto de problemas tpicos que aparecan en la programacin procedimental. En multitud de aplicaciones es necesario gestionar informacin con distinta estructura de una forma homognea. Por ejemplo, en un programa de diseo grfico hay que gestionar figuras geomtricas de distintos tipos como rectngulos, crculos, tringulos, etc... En algunos casos estas figuras han de gestionarse de forma homognea, si se quiere cambiar su color o moverlas por el rea de dibujo. En otras ocasiones, cada tipo de figura tendr que responder de una forma particular. Si se quiere calcular su rea, para cada tipo de figura hay que usar una expresin distinta. Para tratarlas de forma homognea, se crea una clase padre, llamada Figura. En esta clase se definen las mtodos comunes a todas las figuras: cambiar el color o cambiar su posicin. En cambio, el rea no se puede definir de una forma comn, y por tanto, cada uno de los tipos de figuras definen su propio mtodo para el clculo del rea. En la clase padre hay que definir un mtodo que no tiene implementacin, llamado abstracto. La implementacin de este mtodo ser establecido en cada una de las clases hijas que representan a cada tipo de figura. Si declaramos una variable de la clase Figura, puede contener objetos de cada una de las clases hijas. Cuando sobre el valor de esta variable se ejecuta el mtodo de clculo del rea, se usa el polimorfismo y se ejecuta la implementacin del mtodo que corresponde a la clase concreta de la figura. Es decir, el cdigo que se va a ejecutar cuando llamamos a

Pgina 26 de 88

Java Swing Draw

Alfredo Casado Bernardez

un mtodo, depende de la clase del objeto concreto que reciba el mensaje y no de la clase de la variable en que se llame.

3.2.2 Java
El lenguaje de programacin utilizado en el desarrollo de este proyecto ha sido Java. A continuacin se presentan algunas de las caractersticas que han llevado a la eleccin de este lenguaje: Orientado a Objetos: Java trabaja con sus datos como objetos y con interfaces a esos objetos. Soporta las caractersticas propias del paradigma de la orientacin a objetos: abstraccin, encapsulacin, herencia y polimorfismo. Simple: Posee una curva de aprendizaje muy rpida. Ofrece toda la funcionalidad de un lenguaje potente, pero sin las caractersticas menos usadas y ms confusas de stos. Robusto: Java realiza verificaciones en busca de problemas tanto en tiempo de compilacin como en tiempo de ejecucin. La comprobacin de tipos en Java ayuda a detectar errores lo antes posible, en el ciclo de desarrollo. Java obliga a la declaracin explcita de los tipos de los tems de informacin, reduciendo as las posibilidades de error. Maneja la memoria para eliminar las preocupaciones por parte del programador de la liberacin o corrupcin de la misma. Portable: La indiferencia de la arquitectura representa slo una parte de su portabilidad. Adems, Java especifica los tamaos de sus tipos de datos bsicos y el comportamiento de sus operadores aritmticos, de manera que los programas son iguales en todas las plataformas. Estas dos ltimas caractersticas se conocen como la Mquina Virtual Java (JVM).

3.2.3 JFC/Swing
Uno de los principales objetivos de diseo del API JSD es su compatibilidad con JFC/Swing [JFCS01]. En esta seccin vamos a explicar brevemente qu es JFC/Swing, haciendo especial hincapi en la parte de Swing que ms relacin tiene con JSD, la arquitectura de pintado de JFC/Swing. Qu es JFC/Swing?

Pgina 27 de 88

Java Swing Draw

Alfredo Casado Bernardez

JFC es la abreviatura de Java Foundation Classes, que comprende un grupo de caractersticas para ayudar a construir interfaces grficas de usuario (GUIs): Los componentes Swing: incluye todo tipo de componentes para construir GUIs, desde botones, hasta tablas, pasando por componentes de tipo rbol. Soporte de Aspecto y Comportamiento (look&feel): le ofrece a cualquier componente Swing una amplia seleccin de aspectos y comportamientos. Por ejemplo, el mismo programa puede usar el Aspecto y Comportamiento Java o el Aspecto y Comportamiento Windows. API de Accesibilidad: permite tecnologas como lectores de pantalla y displays Braille para obtener informacin desde la interfaz de usuario. Java 2D API: permite a los desarrolladores incorporar fcilmente grficos 2D de alta calidad, texto, e imgenes en aplicaciones y applets Java. Soporte de Drag and Drop: proporciona la habilidad de arrastrar y soltar entre aplicaciones Java y aplicaciones nativas. La librera JFC/Swing es muy ampla y no es objeto de esta memoria profundizar en todos sus aspectos, nos limitaremos a explicar con mayor detalle la parte del API que ms relacin guarda con el diseo de JSD, la arquitectura de pintado.

3.2.4 XML
Dentro del diseo del API JSD el lenguaje XML juega un importante papel ya que es el lenguaje elegido para la serializacin de los diagramas realizados con esta API. De este modo JSD ser capaz de almacenar sus diagramas en lenguaje XML y posteriormente leer estos ficheros para reconstruir los diagramas realizados por el usuario. Vamos a explicar brevemente en qu consiste el lenguaje XML y justificar la eleccin de este lenguaje como formato para los ficheros de diagramas de JSD. En primer lugar conviene repasar brevemente la historia y antecedentes de este lenguaje. La versin 1.0 del lenguaje XML es una recomendacin del W3C [W3C01] desde Febrero de 1998, pero se ha trabajado en ella desde un par de aos antes. Est basado en el anterior estndar SGML, que data de 1986, pero que empez a gestarse desde principios de los aos 70, y a su vez basado en el GML creado por IBM en 1969. Esto significa que aunque XML pueda parecer moderno, sus conceptos estn ms que

Pgina 28 de 88

Java Swing Draw

Alfredo Casado Bernardez

asentados y aceptados de forma amplia. Est adems asociado a la recomendacin del W3C DOM (Document Object Model), aprobado tambin en 1998. ste no es ms que un modelo de objetos (en forma de API) que permite acceder a las diferentes partes que pueden componer un documento XML o HTML. SGML proporciona un modo consistente y preciso de aplicar etiquetas para describir las partes que componen un documento, permitiendo adems el intercambio de documentos entre diferentes plataformas. Sin embargo, el problema que se atribuye a SGML es su excesiva dificultad; baste con pensar que la recomendacin ocupa unas 400 pginas. As que, manteniendo su misma filosofa, de l se deriv XML como subconjunto simplificado, eliminando las partes ms engorrosas y menos tiles. Como su padre, y ste es un aspecto importante sobre el que se incidir despus, XML es un metalenguaje: es un lenguaje para definir lenguajes. Los elementos que lo componen pueden dar informacin sobre lo que contienen, no necesariamente sobre su estructura fsica o presentacin, como ocurre en HTML. Las principales ventajas de este lenguaje que nos han llevado a su eleccin para el API JSD son las siguientes: Separa el contenido de la presentacin. Asigna una estructura lgica a la informacin. Es extensible. Facilita el intercambio de documentos entre usuarios y aplicaciones. Es independiente de la plataforma sobre la que trabaja. Para trabajar con documentos XML existen multitud de APIs disponibles, en nuestro caso hemos optado por el API JAXP (Java Api for Xml Procesing). JAXP

Pgina 29 de 88

Java Swing Draw

Alfredo Casado Bernardez

JAXP [JAXP01] provee una interfaz para crear y usar las APIs estndares SAX, DOM y XSLT en Java. JAXP no es un parser, sino que se puede definir como un conjunto de clases integradas a todo parser. JAXP permite a las aplicaciones analizar y transformar documentos XML independientemente de la implementacin particular de procesamiento XML. Dependiendo de las necesidades particulares de la aplicacin se puede optar por una u otra implementacin, por ejemplo una implementacin ms rpida frente a una que gestione mejor los recursos en memoria, sin necesidad de cambio alguno en el cdigo de la aplicacin. En el desarrollo de JSD se ha utilizado el parser que viene incluido por defecto en el JSDK 1.4 de Java, pero gracias al uso de JAXP podra usarse cualquier otro que cumpliese con las especificaciones JAXP, como por ejemplo JDOM7, sin necesidad de tener que rescribir ninguna lnea de cdigo. Esta gran ventaja proporcionada por JAXP ha sido la causa fundamental para decantarnos por su uso por delante de otras alternativas.

3.3.5 SVG
Una caracterstica importante de JSD es su capacidad para exportar los diagramas generados a un formato que sea legible por otros programas, para ello se ha seleccionado por sus cualidades el formato SVG [SVG01]. Para la gestin de ficheros en este formato se ha utilizado la librera BATIK [BAT01]. Se trata de una librera OpenSource creada por los propios autores del formato SVG. Proporciona los mecanismos necesarios para la generacin y manipulacin de ficheros en este formato. A continuacin se expondr una breve explicacin de SVG y la librera BATIK para justificar su inclusin en el desarrollo de JSD. SVG A continuacin vamos a detallar algunas de las principales caractersticas del formato SVG: Tiene todas las ventajas asociadas a un formato vectorial: es escalable, compacto, con formas siempre editables a travs de curvas Bzier, con contornos suavizados, transparencias, y capaz de incluir, si es preciso, bitmaps.
7

http://www.jdom.org/

Pgina 30 de 88

Java Swing Draw El tamao de los SVG es muy compacto.

Alfredo Casado Bernardez

El texto que incluyen es editable: admite las fuentes escalables ms comunes, como TrueType o Type 1. Esto supone una diferencia enorme con los actuales GIF o JPG: el texto que contienen se puede editar, seleccionar, ser indexado por los buscadores...

La calidad de color es excelente; el color del grfico se puede calibrar con los sistemas estndar de gestin de color.

El fichero SVG no es binario: se trata de un fichero de texto normal y corriente. Esto significa que se puede editar con cualquier editor de texto bsico, y sus contenidos se pueden indexar, buscar etc.

Es compatible con los estndares actuales de la WEB. Una de las funcionalidades ms interesantes de las que dispone la librera BATIK

es la capacidad de convertir aplicaciones Java Swing en un fichero grfico en formato SVG de forma que luego podemos visualizar esta aplicacin en cualquier visor SVG disponible.

Ilustracin 12 Conversin de aplicaciones Swing en fichero con formato SVG

Para la realizacin de esta tarea la librera BATIK nos proporciona la clase SVGGraphics2D, a travs de esta clase podemos escribir el contenido de nuestra aplicacin Swing a formato SVG.

Pgina 31 de 88

Java Swing Draw

Alfredo Casado Bernardez

En Java todos los grficos se renderizan a travs de la clase abstracta Graphics2D, existen diversas implementaciones de esta clase para diferentes propsitos como mostrar una imagen en pantalla o bien mostrar la imagen por impresora, la clase SVGGraphics2D es una nueva implementacin de esta clase abstracta que renderiza el grfico a un fichero SVG. Este mtodo para escribir en formato SVG nos ofrece las siguientes ventajas: No es necesaria una modificacin en el cdigo que genera el grafico, sencillamente hay que sustituir la instancia del objeto Graphics2D sobre el que se dibuja. Permite manipular el documento generado mediante un rbol DOM, ya que SVG es un formato definido en lenguaje XML

Pgina 32 de 88

Java Swing Draw

Alfredo Casado Bernardez

4. Especificacin de requisitos
Durante la fase de especificacin de requisitos se identifican las necesidades de los usuarios y clientes como requisitos. El proceso de captura de requisitos consiste en determinar lo que se debe construir. En un primer trmino se llev a cabo la fase de estudio del estado del arte. A partir del estudio de las diferentes aplicaciones y APIs para gestin de diagramas se identificaron los distintos requisitos provisionales. Posteriormente en sucesivas reuniones entre el autor y el director de este proyecto se fueron seleccionando de estos requisitos aquellos que se consideraron ms interesantes. Por un lado se ha tratado de que la API JSD cumpla con los requisitos mnimos que son ofrecidos por las herramientas y APIs ms entendidos y por otro lado se ha tratado de cubrir aquellos aspectos que no estn reflejados y a nuestro juicio sera interesente incluir. En cuanto a los requisitos podemos distinguir a grandes rasgos entre funcionales que son aquellos que especifican las acciones que debe ser capaz de llevar a cabo el sistema, y los no funcionales que son aquellos que especifican las propiedades que debe cumplir el sistema. En los siguientes apartados se describir de una forma general la API y se especificarn todos los requisitos que se han identificado en la fase de captura.

4.1. Descripcin general


4.1.1 Perspectiva del producto
Interfaces con el sistema Esta API no forma parte de ningn sistema complejo situado por encima de l, es independiente de cualquier otro sistema por tanto.

Interfaces de usuario Se puede distinguir entre dos tipos de usuarios claramente diferenciados, para cada uno de ellos se deber ofrecer un interfaz que se adecue a sus necesidades:

Pgina 33 de 88

Java Swing Draw -

Alfredo Casado Bernardez

Programadores: programadores que quieran incluir JSD en el desarrollo de sus propias aplicaciones, es necesario suministrarles un interfaz de programacin fcilmente comprensible, extensible, y que disponga de los mecanismos adecuados para la creacin y manipulacin de diagramas.

Usuarios finales: la API tambin ser la encargada de proporcionar a los usuarios finales todos los mecanismos de interaccin necesarios para llevar a cabo la tarea de la confeccin de diagramas.

Interfaces Hardware La API se desarrollar en el lenguaje java, no se considera ningn requisito

hardware adicional a los impuestos por la propia plataforma java. Interfaces Software Una de las caractersticas fundamentales de JSD es su compatibilidad con JFC/Swing, para el funcionamiento de JSD es necesario disponer de las libreras Swing de java que se incluyen en el propio JSDK. Para la exportacin de diagramas a formato SVG se hace uso de la librera BATIK, si se quiere hacer uso de esta funcionalidad es necesario tambin disponer de las libreras BATIK.

4.1.2 Funciones del producto


En este proyecto se pretende construir una API que sea capaz de proporcionar todos los mecanismos para la creacin y manipulacin de diagramas en diversos mbitos, por ejemplo diagramas UML o diagramas entidad-relacin. Por un lado se trata de construir una API fcilmente comprensible para un programador familiarizado con las tecnologas Java y Swing, y por otro lado la propia API se encargar de proporcionar todos los mecanismos de interaccin que necesite un usuario final para la construccin y manipulacin de diagramas.

4.1.3 Caractersticas del usuario


Distinguimos entre dos tipos de usuarios:

Pgina 34 de 88

Java Swing Draw -

Alfredo Casado Bernardez

Programadores: se requiere que los programadores que vayan a hacer uso JSD dispongan de conocimientos sobre el lenguaje Java as como sobre el framework JFC/Swing.

Usuarios finales: estos usuarios debern tener algunos conocimientos bsicos de informtica a nivel usuario as como estar familiarizados con alguna herramienta de edicin de diagramas o dibujo. No obstante la API debe proporcionar a estos usuarios unos mecanismos intuitivos para facilitarles su labor.

4.2. Requisitos Especficos


4.2.1 Requisitos Funcionales
Los requisitos funcionales son los que determinan qu funcionalidades debe proporcionar la API. Estos requisitos se han divido en varios grupos: requisitos de gestin de componentes, requisitos de gestin de conectores y requisitos del diagrama. Cada requisito se especificar teniendo en cuenta los dos perfiles de usuarios posibles. Requisitos de gestin de componentes REQGCOMP1 Movimiento Usuario: Deber poder mover los componentes situados en el diagrama, el usuario presionar el botn principal del ratn sobre el componente, sin soltar el botn el usuario arrastrara el componente hasta el lugar deseado, cuando el componente est sobre el lugar de destino el usuario liberar el botn principal del ratn. Programador: La API deber proporcionar los mtodos necesarios para que el programador pueda mover los componentes del diagrama. REQGCOMP2 Redimensin de componentes Usuario: El usuario deber ser capaz de modificar el tamao de un componentes situado en el diagrama. Para realizar esta accin cuando el usuario desplace el ratn por encima de los bordes del componente se modificar el aspecto del cursor para indicar al usuario que est posicionado sobre un punto de redimensin. Posicionado sobre este punto el usuario presionar el botn principal del ratn y desplazando el ratn redimensionar el componente, cuando el componente tenga el tamao adecuado el usuario liberar el botn principal del ratn. Dependiendo

Pgina 35 de 88

Java Swing Draw

Alfredo Casado Bernardez

del punto de redimensin sobre el que se presione el ratn el componente se redimensionara de distinta forma, si el punto elegido es la parte superior o inferior del componente se podr modificar la altura del componente, si el punto elegido es la parte izquierda o derecha del componente se podr modificar la anchura del mismo, si el punto elegido es alguna de las cuatro esquinas del componente se podr modificar tanto la altura como la anchura del componente. Programador: La API deber proporcionar los mtodos necesarios para que el programador pueda modificar el tamao de un componente. REQGCOMP3 Seleccin mltiple Usuario: El usuario podr seleccionar varios componentes al mismo tiempo, se habilitarn dos mtodos de seleccin mltiple: Mediante cuadro de seleccin: si el usuario presiona el botn principal del ratn sobre el panel y sin soltarlo mueve el ratn se crear un cuadro de seleccin, cuando el usuario libere el botn principal del ratn todos los componentes que estn contenidos completamente dentro del cuadro quedarn seleccionados. Mediante tecla SHIFT: El usuario podr seleccionar varios componentes manteniendo pulsada la tecla SHIFT y presionando sobre los componentes individualmente con el botn principal del ratn. Cuando se produzca una seleccin mltiple se crear un grupo temporal, el usuario podr entonces aplicar operaciones de grupo sobre este grupo temporal creado. Si se produce una nueva seleccin mltiple el grupo temporal creado con la anterior seleccin ser borrado y se crear uno nuevo. REQGCOMP4 Agrupacin Usuario: Se habilitar la opcin para que un grupo temporal se convierta en un grupo persistente. Cuando el usuario presione el botn secundario del ratn sobre un componente que pertenezca a un grupo temporal se le dar la opcin de crear un grupo persistente. A partir del momento en que se cree un grupo persistente est deber comportarse como si se tratara de un componente bsico, esto implica

Pgina 36 de 88

Java Swing Draw

Alfredo Casado Bernardez

que el grupo deber cumplir todos los anteriores requisitos expuestos para componentes. Programador: La API deber proporcionar los mtodos necesarios para que el programador pueda crear agrupaciones de componentes. REQCOMP5 Seleccin de marco de grupo Usuario: El usuario podr seleccionar entre los marcos de grupo disponibles, se le presentar un submen con todas las categoras de marcos de grupos disponibles y dentro de cada categora los marcos definidos, la API proporcionar una categora bsica con dos marcos de grupo distintos: el marco simple y el marco rectangular. Programador: Cuando el programador cree un nuevo grupo de componentes deber poder indicar el marco de grupo con el que quiere crearlo. REQGCOMP6 Deshacer Agrupacin Usuario: El usuario deber poder deshacer las agrupaciones previamente realizadas. Cuando se posicione sobre un grupo de componentes persistente y presione el botn secundario del ratn se le habilitar la opcin para deshacer un grupo. A partir de ese momento todos los componentes que formaban parte del grupo se podrn manipular individualmente. Si el grupo tena definidos conectores con otros componentes stos sern borrados. Programador: La API deber proporcionar los mtodos necesarios para que el programador pueda eliminar un grupo existente. REQGCOMP7 Alineacin Usuario: Los componentes que formen parte de un grupo podrn ser alineados. Cuando el usuario presione el botn secundario sobre un grupo temporal o persistente se le debern mostrar las distintas opciones de alineacin, stas deben ser: Alineacin a la izquierda. Todos los componentes movern su coordenada x de inicio para hacerla coincidir con la del componente ms a la izquierda del grupo sobre el que se realiza la operacin.

Pgina 37 de 88

Java Swing Draw

Alfredo Casado Bernardez Alineacin a la derecha. Todos los componentes se movern para hacer coincidir el final de los mismos con el final del componente ms a la derecha.

Alineacin abajo. Todos los componentes se movern para hacer coincidir su parte inferior con la parte inferior del componente situado ms abajo.

Alineacin arriba. Todos los componentes se movern para hacer coincidir su parte superior con la parte superior del componente situado ms arriba.

Programador: La API deber proporcionar los mtodos necesarios para que el programador pueda alinear una serie de componentes, las alineaciones sern las mismas que para el usuario.

REQGCOMP8 Distribucin Usuario: Los componentes que formen parte de un grupo podrn ser distribuidos. Cuando el usuario presione el botn secundario del ratn sobre un grupo temporal o persistente se le mostrarn las opciones de distribucin: Distribucin vertical. Los componentes se posicionarn de forma que el espacio vertical entre componentes sea el mismo. Distribucin horizontal. Los componentes se posicionarn de forma que el espacio horizontal entre componentes sea el mismo. Programador: La API deber proporcionar los mtodos necesarios para que el programador pueda realizar las mismas operaciones de distribucin que las detalladas para el usuario. REQGCOMP9 Personalizacin de componentes Programador: Los componentes que formen parte del diagrama debern ser componentes Swing, el programador que haga uso de la API podr definir sus propios elementos del diagrama simplemente creando un componente Swing y aadindolo al panel de dibujo.

Pgina 38 de 88

Java Swing Draw

Alfredo Casado Bernardez

REQGCOMP10 Personalizacin de operaciones de grupo Programador: El programador podr definir sus propias operaciones de grupo, por ejemplo podra definir operaciones para una distribucin avanzada de componentes (distribucin circular, distribucin en rbol, etc) y colocarlos dentro del men contextual de operaciones de grupo. Adems deber poder realizar esta extensin de la funcionalidad de la API sin necesidad de modificar ninguna de las lneas de cdigo de sta. REQGCOMP11 Personalizacin de pintado de grupo Programador: El programador podr definir sus propios mtodos para el pintado de grupos, de este modo podr personalizar el modo de mostrar grficamente la agrupacin de componentes para distintos propsitos (como paquetes UML o carpetas). Estos nuevos mtodos de pintado se debern poder colocar en el men contextual de seleccin de tipos de grupo para que el usuario pueda decidir qu marco aplicar en cada momento eligiendo entre todos los implementados. Adems deber poder realizar esta extensin de la funcionalidad de la API sin necesidad de modificar ninguna de las lneas de cdigo de sta. REQGCOMP12 Borrado de elementos grficos Usuario: El usuario deber ser capaz de borrar un elemento grfico situado en el diagrama, para ello se posicionar sobre el elemento en cuestin y presionar botn secundario, en el men le aparecer una opcin para eliminar el componente grfico seleccionado. Programador: la API deber proporcionar al programador los mtodos necesarios para eliminar componentes. Requisitos de gestin de conectores REQGCON1 Creacin de conectores Usuario: Se deber ofrecer un mecanismo para que el usuario pueda crear conectores fcilmente. Cuando el usuario seleccione la opcin de crear conector sobre un componente se le presentar un men con los conectores disponibles, el usuario seleccionar uno y se crear automticamente un conector con inicio en el componente seleccionado, a partir de este momento se dibujar un conector

Pgina 39 de 88

Java Swing Draw

Alfredo Casado Bernardez

temporal desde el componente inicial al hasta el lugar donde el usuario mueva el ratn, de esta forma el usuario tendr claro que est dibujando un conector (otras herramientas no muestran el conector hasta que no se selecciona tambin el componente destino, resultado sta una forma ms confusa de crear conectores), posteriormente cuando presione el botn principal sobre cualquier componente se crear un conector que una al componente sobre el que se comenz a dibujar el conector con este ltimo. Si el usuario una vez seleccionada la opcin de crear conector en lugar de presionar el botn principal sobre el componente destino lo hiciera sobre una zona vaca del panel la operacin de crear conector quedar anulada. Programador: El programador deber disponer de los mtodos necesarios para crear un conector de un tipo determinado e incluirlo en el diagrama. REQGCON2 Borrar conector Usuario: Se deber proporcionar un mecanismo para que el usuario pueda borrar conectores, si situado sobr un conector el usuario presiona el botn secundario del ratn se le mostrar dentro de un men la opcin de borrar, si el usuario presiona sobre esta opcin el conector ser borrado del diagrama. Programador: Se deber proporcionar al programador un mtodo para borrar un conector previamente creado. REQGCON3 Crear punto de control Usuario: El usuario podr crear tantos puntos de control como desee dentro de un conector, se posicionar sobre el conector presionar el botn secundario del ratn y en el men contextual se le debe presentar una opcin para crear un punto de control. Si el usuario elige esta opcin se crear un nuevo punto de control en la posicin en la que estuviera el ratn al presionar con el botn secundario para obtener el men contextual. Programador: El programador deber disponer de los mtodos necesarios para crear un punto de control sobre un conector determinado indicando las coordenadas del nuevo punto. REQGCON4 Movimiento de puntos de control

Pgina 40 de 88

Java Swing Draw

Alfredo Casado Bernardez

Usuario: Una vez creado un punto de control el usuario podr mover dicho punto a cualquier lugar del diagrama que desee. El mecanismo para mover este punto de control es anlogo al mecanismo para el movimiento de componentes, para mantener una coherencia de acciones en todos los elementos del diagrama. Programador: El programador deber disponer de los mtodos necesarios para modificar las coordenadas de un punto de control. REQGCON5 Borrado de puntos de control Usuario: Una vez creado un punto de control se debe proporcionar la usuario la posibilidad de borrarlo, cuando el usuario presione el botn secundario del ratn sobre el punto de control se le mostrar en el men la opcin necesaria para que pueda realizar el borrado. Una vez el usuario haya borrado el punto de control deber volver a pintarse el conector adecuadamente. Programador: El programador deber disponer de los mtodos necesarios para borrar un punto de control situado sobre un conector. REQGCON6 Crear punto de anclaje (Port) Usuario: El usuario podr anclar un conector a una zona especfica de un componente, cuando el usuario presione botn secundario sobre el conector en una zona de ste cercana a un componente se le presentar en el men contextual la opcin de anclar el conector. Una vez seleccionado el conector quedar anclado a esa zona del componente, adems se dibujar algn tipo de seal para que el usuario sea consciente de que el conector ha quedado anclado. Programador: El programador deber disponer de los mtodos necesarios para crear un punto de anclaje sobre cualquier posicin situada al borde de un componente, si el programador indicara unas coordenadas que no estn situadas exactamente sobre el borde del conector la API crear el punto de anclaje sobre el punto situado al borde del conector ms cercano a las coordenadas indicadas. REQGCON7 Movimiento de puntos de anclaje Usuario: Una de las limitaciones encontradas en otras APIs y herramientas de diseo de diagramas es la obligatoriedad de anclar los conectores a varios puntos predeterminados del componente. Con este mecanismo de movimiento de puntos

Pgina 41 de 88

Java Swing Draw

Alfredo Casado Bernardez

de anclaje permitiremos que el usuario decida dnde colocar el anclaje, pudiendo ser el lugar elegido cualquier parte situada en los bordes de un componente. El mecanismo de movimiento de puntos de anclaje ser anlogo el mecanismo de movimiento de componentes con la restriccin de que slo se podr mover por el borde. Se asume que los componentes tienen forma rectangular. Programador: El programador deber disponer de los mtodos necesarios para indicar una nueva coordenada para un punto de anclaje creado, en caso de que la nueva coordenada quede fuera de los bordes del conector se actuar igual que en el requisito anterior. REQGCON8 Borrado de puntos de anclaje Usuario: Una vez creado un punto de anclaje se deber dar la posibilidad al usuario de borrarlo en cualquier momento, el mecanismo de borrado de los puntos de anclaje deber ser anlogo al de los puntos de control. Cuando no existan anclajes el conector actuar como si estuviera anclado al centro del componente, aunque slo se dibujar dicho conector desde el punto de interseccin con el borde del componente. Programador: El programador deber disponer de los mtodos necesarios para borrar un punto de anclaje previamente creado. REQGCON9 Personalizacin de pintado de conectores Programador: La API deber proporcionar los mecanismos a los programadores para definir sus propios mtodos de pintado de conectores de la forma ms fcil posible. Se habilitarn tambin los mecanismos necesarios para que estos nuevos conectores personalizados aparezcan en el men contextual de creacin de nuevos conectores. Adems deber poder realizar esta extensin de la funcionalidad de la API sin necesidad de modificar ninguna de las lneas de cdigo de sta. Requisitos de Gestin del diagrama REQGD1 Guardar el diagrama en un fichero Usuario: El usuario deber disponer de la opcin para guardar su trabajo en un fichero, de este modo ser necesario determinar toda la informacin que debe ser guardada as como definir un formato de fichero conveniente para almacenar esta

Pgina 42 de 88

Java Swing Draw

Alfredo Casado Bernardez

informacin. Cuando el usuario presione el botn secundario del panel sobre cualquier lugar vaco de ste se le presentar un men que contenga esta opcin, si la selecciona se le presentar un cuadro de dialogo en el que podr elegir el lugar del disco y el nombre que desea darle al fichero

REQGD2 Obtener rbol DOM (rbol XML) Programador: El programador deber disponer de un mtodo para obtener la representacin DOM del diagrama, con este requisito se pretende no limitar al programador a que pueda guardar el diagrama en un fichero XML, se le permite obtener la representacin DOM del rbol XML para que pueda manejarla. REQGD3 Cargar diagrama desde fichero. Usuario: Se deber habilitar la opcin para que el usuario pueda cargar un diagrama previamente salvado, cuando presione el botn secundario del ratn sobre cualquier lugar vaco del diagrama se le presentar un men que contenga esta opcin, si el usuario la selecciona se le presentar un cuadro de dialogo para que seleccione el fichero a cargar. REQGD4 Cargar diagrama mediante rbol DOM Programador: Se deber proporcionar un mecanismo al programador para que pueda cargar un diagrama en el panel a travs de un rbol DOM XML que contenga la especificacin correcta de un diagrama. REQGD5 Exportar a formato SVG Usuario: Se deber permitir al usuario generar un fichero SVG que contenga el diagrama diseado por l. Cuando el usuario presione el botn secundario del ratn sobre cualquier zona vaca del panel se le presentar un men que contenga esta opcin, si la selecciona se le mostrar un cuadro de dialogo para que pueda elegir el lugar del disco donde guardarlo y el nombre del fichero generado. Programador: La API deber proporcionar los mecanismos necesarios para que el programador pueda exportar un diagrama a formato SVG indicando la ruta del fichero destino.

Pgina 43 de 88

Java Swing Draw REQGD6 Pasar a modo esttico

Alfredo Casado Bernardez

Usuario: En cualquier momento el usuario deber poder acceder al modo esttico del diagrama. Desde este modo el usuario podr acceder a toda la funcionalidad ofrecida por los componentes Swing que forman parte del diagrama pero no se podr editar el diagrama. Cuando en modo diseo se presione el botn secundario del ratn sobre cualquier zona vaca del mismo se le presentar un men que contendr esta opcin. Desde el modo esttico no se podr manipular el diagrama. Programador: El programador deber disponer de un mtodo que permita poner el diagrama en modo esttico. REQGD7 Pasar a modo diseo Usuario: Si el usuario est en modo esttico se le dar la posibilidad de regresar al modo de diseo en cualquier momento, si presiona botn secundario sobre el panel se le presentar un men que contenga esta opcin. Programador: El programador deber disponer de un mtodo que permita poner el diagrama en modo diseo. REQGD8 Integracin con aplicacin JFC/Swing Programador: De cara al programador que haga uso de esta API se deber proporcionar un componente que muestre el panel de dibujo y que se pueda integrar fcilmente en cualquier aplicacin con GUI construido sobre JFC/Swing. A continuacin se van a mostrar una serie de tablas resumen para todos los requisitos especificados. En las tablas se indicar el identificador del requisito, su descripcin y si es un requisito que afecta al usuario o al programador. Identificador
REQGCOMP1

Descripcin
Movimiento

Usuario

Programador

REQGCOMP2

Redimensin

REQGCOMP3

Seleccin mltiple

Pgina 44 de 88

Java Swing Draw

Alfredo Casado Bernardez

REQGCOMP4

Agrupacin

REQGCOMP5

marco de grupo

REQGCOMP6

Deshacer Agrupacin

REQGCOMP7

Alineacin

REQGCOMP8

Distribucin

REQGCOMP9

Personalizacin componentes

REQGCOMP10

Personalizacin de operaciones de grupo

REQGCOMP11

Personalizacin de pintado de grupo

REQGCOMP12

Borrado

Tabla 8 - Resumen de requisitos sobre componentes

Identificador
REQGCON1

Descripcin
Creacin de conectores

Usuario

Programador

REQGCON2

Borrar conector

REQGCON3

Crear punto de control

REQGCON4

Movimiento de puntos de control

REQGCON5

Borrado de puntos de control

REQGCON6

Crear punto de anclaje

Pgina 45 de 88

Java Swing Draw

Alfredo Casado Bernardez

REQGCON7

Movimiento de puntos de anclaje

REQGCON8

Borrado de puntos de anclaje

REQGCON9

Personalizacin de pintado de conectores Tabla 9 - Resumen de requisitos sobre conectores

Identificador
REQGD1

Descripcin
Salvar fichero diagrama a

Usuario

Programador

REQGD2

Obtener rbol DOM

REQGD3

Cargar diagrama desde fichero

REQGD4

Cargar rbol DOM

REQGD5

Exportar a SVG

REQGD6

Pasar a modo esttico

REQGD7

Pasar a modo diseo

REQGD8

Integracin Swing Tabla 10 - Resumen de requisitos sobre el diagrama

4.2.2 Requisitos no funcionales


Una vez especificados los requisitos funcionales del sistema, se especifican los no funcionales: REQNF1 Fiabilidad: No existen atributos del sistema para este apartado. REQNF2 Disponibilidad: No existen atributos del sistema para este apartado.

Pgina 46 de 88

Java Swing Draw

Alfredo Casado Bernardez

REQNF3 Mantenibilidad: Para garantizar la mantenibilidad de la API sta debe estar implementada de la forma ms clara y comprensible posible, utilizando para ello las normas de estilo definidas por Sun Microsystems [Sun01]. Adems la API debe estar lo suficientemente bien documentada para que un programador pueda comprender el cdigo y modificarlo lo ms rpidamente posible. REQNF4 Portablidad: La API ser implementa en Java para aprovechar las cualidades respecto a la portabilidad de esta plataforma. REQNF5 Tiempo de respuesta: La API estar construida sobre Swing por tanto los tiempos de respuesta dependern de los de este framework, sin embargo habr que asegurarse que los algoritmos y procesos propios de la API JSD no aumenten en demasa estos tiempos de respuesta. REQNF6 Utilizacin de memoria: Al igual que en el requisito anterior nos deberemos asegurar que la API JSD no produce un consumo de memoria que supere en demasa al producido por los propios componentes Swing de los que se hagan uso.

4.2.2 Interfaces
JSD es un API que se integrar en diversas aplicaciones, por tanto la especificacin de la interfaz de esas aplicaciones queda fuera del objeto de este proyecto. No obstante el componente principal de JSD, el panel de dibujo, ofrece una serie de mens contextuales para la manipulacin de diagramas que sern especificados a continuacin. Men del panel Cuando el usuario presione el botn secundario del ratn sobre el panel se le presentar este men, dentro de este men se pondrn a disposicin del usuario diversas acciones a realizar sobre el conjunto del diagrama: Static mode: Permite al usuario acceder a la vista esttica del diagrama, como se define en el requisito REQGD6. Design mode: Permite al usuario acceder a la vista de diseo del diagrama, como se define en el requisito REQGD7.

Pgina 47 de 88

Java Swing Draw

Alfredo Casado Bernardez

Group type: Submen donde se mostrarn todas las categoras de marcos de grupos disponibles y dentro de cada categora los distintos marcos que contenga. La API incluye una categora bsica. Se debern mostrar aquellas creadas por el programador que utilice la API como se especifica en el requisito REQGCOMP11. Save file: Opcin que permite al usuario guardar en un fichero el contenido el diagrama como se especifica en el requisito REQGD1. Open file: Opcin que permite cargar un diagrama que se encuentre en un fichero como especifica el requisito REQGD3. Export to SVG: Opcin que permite al usuario exportar el diagrama a formato SVG como se especifica en el requisito REQGD5. Men de los componentes Cuando el usuario presione el botn secundario del ratn sobre un componente o grupo de componentes se le presentar este men, dentro de l se habilitan las siguientes opciones: Create conector: Al pulsar esta opcin se le presentar al usuario un submen con las distintas categoras de conectores disponibles. La API incorporar una categora bsica pero el programador podr aadir otras nuevas como se especifica en el requisito REQGCON9. Una vez seleccionado un tipo de conector se proceder como se indica en el requisito REQGCON1. delete component: esta opcin del men permitira al usuario eliminar un componentes como se indica en el requisito REQGCOMP2. Group operations: Al pulsar esta opcin se presentar un submen con las distintas categoras de operaciones de grupo. La API incorpora las categoras: Aligment y Distribution, como se especifica en los requisitos REQGCOMP7 y REQGCOMP8. En este submen se debern presentar las nuevas categoras definidas por el programador como se especifica en el requisito REQGCOMP11. Group: Esta opcin permitir fijar un grupo como persistente como se indica en el requisito REQGCOMP4.

Pgina 48 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ungroup: Permite deshacer la persistencia de un grupo como se indica en el requisito REQGCOMP6. Men de conectores Cuando el usuario presione el botn secundario del ratn sobre un conector se le presentar el men de conectores, dentro de este men se habilitan todas las opciones necesarias para el manejo de conectores: Remove conector: Permite borrar un conector como se indica en el requisito REQGCON2. Create control point: Permite crear un control point como se especifica en el requisito REQGCON3. Remove control point: Permite borrar un control point como se especifica en el requisito REQGCON5. Create port: Permite crear un punto de anclaje (port) como se especifica en el requisito REQGCON6. Remove port:Permite borrar un punto de anclaje como se especifica en el requisito REQGCON8.

Pgina 49 de 88

Java Swing Draw

Alfredo Casado Bernardez

5. Diseo e Implementacin
En este captulo se presentar el diseo para la API JSD, se mostrarn todas las clases e interfaces as como sus relaciones a travs de distintos diagramas de clases UML. Se detallarn qu partes del sistema corresponden con el cumplimiento de cada requisito y se especificarn los distintos patrones de diseo [Gamma95] utilizados. Durante este capitulo tambin se presentarn diversos detalles relativos a la implementacin de la API JSD. Este capitulo se divide en varias secciones centrandose cada una de ellas en un determinado aspecto del sistema desarrollado: Elementos principales: Se describirn los elementos principales de la API: el panel de dibujo, los componentes y los conectores. Grupos de componentes. Se describir el diseo realizado para permitir la agrupacin de componentes, teniendo en cuenta que un grupo de componentes debe comportarse del mismo modo que un componente bsico. Puntos de extensin de la API: Se describirn las distintos interfaces implementadas para permitir que la API pueda ser extendida incluyendo nuevos componentes, conectores, marcos de grupo y operaciones de grupo. Interfaz: Se mostrarn las clases que componen la interfaz de usuario que proporciona el panel, se describirn tambin en este apartado las interfaces definidas para lograr extender determinadas partes de esta interfaz. Serializacin: En este apartado se mostrar el diseo que permite que los diagramas diseados con la API JSD sean serializables. Se mostrar el XML-Schema definido para almacenar en un fichero XML toda la informacin relativa al diagrama y poder reconstruirlo posteriormente. Mecanismo de pintado: Se explicar el mecanismo de pintado de Swing y se detallaran los pasos seguidos para el pintado de los diagramas en JSD.

Pgina 50 de 88

Java Swing Draw

Alfredo Casado Bernardez

5.1 Elementos principales


En este apartado se describirn los elementos principales que componen la API JSD: el panel de dibujo, los componentes y los conectores. A continuacin se muestra un diagrama en el que se pueden observar dichas clases y sus relaciones:

Ilustracin 13 - Diagrama de clases de los elementos principales de JSD.

La clase principal de JSD es GraphicPanel, esta clase contiene todos los elementos grficos y conectores que forman parte del diagrama. A su vez cada conector mantiene referencias a los dos componentes que une y cada componente mantiene referencias a todos los conectores que tienen origen o fin en l. A continuacin se describirn ms detalladamente cada una de estas clases:

GraphicPanel

Pgina 51 de 88

Java Swing Draw

Alfredo Casado Bernardez

Es la clase principal de la API JSD, hereda de la clase Swing JPanel (clase que define un panel que permite contener otros componentes Swing) y extiende la funcionalidad de sta para permitir dibujar diagramas e interaccionar con ellos. De esta forma el GraphicPanel se puede integrar en cualquier aplicacin que utilice las clases Swing para la gestin de la interfaz de usuario, cumpliendo con el requisito REQGD6. Es la encargada de gestionar el dibujado de los componentes, conectores y grupos de conectores asegurando que todos estos elementos se pinten en el orden correcto y respetando los mecanismos de pintado de Swing. Ms adelante se detallar este mecanismo de pintado. Se ocupa tambin de gestionar los eventos producidos por las acciones del usuario sobre el diagrama, controla por tanto los eventos de ratn y de teclado utilizando para ello la arquitectura de gestin de eventos de Swing, concretamente las clases MouseMotionListener, MouseListener y KeyEventDispatcher. A continuacin se van a detallar los mtodos que ofrece esta clase al programador que utilice la API indicando al cumplimiento de qu requisito corresponde cada mtodo: void add(Jcomponent c) Este mtodo sobrescribe el mtodo add de la clase JPanel, permite que se pueda aadir cualquier componente Swing al panel y realiza las operaciones necesarias para que este componente pase a formar parte del diagrama. Cumpliendo de este modo con el requisito REQGCOMP8. void addConector(Conector c) Este mtodo permite aadir un nuevo conector al diagrama. A travs de los mtodos de la clase Conector que se detallarn ms adelante el programador puede relacionar este conector con los componentes de origen y destino. Una vez relacionado el conector con los componentes lo aadir al panel utilizando este mtodo. Este mtodo conjuntamente con los mtodos de la clase Conector sirven para cumplir con el requisito REQGCON1 para el programador. void removeConector(Conector c)

Pgina 52 de 88

Java Swing Draw

Alfredo Casado Bernardez

Este mtodo permite borrar un conector previamente creado. Con este mtodo satisfacemos el requisito REQGCON2 para el programador. void activateDesignMode() y void activateStaticMode() Estos dos mtodos permiten activar el modo de diseo y el modo esttico respectivamente. El mtodo activateDesignMode modificar el modo en caso de que el diagrama se encuentre en modo esttico en caso contrario no realizara accin alguna. El funcionamiento de activateStaticMode es anlogo. Estos dos mtodos sirven para satisfacer los requisitos REQGD6 y REQGD7. void readXML(Document d) Este mtodo permitir cargar en el panel el diagrama que se encuentre descrito dentro del objeto Document, la clase Document se encuentra en el paquete Java org.w3c.dom y representa la raz del documento XML, a travs de este objeto se puede tener acceso a todas las partes de documento XML. Cuando se llame a este mtodo se cargar en el panel el diagrama descrito en el XML eliminando el que se encuentre cargado. Con este mtodo se satisface el requisito REQGD2. void writeXML(Document d) Este mtodo permitir escribir el diagrama actual del panel en el objeto Document, de esta forma el programador que use la API podr obtener el rbol XML con la representacin del diagrama para manipularla. Este mtodo nos permite satisfacer el requisito REQGD4. GraphicElement La clase GraphicElement describe cada uno de los componentes que forman parte del diagrama, un GraphicElement puede ser o bien un componente bsico o bien una agrupacin de componentes como se explicar ms adelante. Cuando se aade un JComponent al panel a travs del mtodo add descrito anteriormente se crea un objeto de tipo GraphicElement que se encarga de gestionar el comportamiento del componente aadido. Esta clase por tanto ser la encargada de realizar las acciones que el usuario determine sobre un componente: movimiento o redimensin. Si por ejemplo el usuario pulsa sobre la zona interior de un componente esta

Pgina 53 de 88

Java Swing Draw

Alfredo Casado Bernardez

clase determinar que quiere realizar un movimiento y se encargar de ir desplazando el componente en la direccin en la que el usuario mueva el ratn. A continuacin se detallan los mtodos ms destacados que ofrece esta clase. void reshape(int x,int y,int width,int height) Este mtodo permite redefinir la posicin y el tamao del componente, los parmetros x e y definen el punto de origen del componente, en este punto es donde se colocar la esquina superior izquierda del componente, los otros dos parmetros definen el ancho y la altura del componente respectivamente. Con este mtodo se satisfacen los requisitos REQGCOMP1 y REQGCOMP2. void move(int dx,int dy,int dwidth, int dheight) Este mtodo permite redefinir la posicin y el tamao del componente en base a un desplazamiento. Los parmetros dx y dy definen el desplazamiento del componente en el eje x y el eje respecto de su posicin actual. Los parmetros dwidth y dheight definen la variacin deseada en el ancho y el alto del componente. Este mtodo supone una forma alternativa para satisfacer los requisitos REQGCOMP1 posicin de forma relativa a las actuales. int getX(),int getY(),int getWidth e int getHeight() Estos mtodos permiten obtener la posicin x e y del componente as como su ancho y alto respectivamente. Adems de los mencionados esta clase dispone de otros mtodos que se detallarn cuando se especifique el diseo realizado para permitir las agrupaciones de componentes. Conector La clase Conector describe cada uno de los diferentes conectores situados sobre el diagrama. Cada conector se encarga de unir dos elementos grficos del diagrama. Adems los conectores pueden disponer de N puntos de control. Cada punto de control es un punto que se fija en el diagrama por el que el conector deber pasar, en la siguiente ilustracin se muestra un conector con varios puntos de control: y REQGCOMP2. Se proporciona una alternativa al programador cuando quiera redefinir el tamao o la

Pgina 54 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 14 Conector con varios puntos de control

Los conectores se pueden anclar en cualquier posicin situada al borde de los componentes que unen, un punto de anclaje es un punto del componente al que el conector quedar fijado. De no existir puntos de anclaje la posicin en la que un conector iniciar su dibujado al borde del componente se calcular automticamente. El calculo automtico de las posiciones de inicio del componente se realiza trazando una lnea entre los centros de los dos componentes que une (o bien entre el centro de un componente y el punto del control ms cercano) y posteriormente calculando el punto de interseccin de esa lnea con el borde del componente, dicho punto de interseccin ser el lugar desde el que se comience a dibujar el conector. En la siguiente figura se muestra grficamente lo explicado:

Ilustracin 15 - Calculo automtico de posicin de conectores

Como se puede observar en el dibujo las cruces rojas denotan el punto de interseccin de la lnea trazada con el componente y la parte en azul de la lnea es la que finalmente se pintar en el diagrama.

Pgina 55 de 88

Java Swing Draw

Alfredo Casado Bernardez

En el siguiente diagrama se muestra la diferencia entre un conector sin puntos de anclaje y otro con puntos de anclaje.

Ilustracin 16 - Diferencia conector sin y con puntos de anclaje.

A continuacin se enumerarn los mtodos ms importantes que proporciona la clase Conector: void setInitialElement(GraphicElement ge ) y void

setFinalElement(GraphicElement ge) Estos dos mtodos permiten definir cules van a ser los componentes inicial y final que unir el conector respectivamente. Una vez construido un objeto de tipo componente habr que llamar a estos mtodos y posteriormente aadir el conector al panel mediante el mtodo addConector de la clase GraphicPanel. Con estos mtodos conseguimos satisfacer el requisito REQGCON1. void setControlPoint(int x,int y,int num_line) Este mtodo nos permite definir un punto de control en el conector, los dos primeros parmetros x e y son las coordenadas dentro del diagrama donde se colocar este punto de control, el tercer parmetro num_line es el segmento del conector donde se colocar este punto de control. Si el conector no tuviera ningn punto de control previamente creado el segmento sera el 1, en caso de tener algn punto de control ya creado habr que indicarle en cul queremos hacerlo. A travs de este mtodo satisfacemos el requisito REQGCON3.

Pgina 56 de 88

Java Swing Draw

Alfredo Casado Bernardez

void removeControlPoint(int control_point) Este mtodo borrar un punto de control previamente creado, ser necesario indicarle que punto de control queremos borrar. Los puntos de control se numeran desde 0 hasta N partiendo desde el componente inicial al que est asociado el conector. A travs de este mtodo satisfacemos el requisito REQGCON5. void moveControlPoint(int x,int y, int control_point) Este mtodo mover el punto de control indicado mediante el parmetro control_point situndolo en la coordenada del diagrama definida por los parmetros x e y.

void setInitialPort(int x, int y) y void setFinalPort(int x,int y) Estos mtodos nos permiten crear puntos de anclaje, el mtodo

setInitialPort crear un punto de anclaje sobre el componente inicial del conector en las coordenadas x e y indicadas siempre y cuando stas coincidan con algn punto en el borde del componente, en caso de que no coincidan se crear un punto de anclaje en la posicin del borde del componente ms cercana a estas coordenadas. El funcionamiento del mtodo setFinalPort es anlogo pero con el componente final del conector. A travs de estos dos mtodos satisfacemos los requisitos REQGCON6, REQGCON7, REQGCON8. Ntese que indicamos el requisito REQCON7 referido a la capacidad de poder mover puntos de anclaje, ya que slo existe un punto de anclaje en cada componente. Cada vez que el programador desee cambiarlo de posicin simplemente deber llamar a uno de estos dos mtodos indicando la nueva posicin. void removeInitialPort() y void removeFinalPort() A travs de estos dos mtodos el programador podr borrar los puntos de anclaje previamente definidos en el componente inicial o en el final respectivamente. Con este mtodo se satisface el requisito REQGCON8.

Pgina 57 de 88

Java Swing Draw

Alfredo Casado Bernardez

5.2 Grupos de Componentes


En el requisito REQGCOMP4 se dice que ser posible agrupar varios componentes y que una vez que estos componentes estn agrupados deben comportarse como si de un componente bsico se tratara. Esto implica que un grupo de componentes podr a su vez contener otros grupos, que se podrn definir conectores que unan grupos de componentes con otros elementos del diagrama. En definitiva que todos los requisitos definidos para componentes deben satisfacerse igualmente para el caso de los grupos de componentes. De esta forma se plantea un problema de diseo que despus de ser analizado se ha decidido resolver a travs del patrn de diseo Composite. A continuacin explicaremos brevemente en qu consiste este patrn para posteriormente mostrar cmo se refleja la implementacin del mismo dentro del diseo de JSD. Patrn de diseo Composite La idea bsica del patrn de diseo es crear un modelo en el cual existen clases de tipo componente y clases que agrupan componentes, llamadas compositoras (Composite). Estas clases pueden compartir una interfaz comn, representada por una superclase. As, no es necesario diferenciar en general entre clases componentes y clases compositoras. Si se sigue la idea intuitiva de crear tipos de clases particularizadas para las funcionalidades de contenedor y componente, el cdigo que las maneja ha de tratarlas tambin de manera diferente, con las complejidades que eso entraa. A continuacin se muestra un diagrama con las clases integrantes de este patrn y sus relaciones.

Pgina 58 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 17 - Patrn de diseo Composite

El patrn define la creacin de estructuras compuestas por componentes que a su vez sean capaces de actuar como contenedores manteniendo un esquema de uso uniforme para los objetos individuales y compuestos. Propone una solucin basada en composicin recursiva que evita esta distincin simplificando con ello mucho el tratamiento de las clases. Aplicabilidad de Composite Este patrn se puede utilizar cuando: Se quiere representar una jerarqua de objetos todo-parte, es decir, de agregacin. Cuando se pretende que los clientes sean capaces de ignorar la diferencia entre objetos compuestos y objetos individuales de cara a determinadas caractersticas y comportamientos. Como se puede observar este patrn de diseo encaja perfectamente en nuestra problemtica concreta, la estructura componentes-grupo de componentes es una estructura todo-parte que puede ser definida de manera recursiva. Podemos por tanto aprovecharnos

Pgina 59 de 88

Java Swing Draw

Alfredo Casado Bernardez

de todas las ventajas que nos aporta este patrn. En la Ilustracin 18 se muestra la implementacin de este patrn dentro del diseo de JSD.

Ilustracin 18 - Composite en JSD

El patrn ha sido implementado con pequeas variaciones, la clase GraphicElement no incluye las operaciones para aadir, borrar y obtener elementos, esto es as porque en nuestro caso particular no todos los componentes pueden actuar como contenedores, slo actuarn as los grupos de elementos. Podemos observar como los mtodos reshape y move estn definidos en GraphicElement aplicando la idea del mtodo Operation definido en el patrn, de este modo si se invoca el mtodo move(dx,dy), dnde dx y dy denotan los pixels horizontales y verticales de desplazamiento, un grupo de elementos sobre los que se invoque esta operacin podra implementar el movimiento repintndose en la nueva posicin e invocando sucesivamente los mtodos move(dx,dy) de sus componentes que se repintaran a si mismo en la posicin correcta e invocaran a su vez este mtodo en sus componentes y as sucesivamente.

5.3 Puntos de extensin del API


Segn se indicaba en los requisitos: REQGCON9: Personalizacin de componentes.

Pgina 60 de 88

Java Swing Draw -

Alfredo Casado Bernardez

REQGCOMP9: Personalizacin de operaciones de grupo. REQGCOMP10: Personalizacin de pintado de grupo. REQGCOMP11: Personalizacin de pintado de grupo. Es necesario definir los mecanismos para que un programador que utilice la API

JSD pueda extender el comportamiento de sta en los puntos indicados. Deber ser posible que el programador defina sus propios componentes, mtodos de pintado de conectores, mtodo de pintado de grupos y operaciones de grupos sin necesidad de modificar el cdigo de la API JSD. En el caso de los componentes al permitir la posibilidad de introducir cualquier componente Swing el programador sencillamente deber definir una clase que herede de JComponent, clase de que la heredan todos los componentes Swing. El problema de diseo aparece a la hora de definir los mecanismos de extensin para el resto de casos. Para resolver este problema de diseo se ha recurrido a los patrones estructurales bsicos delegation e interfaz, a continuacin se describirn brevemente estos patrones para posteriormente ver cmo queda reflejado su uso dentro del diseo de JSD. Patrn Delegation ste es un patrn fundamental de tipo estructural. Indica cundo no usar herencia. La delegacin es una forma de extender y reutilizar la funcionalidad de una clase, escribiendo una clase adicional con funcionalidad extra que usa instancias de la clase original para proveer su propia funcionalidad. La delegacin es una forma de extender el comportamiento de una clase mediante llamadas a mtodos de otra clase, en lugar de heredando de ella. La delegacin es ms apropiada que la herencia en muchas situaciones. Por ejemplo, la herencia es til para modelar relaciones de tipo es-un o es-una, ya que estos tipos de relaciones son de naturaleza esttica. Sin embargo, relaciones de tipo es-unrol-ejecutado-por son mal modeladas con herencia. La solucin general propuesta en este patrn es: incorporar la funcionalidad de la clase original usando una instancia de la clase original y llamando sus mtodos.

Pgina 61 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 19 - Patrn delegation

En la Ilustracin 19, se muestra una clase con rol Delegador que usa una clase con el rol Delegado. Aqu se usa la delegacin para reutilizar y extender el comportamiento de la clase. Patrn Interfaz Es un patrn fundamental de tipo estructural. Mantiene una clase (la interfaz) que usa datos y servicios provistos por otras clases independientes, para proveer un acceso uniforme. Usando indireccin, esta clase interfaz provee a sus clases herederas acceso uniforme a mtodos y atributos especficos, sin que deban saber a qu clase especfica pertenecen. El diagrama general de este puede apreciarse en la Ilustracin 20:

Ilustracin 20 - Patrn interfaz

En la figura anterior, la clase Cliente usa otras clases que implementan la interfaz IndireccinIF. La interfaz IndireccinIF provee la indireccin que mantiene a la clase Cliente independiente de las clases que proveen los servicios (clase Servicios). Por lo general, los patrones Interfaz y Delegacin son usados juntos. Una vez descritos estos patrones veremos cmo encajan dentro del diseo de JSD. Se mostrar el caso de la personalizacin del pintado de conectores teniendo en cuenta que el diseo para el caso de la personalizacin de pintado de grupos y para el caso de la personalizacin de operaciones de grupo son anlogos a ste.

Pgina 62 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 21 - Delegation e interfaz para extensin de pintado de conectores

Como se puede observar en la Ilustracin 21 la clase Conector cumple el rol de delegador y delega el pintado del conector en la interfaz DrawConector que hace las veces de delegado. Por tanto la clase Conector extender sus funcionalidades de pintado de conectores a travs del Interfaz DrawConector. La clase DrawConectorSimple es la clase que proporciona la API JSD por defecto para realizar el pintado de conectores, esta clase implementa los mtodos descritos en el interfaz DrawConector proporcionando un mecanismo simple de pintado, pinta lneas como rectas, los puntos de control como un crculo relleno y los anclajes (Ports) como un cuadrado. En la Ilustracin 22 se muestra un ejemplo del pintado realizado por esta clase.

Ilustracin 22 - Pintado de conectores DrawConectorSimple

La clase DrawExtension mostrada en el diagrama sera la clase creada por el programador que haga uso de la API implementado a su gusto los mtodos de pintado para cada una de las partes del conector. Otro mecanismo de extensin del que dispone el programador es heredando de la clase DrawConectorSimple e implementado slo aquellos mtodos que considere oportuno, como se muestra en la Ilustracin 23.

Pgina 63 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 23 - Extensin de pintado por herencia

De este modo el programador puede decidir slo personalizar aquellas partes de pintado del conector que considere adecuadas, en la Ilustracin 24 se muestra una personalizacin que slo sobrescribe el mtodo paintLines para colocar una etiqueta sobre la lnea del conector.

Ilustracin 24 - Ejemplo de extensin de pintado

5.4 Interfaz
Como hemos visto en el punto anterior los requisitos REQGCON9, REQGCOMP9, REQGCOMP10, REQGCOMP11 especificaban que el programador deba ser capaz de extender ciertas partes de la API sin la necesidad de modificar el cdigo del ncleo de la API. Estos requisitos tambin especifican que el programador debe ser capaz de incluir estos nuevos elementos creados como extensiones a la API en el men contextual que permite al usuario manipular los diagramas. El programador podr incluir nuevas categoras de elementos, por ejemplo puede incluir una nueva categora de conectores que contenga los conectores usados en los diagramas de clases UML, o bien podra definir una nueva categora de grupos de operaciones que realizaran layouts complejos. El problema de diseo que se nos plantea

Pgina 64 de 88

Java Swing Draw

Alfredo Casado Bernardez

es cmo incluir esas nuevas categoras de elementos dentro del men contextual que se le presenta al usuario y cmo instanciar el objeto adecuado dependiendo de la opcin seleccionada por el usuario. Para resolver el problema de instanciar un objeto perteneciente a una categora de objetos con las mismas caractersticas recurrimos al patrn de diseo Abstract Factory A continuacin se describir brevemente este patrn para posteriormente ver como encaja dentro de la API JSD. Patrn Abstract Factory El propsito de este patrn es proporcionar una interfaz para crear familias de objetos relacionados sin especificar sus clases concretas. Consiste en definir una clase abstracta (AbstractFactory) que declare una interfaz para crear toda una familia de productos definidos tambin en clases abstractas y programar toda la lgica de la aplicacin interactuando con estas clases abstractas.

Pgina 65 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 25 - Patrn Abstract Factory

Cuando la lgica necesite nuevos productos no tiene mas que utilizar esta interfaz para su creacin, sin necesidad de saber exactamente qu ConcreteFactory est utilizando ni qu ConcreteProducts est recibiendo. De esta manera el cliente se mantiene absolutamente independiente de la implementacin concreta. Este patrn de diseo nos aporta dos ventajas relevantes para nuestro diseo concreto: Asla las clases concretas. Facilita la inclusin de nuevas familias de productos.

Pgina 66 de 88

Java Swing Draw

Alfredo Casado Bernardez

Como ejemplo utilizaremos las factoras dedicadas a la creacin de nuevas operaciones de grupo, en el caso de la creacin de nuevos tipos de conectores y marcos de grupo el funcionamiento es anlogo. En la Ilustracin 26 vemos cmo disponemos de dos categoras o familias de operaciones de grupo: las operaciones de alineacin y las operaciones de distribucin. La clase GroupOperationsFactory es nuestro AbstracFactory que se encarga de definir que mtodos deben implementar las factoras concretas. Podemos observar tambin que cada factora concreta slo instancia nuevos objetos que pertenezcan a su familia. En el patrn podemos ver que existe una relacin de herencia entre la AbstracFactory y las ConcreteFactory, sin embargo en nuestro caso no usamos herencia sino que utilizamos un interfaz que deber ser implementado. En otros lenguajes de programacin como C++ no existe el concepto de interfaz y se utilizan clases abstractas en su lugar, en nuestro caso al estar la API JSD implementada en Java en lugar de definir clases abstractas definimos interfaces.

Ilustracin 26 - Abstract Factory en JSD

Pgina 67 de 88

Java Swing Draw

Alfredo Casado Bernardez

Las factoras concretas deben por tanto implementar un mtodo que nos permita instanciar un objeto de su familia (getOperation), y adems le hemos aadido un mtodo que nos devuelve un men con todos los objetos que la factora es capaz de instanciar. De este modo cuando al GraphicPanel le asocien una nueva factora de operaciones mediante el mtodo insertGroupOperationFactoy podr incluirla dentro del men contextual adecuado para presentarle al usuario las nuevas opciones que pone a su disposicin la factora aadida. En la siguiente captura de pantalla podemos ver cmo quedara el submen de grupos de operaciones si aadimos las dos factoras concretas explicadas al panel:

Ilustracin 27 - Men creado dinmicamente a travs de factoras

Ahora cuando el usuario elija una de las opciones el GraphicPanel solicitar a la factora a la que pertenezca la opcin que le proporcione un objeto del tipo que ha determinado el usuario y posteriormente a travs de ese objeto aplicar la operacin al grupo de componentes sobre el que el usuario estaba situado.

Pgina 68 de 88

Java Swing Draw

Alfredo Casado Bernardez

5.5 Serializacin
Los requisitos: REQGD1 y REQGD3 sealaban que el usuario deba ser capaz de guardar un diagrama a fichero y de cargar un diagrama en el panel que estuviera situado en un fichero. Los requisitos REQGD2 y REQGD4 sealaban que el programador deba disponer de la opcin de obtener el rbol DOM XML con la representacin del diagrama y cargar en el panel un rbol DOM XML que contuviera un diagrama correctamente formado. En este apartado vamos a presentar el diseo que se ha llevado a cabo para satisfacer estos requisitos. Haciendo uso de nuevo del patrn estructural bsico interfaz se ha definido una interfaz que deben implementar todos aquellos objetos que tengan la capacidad de serializar su contenido en forma de estructura XML.

Ilustracin 28 - Clases que implementan la interfaz XMLPersistent

Como podemos observar en la Ilustracin 28 esta interfaz es implementada por los componentes principales de la API JSD, de este modo el panel ser capaz de serializar su contenido en XML y para ello solicitar a los objetos que contenga, conectores y elementos grficos, que le den su representacin en XML, para as componer un fichero XML con el contenido del diagrama que posteriormente pueda ser cargado en un nuevo panel. Extensin de la API y serializacin Si un programador extiende la funcionalidad de la API incluyendo nuevos componentes, marcos de grupo o conectores tambin deber ser capaz de almacenar el contenido persistente de las nuevas clases que defina dentro de este fichero. Si el programador por ejemplo define un nuevo DrawConector se le deber permitir que

Pgina 69 de 88

Java Swing Draw

Alfredo Casado Bernardez

almacene informacin persistente de ese objeto en el fichero para luego poder reconstruir el diagrama correctamente. En el caso del conector que dibuja una etiqueta sobre la lnea es probable que el programador decida almacenar el valor de esa etiqueta dentro del fichero XML. Para lograr esto lo nico que debe hacer es implementar la interfaz XMLPersistent y guardar los parametros que desee siguiendo el siguiente formato: <EXTENDED_CONFIGURATION> <PARAMETER NAME=Etiqueta VALUE=mi_etiqueta\> <EXTENDED_CONFIGURATION> Cuando la clase Conector est escribiendo su contenido en XML preguntar a la instancia del objeto DrawConector que contiene si ste implementa la interfaz XMLPersistent, en caso de que la implemente le pasar el nodo EXTENDED_CONFIGURATION para que lo rellene adecuadamente con los parmetros que el programador decida hacer persistentes. Se podra haber optado por la opcin de que el programador eligiera arbitrariamente la representacin XML de la nueva clase que defina pero en caso de hacerlo as no podramos definir un Schema de validacin para el fichero XML, ya que la estructura del fichero variara en funcin de las implementaciones concretas de la interfaz XMLPersistent que llevara a cabo cada programador que extendiese la API. Este mecanismo funciona de forma anloga para los nuevos componentes y los nuevos marcos de grupo que se implementen. Serializacin del diagrama A la hora de serializar el diagrama ser necesario asociar un identificador a cada elemento grfico que se serialize, cuando un conector serialize su contenido deber indicar qu elementos grficos conecta, en el caso de los grupos de elementos debern especificar una lista con los elementos contenidos. A continuacin se muestra un ejemplo de serializacin de un conector y de un grupo. Conector <CONECTOR> <INITIAL_ELEMENT>2</INITIAL_ELEMENT> <FINAL_ELEMENT>4</FINAL_ELEMENT>

Pgina 70 de 88

Java Swing Draw </CONECTOR> Grupo <ELEMENT_GROUP id="5"> <ELEMENT>1</ELEMENT> <ELEMENT>2</ELEMENT> </ELEMENT_GROUP>

Alfredo Casado Bernardez

En el caso del conector ste indica que su elemento inicial es el 2 y su elemento final el 4, el grupo nos indica que contiene los elementos 1 y 2. En la fase de carga a partir de un fichero XML, cuando un conector o grupo requieran para construirse un elemento grfico con un cierto identificador ser necesario que este elemento grfico haya sido ledo previamente. Ya que los elementos se leern en el orden en el que se escriban al fichero ser necesario escribirlos en el orden adecuado para asegurar que cuando un elemento o grupo requieran de otro elemento grfico ste haya sido ledo previamente. Por tanto los elementos que primero deben escribirse son los elementos bsicos que no dependen de ningn otro, posteriormente deben escribirse aquellos elementos que dependan tan slo de elementos bsicos, posteriormente slo los que dependan de estos ltimos y as sucesivamente. Los grupos de elementos como se explico anteriormente pueden estar formados por elementos bsicos y por otros grupos. Se define una propiedad en los elementos llamada nivel de agrupacin, esta propiedad nos indicar si el grupo contiene slo elementos bsicos o contiene a su vez otros grupos. De este modo el nivel de agrupacin de un elemento ser siempre uno ms que el nivel de agrupacin mayor entre todos los elementos que contenga. As por ejemplo el nivel de agrupacin de un elemento bsico ser 0, el nivel de agrupacin de un elemento que contenga slo elementos bsicos ser 1, el nivel de agrupacin de un elemento que contengo otro que se compone a su vez de elementos bsicos ser 2 y as sucesivamente. Con esta nueva propiedad definida podemos establecer el orden correcto en el que los componentes deben escribirse para que luego puedan ser cargados correctamente, asegurndonos que cuando se carga un componente todos los que ste contienen ya han sido cargados previamente. El orden de escritura del fichero ser por tanto: 1- Elementos bsicos (nivel de agrupacin 0).

Pgina 71 de 88

Java Swing Draw 2- Elementos nivel de agrupacin 1. 3- Elementos nivel de agrupacin 2. 4- Elementos nivel de agrupacin ... 5- Elementos nivel de agrupacin N. 6- Conectores.

Alfredo Casado Bernardez

Los conectores se deben escribir despus de todos los elementos ya que un conector puede conectar elementos de cualquier nivel de agrupacin, por tanto escribindolos al final garantizamos que cuando se cargue un conector estarn previamente cargados los elementos que ste conecta. XML Schema Se ha definido un Schema XML para la validacin del fichero, a continuacin se muestra de modo grfico este Schema. Los diagramas que se van a mostrar han sido generados con la herramienta XML Spy [XMLSpy01].

Ilustracin 29 - Schema validacin, GraphicPanel

Pgina 72 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 30 Schema de validacin, GraphicElement

Ilustracin 31 - Schema de validacin, Element_Group

Ilustracin 32 - Schema de validacin, Conector

Pgina 73 de 88

Java Swing Draw

Alfredo Casado Bernardez

A travs de estos diagramas se puede observar el contenido exacto de todos los distintos elementos que se almacenarn en el XML. Adems el Schema nos permite realizar una validacin del fichero previa a la carga, de este modo podemos comprobar si un fichero previamente guardado cumple con el formato que hemos definido para la serializacin de los diagramas.

5.6 Mecanismo de Pintado


En primer lugar en este apartado presentaremos una descripcin del mecanismo de pintado de Swing para posteriormente explicar el mecanismo de pintado seguido por JSD. Arquitectura de pintado de Swing Cuando un componente Swing necesita dibujarse a s mismo puede ser por varios motivos: La primera vez que se pinta. En respuesta a la vuelta de una posicin en la que se encontraba oculto. Porque necesita reflejar un cambio en el estado del programa. El proceso de pintado comienza cuando el componente ms alto necesita ser dibujado y va bajando por el rbol de contenidos. Esto est orquestado por el sistema de dibujo del AWT8, y se ha hecho ms eficiente mediante el manejador de dibujo de Swing y el cdigo de doble buffer. Los componentes Swing generalmente se dibujan a s mismos siempre que es necesario. Por ejemplo, cuando llamamos al mtodo setText de un componente, el componente debera redibujarse automticamente a s mismo, y si es necesario, redimensionarse. Si no lo hace as es un bug. El atajo es llamar al mtodo repaint sobre el componente para pedir que el componente se ponga en la cola para redibujado. Si se necesita cambiar el tamao o la posicin del componente pero no automticamente, deberamos llamar al mtodo revalidate sobre el componente antes de llamar a

Abstract Window Toolkit, es el antiguo framework para constuir GUIs de java sobre el que est

diseado Swing

Pgina 74 de 88

Java Swing Draw

Alfredo Casado Bernardez

repaint. Al igual que el cdigo de manejo de eventos, el cdigo de dibujo se ejecuta en el hilo de despacho de eventos. Mientras se est manejando un evento no tendr lugar el dibujado. De forma similar, si la operacin de dibujado tarda mucho tiempo, no se manejar ningn evento durante ese tiempo. Los programas slo deberan dibujarse cuando el sistema de dibujo se lo diga. La razn es que cada ocurrencia de dibujo de un propio componente debe ser ejecutado sin interrupcin. De otro modo, podran ocurrir resultados imprevisibles. como que un botn fuera dibujado medio pulsado o medio liberado. Para acelerar, el dibujo Swing usa doble-buffer por defecto. Podra ayudar al rendimiento si hacemos un componente Swing opaco, para que el sistema de dibujo de Swing pueda conocer que no tiene que pintar detrs del componente. Para hacer opaco un componente Swing, se llama al mtodo setOpaque(true) sobre el componente. Los componentes no-opacos de Swing puede parecer que tienen cualquier forma, aunque su rea de dibujo disponible es siempre rectangular. Por ejemplo, un botn podra dibujarse a s mismo dibujando un octgono relleno. El componente detrs del botn, (su contenedor, comnmente) sera visible, a travs de las esquinas de los lados del botn. El botn podra necesitar incluir cdigo especial de deteccin para evitar que se produzca un evento cuando el usuario pulsa en las esquinas del botn. Mtodos de pintado de los componentes swing Los JComponent (clase de la que heredan todos los componentes Swing) utilizan tres mtodos para pintarse que son invocados en este orden: paintComponent: el mtodo principal de pintado, en primer lugar pinta el fondo del componente si ste es opaco, posteriormente realiza el pintado personalizado del componente en cuestin, por ejemplo un JButton, un Jlabel, etc. paintBorder: pinta el borde del componente. paintChildren: se encarga de avisar a todos los componentes contenidos en el componente que recibe la llamada para que se pinten. En la siguiente figura se muestra de forma grfica como acta este mecanismo de pintado:

Pgina 75 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 33 Orden de pintado en JFC/Swing

Un ejemplo de pintado Consideramos la siguiente aplicacin Swing:

Ilustracin 34 Aplicacin Swing, ejemplo de pintado

Los componentes que forman esta aplicacin se muestran en el siguiente diagrama:

Ilustracin 35 Diagrama aplicacin Swing, ejemplo de pintado

A continuacin vamos a detallar uno a uno los pasos que sigue esta aplicacin para pintarse:

Pgina 76 de 88

Java Swing Draw

Alfredo Casado Bernardez

1. El contenedor de alto nivel, JFrame, se dibuja a s mismo. 2. El panel de contenido primero dibuja su fondo, que es un rectngulo slido de color gris. Luego le dice al JPanel que se dibuje l mismo. El rectngulo del panel de contenido realmente no aparece en el GUI finalizado porque est oscurecido por el JPanel. Nota: Es importante que el panel de contenido sea opaco. De otro modo, resultar en dibujados confusos. Como el JPanel es opaco, podemos hacer que sea el panel de contenido (sustituyendo setContentPane por el cdigo existente getContentPane().add). Esto simplifica considerablemente el rbol de contenidos y el dibujado, eliminado un contenedor innecesario 3. El JPanel primero dibuja su fondo, un rectngulo slido de color gris. Luego dibuja su borde. El borde es un EmptyBorder, que no tendr efecto excepto para incrementar el tamao del JPanel reservando algn espacio extra en los laterales del panel. Finalmente, el panel le pide a sus hijos que se dibujen a s mismos. 4. Para dibujarse a s mismo, el JButton dibuja su rectngulo de fondo si es necesario y luego dibuja el texto que contiene. Si el botn tiene el foco del teclado, significa que cualquier cosa que se teclee va directamente al botn para su procesamiento, luego el botn realiza algn dibujado especfico del Aspecto y Comportamiento para mostrar que tiene el foco. 5. Para dibujarse a s misma, la JLabel dibuja su texto. Los componentes Jlabel son transparentes el decir, no pintan el fondo

Mecanismo de pintado de JSD El mecanismo de pintado de Swing se basaba en 3 mtodos: paintBorders, paintComponent y paintChildren, en la documentacin de Swing se recomienda slo sobrescribir el mtodo paintComponent para realizar dentro de l los pintados propios del componente que se cree. Para nuestro mtodo de pintado se han respetado estas indicaciones realizando todo el pintado del diagrama sobrescribiendo el

Pgina 77 de 88

Java Swing Draw

Alfredo Casado Bernardez

mtodo paintComponent de la clase JPanel, de la que hereda el GraphicPanel de JSD. Los elementos bsicos del diagrama sern componentes Swing, por tanto el pintado de los mismos se delegar a la propia Swing que los pintar a travs del mtodo paintChildren. Previamente realizaremos todo el pintado del resto de elementos del diagrama: conectores, marcos de grupo y cuadro de seleccin en el mtodo paintComponent sobrescrito como hemos indicado anteriormente. Scroll en el diagrama Cuando un diagrama sobrepase los lmites del tamao de la ventana ser necesario que aparezca una barra de Scroll para que el usuario pueda pintar diagramas que superen el tamao de lo que es posible visualizar en pantalla. Para poder realizar dicho Scroll es necesario que el GraphicPanel se integre dentro de un JScrollPane. La clase JScrollPane mostrar las barras de scroll cuando el componente que contiene tenga un tamao que supere al definido para el JScrollPane. De este modo si se crea un JScrollPane de 600x600 y dentro de l se incluye al GraphicPanel, cuando este ltimo necesite pintar un componente en unas coordenadas que queden fuera del rea visible, deber redimensionarse convenientemente para que se muestren las barras de Scroll. Por tanto la primera operacin que se realizar dentro del mtodo paintComponent ser una comprobacin de las nuevas coordenadas donde se ubicar cada componente, en caso de que alguno supere el tamao actual del panel este deber redimensionarse para permitir que el componente pueda pintarse en la posicin deseada y aparezcan las barras de Scroll. En la Ilustracin 36 se muestra cmo al desplazar un componente fuera de los lmites actuales del panel se crean las barras de Scroll necesarias:

Pgina 78 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 36 - Scroll en el panel

Orden de pintado de grupos Es importante tambin a la hora del pintado el orden en el que se pintan los grupos, un grupo que contenga a otros grupos debe de pintarse antes que stos, de no hacerlo de esta forma el grupo que contiene a otros grupos tapara a estos ltimos. Para conseguir pintar los grupos en este orden se hace uso de la propiedad nivel de agrupacin que se explic en el apartado de serializacin. Ahora debemos de pintar los grupos en orden descendente segn su nivel de agrupacin, de este modo conseguimos que los grupos que contienen a otros se pinten antes que estos y no tapen el pintado de estos ltimos.

Ilustracin 37 - Orden de pintado de grupos

Pintado de cuadro de conectores Los conectores debern pintarse despus de cualquier grupo, ya que los conectores pueden conectar a elementos grficos con diferentes niveles de agrupacin, el trazo del conector siempre deber quedar por encima del dibujo de los grupos.

Pgina 79 de 88

Java Swing Draw Pintado de rectngulo de seleccin

Alfredo Casado Bernardez

Como se indicaba en el requisito REQGCOMP3 el usuario debe poder realizar una seleccin mltiple de componentes dibujando un rectngulo que contenga a los componentes que quiere seleccionar. La traza de este cuadro de seleccin debe quedar por encima del resto de elementos, por tanto en caso de que el usuario est realizando una seleccin mltiple se dibujar este rectngulo de seleccin en ltimo lugar. Resumiendo la funcin paintComponent deber realizar las siguientes tareas: 1 - Comprobar si algn componente se sale de los lmites para aumentar el tamao del panel. 2 Pintar los grupos en orden descendente segn su nivel de agrupacin. 3 Pintar los conectores. 4 Pintar el rectngulo de seleccin si es necesario.

Pgina 80 de 88

Java Swing Draw

Alfredo Casado Bernardez

6. Pruebas
Una de las principales caractersticas de XP (eXtreme Programming), metodologa seguida para el desarrollo de este proyecto, es la realizacin de pruebas unitarias para probar cada nueva funcionalidad implementada y contar desde fases tempranas del desarrollo con una API funcional a la que poco a poco se le van aadiendo nuevas caractersticas. De este modo durante la fase de desarrollo se han realizado numerosas pruebas unitarias a medida que han ido incorporndose nuevas funcionalidades. No obstante una vez concluido el desarrollo de la API se ha realizado una prueba de mayor envergadura integrando la API en una aplicacin ms compleja para verificar su correcto funcionamiento ante unas circunstancias de gran exigencia. Dicha prueba ha sido realizada haciendo uso de la API JavaCET [JCET] para la construccin de meta-modelos de programas realizados en lenguaje Java. Para la realizacin de esta prueba se ha construido un nuevo elemento para integrar en los diagramas que sea capaz de representar clases UML. UMLClassElement Esta nueva clase para representar clases en UML ha sido desarrollada haciendo uso de los puntos de extensin de la API JSD que se han presentado en el apartado de diseo e implementacin. Para la inclusin de un nuevo elemento en el diagrama basta con crear un componente Swing estndar, esto se consigue heredando de la clase JComponent. En la Ilustracin 38 podemos ver el aspecto que tendr este nuevo elemento.

Ilustracin 38 - UMLClassElement

Adems del aspecto visual de la clase tambin necesitamos que se guarde informacin persistente, en este caso queremos hacer persistente la informacin acerca del nombre de la clase y el estereotipo. Para lograr esta persistencia implementamos la

Pgina 81 de 88

Java Swing Draw

Alfredo Casado Bernardez

interfaz XMLPersistent como se indicaba en el apartado de diseo e implementacin. En el siguiente segmento de cdigo XML podemos ver exactamente qu informacin almacenar cada UMLClassElement, incluyendo la informacin extendida que en este caso usamos para guardar el nombre de la case y su estereotipo.
<GRAPHIC_ELEMENT id="0"> <TYPE>UMLClassElement</TYPE> <CONFIGURATION> <WIDTH>100</WIDTH> <HEIGHT>100</HEIGHT> <X_POSITION>40</X_POSITION> <Y_POSITION>40</Y_POSITION> </CONFIGURATION> <EXTENDED_CONFIGURATION> <PARAMETER NAME="class_name" VALUE="GraphicPanel"/> <PARAMETER NAME="stereotype" VALUE="class"/> </EXTENDED_CONFIGURATION> </GRAPHIC_ELEMENT>

Ahora que disponemos de un nuevo elemento que es capaz de representar clases UML mostrndonos su nombre y estereotipo vamos a presentar la aplicacin construida con JavaCET para la creacin de diagramas mediante la API JSD. Prueba de creacin de diagramas utilizando la interfaz de JSD para el programador Esta aplicacin de prueba se encargar a travs de la librera JavaCET de analizar un conjunto de ficheros con cdigo fuente Java para construir el meta-modelo de dichos ficheros analizados, a partir de este meta-modelo mostraremos un diagrama a travs de JSD que nos permitir visualizar las clases integrantes de un determinado paquete y sus relaciones. Para esta prueba concreta simplemente se ha trazado un conector entre la clase o interfaz y las interfaces que sta implementa. En la Ilustracin 39 podemos observar el aspecto de esta aplicacin de prueba.

Pgina 82 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 39 - Aplicacin de prueba con JavaCET

A la izquierda se muestra una lista de los paquetes analizados por JavaCET y a la derecha se muestra el GraphicPanel de JSD con todas las clases integrantes del paquete seleccionado as como sus relaciones. En la imagen se est mostrando un paquete que contiene 49 clases y 19 relaciones. El tiempo de respuesta a la hora de mostrar el diagrama es inmediato y se mueve con total fluidez a pesar del gran nmero de elementos y relaciones presentes en el diagrama. Prueba serializacin e interfaz de usuario Una vez creado el diagrama se procede a guardar dicho diagrama en fichero para posteriormente cargarlo a travs de JSD en una nueva aplicacin de prueba, de este modo queremos comprobar el correcto funcionamiento de la serializacin de diagramas. Una vez cargado se proceder a manipular el mismo a travs de la interfaz de usuario proporcionada por el API JSD, construiremos algunos grupos y colocaremos el diagrama de forma que resulte ms comprensible. En la Ilustracin 40 podemos observar una captura de pantalla de este proceso.

Pgina 83 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 40 - Ordenando el diagrama creado con JavaCET y JSD

Prueba de exportacin a SVG En ltimo termino para esta prueba vamos a exportar el diagrama una vez ordenado a formato SVG, de este modo comprobaremos tambin el correcto funcionamiento de esta opcin ante un diagrama de gran dimensin. En la Ilustracin 41 mostramos el diagrama una vez ordenado y exportado a SVG, como visualizador utilizamos el Internet Explorer que a su vez utiliza el Corel SVG Viewer9 para la presentacin de ficheros en este formato.

Para obtener ms informacin acerca del pluggin para visualizacin de SVG Corel SVG Viewer:

http://www.smartgraphics.com/Viewer_prod_info.shtml

Pgina 84 de 88

Java Swing Draw

Alfredo Casado Bernardez

Ilustracin 41 - SVG con Internet Explorer y visualizador Corel SVG

Con esta serie de pruebas hemos pretendido verificar el correcto funcionamiento de la API JSD en cuanto su interfaz de programacin, serializacin, interfaz de usuario y exportacin a formato SVG. La prueba se ha desarrollado con un perfecto funcionamiento de la API a pesar del gran nmero de elementos mostrados en el diagrama.

7. Conclusiones
Durante el desarrollo de este proyecto se ha logrado cumplir con los requisitos especificados en el captulo 5. Se ha logrado por tanto la creacin de una API que permite la construccin y manipulacin de diagramas, incorporando tanto una interfaz de programacin como una interfaz de usuario. De este modo facilitamos la inclusin de esta API a los distintos programadores que deseen usarla en sus proyectos evitndoles tener que gestionar todas las interacciones del usuario con el diagrama, ya que la propia API incorpora estos mecanismos. La API JSD es capaz de integrarse en cualquier aplicacin realizada en lenguaje Java y que utilice el framework Swing como sistema para construir interfaces de usuario. Este framework es el ms popular para el desarrollo de interfaces de usuario en Java, por

Pgina 85 de 88

Java Swing Draw

Alfredo Casado Bernardez

lo tanto conseguimos que esta API pueda ser utilizado por el mayor nmero de desarrolladores posible. Otro factor importante a resear de este proyecto es la capacidad de integrar componentes Swing como parte del diagrama, esta funcionalidad no estaba cubierta por ninguna de las APIs analizadas durante la fase de estudio del estado del arte, gracias a esta funcionalidad podemos reutilizar dentro de nuestros diagramas cualquier componente Swing existente, aportando adems a los diagramas toda la funcionalidad e interactividad proporcionada por estos componentes. Es necesario tener en cuenta que dentro del marco de un Proyecto Fin de Carrera queda fuera de nuestro alcance el intentar crear una API que pueda competir con otras APIs comerciales con aos de desarrollo y un gran nmero de desarrolladores dedicados a su implementacin. Por tanto el objetivo fundamental de este proyecto no era crear una API que pudiera competir en funcionalidad con las comerciales, sino crear una API que incorporara la funcionalidad bsica que debera contener una API de este tipo y adems realizar un buen diseo basado en patrones que proporcionara los mecanismos de extensin necesarios para que esta API pueda ir creciendo e incorporando nueva funcionalidad mediante futuros trabajos. Cabe mencionar que este proyecto se ha publicado como cdigo abierto bajo licencia GPL y se encuentra disponible en la direccin http://vido.escet.urjc.es/jsd. Trabajos Futuros Como se mencionaba anteriormente durante el desarrollo de este proyecto se han sentado las bases necesarias para poder afrontar trabajos futuros que amplen la funcionalidad de JSD, entre los trabajos posibles a realizar en esta direccin cabra destacar: Creacin de componentes, conectores y marcos de grupo para la construccin de diagramas en diversos dominios de aplicacin, como por ejemplo: o Diagramas entidad-relacin para programas de gestin de bases de datos. o Diagramas de workflow para aplicaciones de control de flujo de trabajo. o Diagramas para la modelizacin de redes de ordenadores.

Pgina 86 de 88

Java Swing Draw

Alfredo Casado Bernardez

o Diagramas para la modelizacin de redes neuronales. Creacin de algoritmos de layout complejos a travs de la extensin de las operaciones de grupo, por ejemplo layouts para: o Correcta visualizacin de diagramas UML complejos. o Layouts ortogonales. o Layouts jerrquicos. Creacin de nuevas funcionalidades que permitan definir animaciones para los distintos elementos del diagrama. Inclusin de algoritmos de grafos: algoritmos para caminos mnimos, deteccin de grafos cclicos y acclicos, etc.

Pgina 87 de 88

Java Swing Draw

Alfredo Casado Bernardez

Bibliografa
[Stasko98] John T. Stasko, John B. Domingue, Marc H. Brown and Blaine A. Price, Software Visualization, 1998 [Baecker81] Baecker, R, Sorting out Sorting, 1981 [Bloch01] Bloch, J, Effective Java Programming Language Guide, 2001 [Booch99] Booch, G; Jacobson, I; Rumbaugh, J, El lenguaje Unificado de Modelado, 1999 [Eckel98] Eckel, B, Thinking in Java, 1998 [Gamma95] Gamma, E; Helm, R: Johnson, R; Vlissides, J, Design Patterns -Elements of Reusable Object-Oriented Software, 1995 [BECK99] Beck, K., eXtreme Programming eXplained, 1999 [Sun01] http://java.sun.com/docs/codeconv/ [OJG01] http://openjgraph.sourceforge.net/ [YF01] http://www.yworks.com/ [JGO1] http://jgraph.sourceforge.net/ [LED01] http://www.mec.es/leda/ [JBN01] http://java.sun.com/products/javabeans/ [JFCS01] http://java.sun.com/products/jfc/ [XML01] http://www.w3.org/XML/ [JAXP01] http://java.sun.com/xml/jaxp/ [BAT01] http://xml.apache.org/batik/ [SVG01] http://www.w3.org/TR/SVG/ [W3C01] http://www.w3.org/ [JCET] http://vido.escet.urjc.es/javacet/

Pgina 88 de 88

Вам также может понравиться