3.- INTERFAZ GRAFICA DE USUARIO 3.1. Introducción. Interfaz gráfica de usuario (En inglés Graphic User Interface, también conocido con su acrónimo GUI) es un método para facilitar la interacción del usuario con el ordenador o la computadora a través de la utilización de un conjunto de imágenes y objetos pictóricos (iconos, ventanas..) además de texto. Surge como evolución de la línea de comandos de los primeros sistemas operativos y es pieza fundamental en un entorno gráfico. GUI es un acrónimo del vocablo inglés Graphical User Interface. Douglas Engelbart, además de inventor del ratón de ordenador, desarrolló la primera interfaz gráfica en los años 1960 en EE.UU. en los laboratorios de XEROX. Fue introducida posteriormente al público en las computadoras Apple Macintosh en 1984, y a las masas hasta 1993 con la primera versión popular del sistema operativo Windows 3.0. Los GUIs que no son PUIs son encontrados en juegos de computadora, y los GUIs avanzados basados en realidad virtual ahora son usados con más frecuencia en las investigaciones. Muchos grupos de investigación en Norteamérica y Europa están trabajando actualmente en el interfaz de enfoque del usuario o ZUI (Zooming User Interface), que es un adelanto lógico en los GUI, mezclando 3D con 2.o o "2D y medio objetos vectoriales de una D". 3.1.1. Reseña histórica. La historia reciente de la informática está indisolublemente unida a las interfaces gráficas, puesto que los sistemas operativos gráficos han ocasionado grandes consecuencias en la industria del software y del hardware. Los principales pasos se detallan a continuación. La empresa que introdujo el ratón y el GUI por primera vez con el Lisa (Apple) consiguió hacerse con una parte importantísima del mercado del ordenador personal. A principios de los años ochenta (en 1981) Apple, que había comenzado como una microempresa formada por dos empleados (Steve Jobs y Steve Wozniak) había crecido hasta convertirse en una empresa de 300 millones de dólares. 16 En el año 1983 Apple ya se había convertido en una empresa de 1000 millones de dólares, el mismo valor que IBM. En 1987 IBM se vio obligada a entrar en el mercado de los ordenadores personales con entorno gráfico con su modelo PS/2, aliándose con Bill Gates (Microsoft), que había desarrollado el OS/2. La interfaz gráfica de este sistema operativo era muy similar a la de Apple. Pero el OS/2 no se convirtió en el nuevo estándar del sector, debido fundamentalmente al conflicto de intereses entre IBM y Microsoft. Microsoft crea el Windows 1.0, sistema operativo gráfico para ordenadores PC IBM compatibles, con un parecido asombroso al Mac OS. La respuesta de Apple a la introducción del sistema operativo Windows fue la interposición de una demanda de varios miles de millones de dólares contra Microsoft, por violación de copyright. La aparición de ordenadores IBM clónicos hizo que el sistema Windows se popularizara, lo que restó mercado a Apple. Ésta se recuperó a finales de 1990 lanzando nuevos productos. Una señal inequívoca del éxito de Apple fue la aparición de productos similares: una pequeña compañía llamada Nutek Computers Inc. anunció que estaba desarrollando un ordenador compatible con el Macintosh. En 1991, John Sculley, director de Apple, reveló que la compañía estaba considerando competir contra Microsoft en el campo del software vendiendo su sistema operativo a terceros. Apple reveló que estaba manteniendo conversaciones con su antiguo rival, IBM, destinadas a compartir tecnologías. Decidieron crear una joint venture para desarrollar un sistema operativo avanzado que ambas utilizarían en sus nuevas máquinas y licenciarían a terceros. Este plan presentaba un desafío directo a Microsoft. Microsoft consigue convertir a Windows en el sistema operativo más utilizado en el mundo. Dejando a Apple en un segundo lugar. Algúnos GUIs son diseñados para cumplir con los rigurosos requisitos de mercados verticales. Éstos se conocen como "GUIs específico de uso." Un ejemplo de un GUI tan específico de uso es el ahora familiar touchscreen (pantalla que al ser tocada efectúa los comandos del ratón del software de venta encontrado en muchos restaurantes alrededor del mundo y en comprobaciones en tiendas del autoservicio. Primero iniciado por Gene 17 Mosher en la computadora del ST de Atari en 1986, el uso que el GUI específico del touchscreen ha encabezado una revolución mundial en el uso de computadoras a través de la industria del alimento y de las bebidas y en venta al por menor general. Otros ejemplos del touchscreen específico GUIs del uso incluyen las máquinas de caja automática más recientes, uno mismo-marcar de la línea aérea, quioscos de la información y las pantallas de monitor /control en los usos industriales encajados que emplean un sistema operativo en tiempo real (RTOS). Los teléfonos móviles y los sistemas o consolas de juego también emplean el touchscreen, además de no entenderse la domótica sin un buen interfaz de usuario o GUI. Se puede resumir en una definiendo básicamente las interfaces de usuario de un programa como un conjunto de elementos hardware y software de una computadora que presentan información al usuario y le permiten interactuar con la información y con la computadora. 3.2.Principios para el diseño de interfaces gráficos. Existen principios relevantes para el diseño e implementación de Interfaces de usuario (IU) ya sean para IU graficas como para la web. Autonomía La computadora, la IU y el entorno de trabajo deben estar a disposición del usuario. Se debe dar al usuario el ambiente flexible para que pueda aprender rápidamente a usar la aplicación. Percepción del Color Aunque se utilicen convenciones de color en la IU, se deberían usar otros mecanismos secundarios para proveer la información a aquellos usuarios con problemas en la visualización de colores. Legibilidad 18 Para que la IU favorezca la usabilidad del sistema de software, la información que se exhiba en ella debe ser fácil de ubicar y leer. Es importante hacer clara la presentación visual (colocación /agrupación de objetos, evitar la presentación de excesiva información. 3.3. Herramientas y lenguajes para el desarrollo de interfaces de usuario. 3.3.1. GLADE Glade es un desarrollador de interfaces Permite construir de forma gráfica e interactiva interfaces de usuario gráficos para Gnome/Gtk, publicado bajo la licencia GNU GPL. Glade también permite definir los nombres de los handler (funciones) que se asociarán a cada uno de los eventos del interfaz. La Librería libGlade Una vez hemos creado visualmente el interfaz deberemos usarlo en nuestros programas, para esto glade nos brinda dos opciones: La primera forma es que el propio Glade genere el código en C que crea el interfaz, código en el que posteriormente uniremos con nuestro rograma, esta opción suele ser poco recomendable porque es un poco engorrosa. La segunda manera de hacerlo es usar Glade para que genere un fichero en el cual se describe con XML el interfaz. Este fichero nos servirá para especificárselo a la librería libglade, la cual, mediante un par de llamadas ejecutara el código necesario para usar el interfaz en nuestro programa. 3.3.2. GTK GTK(GIMP Toolkit) es una biblioteca para crear interfaces graficas de usuario. Su licencia es la LGPL, así que mediante GTK podría desarrollar programas con licencias abiertas, gratuitas, libres y hasta licencias comerciales no libres sin mayores problemas. GTK está construido encima de GDK (GIMP Drawing Kit) que básicamente es un recubrimiento de las funciones de bajo nivel que deben haber para acceder al sistema de ventanas sobre el que se programe. Se llama el UIMP toolkit porque fue escrito para el 19 desarrollo del General Image Manipulation Program (GIMP), pero ahora GTK se utiliza en un gran número de proyectos de programación, incluyendo el proyecto GNU Network Object Model Environment (GNOME). GTK es esencialmente una interfaz para la programación de aplicaciones orientadas a objetos (API). Aunque esta completamente escrito en C, esta implementado haciendo uso de la idea de clases y de funciones respuesta o de callback(punteros o funciones). 3.3.3. TCL/TK TCL(Tool Command Languaje) es un lenguaje de programación interpretado y multiplataforma. Es distribuido de forma totalmente gratuita, aunque su uso sea para aplicaciones comerciales, a través de Internet. Una de sus principales características es su gran facilidad con la que se pueden implementar funciones en C/C++ que pasan a ser nuevas instrucciones del intérprete. La extensión más conocida, y que es distribuida junto con el propio TCL, es TK(Tool Kit). TK añade a los comandos de TCL, comandos capaces de crear interfaces gráficos de usuario. Ventajas de TCL/TK Sencillez de programación Rapidez en el desarrollo de las aplicaciones (Tecnología RAD) Gran velocidad comparado con otros lenguajes interpretados Facilidad de modificación de las aplicaciones Multiplataforma Gran número de extensiones gratuitas Posibilidad de incorporar nuevos comandos en lenguaje C/C++ Inconvenientes de TCL/TK Excesivamente lento comparado con los lenguajes compilados Necesidad del intérprete para ejecutar una aplicación Difícil de depurar 3.3.4. QTK Es una herramienta construida a partir de TCL/TK, que permite a los diseñadores de interfaces de usuarios adoptar un enfoque basado en modelos rentables para el diseño de interfaces de usuario ejecutables. 20 En esta herramienta los widgets pueden ser manejados y controlados dinámicamente y así facilita el desarrollo de las aplicaciones de las interfaces de usuario. El modulo QTK esta basado en el uso de descripciones de usuario. El enfoque de la descripción es particularmente útil en un lenguaje simbólico como OZ, que permite la creación fácil y concisa de estructuras de datos. Ventajas de QTK Unicidad de Lenguaje Reduce los costos de desarrollo Integración ligada de herramientas 3.3.5. WXWINDOWS Es una biblioteca de clases para C++ y python, que permite el desarrollo de aplicaciones con interfaces graficas de usuario de una manera rápida y sencilla. Su principal característica es que es multiplataforma. wxWindows se distribuye bajo licencia wxWindows Library License, que es similar a la GNU Library General Public License pero que además permite usar la biblioteca para desarrollos comerciales(ya sean aplicaciones o modificaciones de la propia biblioteca), siempre y cuando estos desarrollos comerciales no usen ningún código distribuido bajo alguna licencia GNU. 3.3.6. Visual Basic Es un lenguaje de programación desarrollado por Microsoft. Visual Basic es un lenguaje visual que desciende del lenguaje de programación BASIC. Su primera versión fue presentada en 1991 con la intención de simplificar la programación utilizando un ambiente de desarrollo completamente gráfico que facilitara la creación de interfaces gráficas y en cierta medida también la programación misma. Características generales Es un lenguaje simple pensado para programadores inexpertos, guiado por eventos, y centrado en un motor de formularios poderoso que facilita el rápido desarrollo de aplicaciones gráficas. Su sintaxis, derivada del antiguo BASIC, ha sido ampliada con el tiempo al agregarse las características típicas de los lenguajes estructurados modernos. No 21 requiere de manejo de punteros. Posee varias bibliotecas para manejo de bases de datos, destacando ADO. Es utilizado principalmente para aplicaciones de gestión de empresas, debido a la rapidez con la que puede hacerse un programa que utilice una base de datos sencilla, además de la abundancia de programadores en este lenguaje. El compilador de Microsoft genera ejecutables que requieren una DLL para que sus ejecutables funcionen, en algunos casos llamada MSVBVMxy.DLL (acrónimo de "MicroSoft Visual Basic Virtual Machine x.y", siendo x.y la versión) y en otros VBRUNXXX.DLL ("Visual Basic Runtime X.XX"), que provee todas las funciones implementadas en el lenguaje. Además existen un gran número de bibliotecas (DLL) que facilitan el acceso a muchas funciones del sistema operativo y la integración con otras aplicaciones. Derivados • Su derivado VBScript es el lenguaje predeterminado para Active Server Pages (ASP). • Además, una extensión propia del lenguaje llamada Visual Basic for Applications (VBA) permite codificar módulos (a veces llamados macros) para las aplicaciones de Microsoft Office. • Especialmente a partir de la versión 6 del lenguaje, se permite la interacción y generación de objetos remotos que puedan ser invocados desde páginas de scripts (concretamente las ASP, aunque no es imposible hacer un enlace empleando JSP), alojándolos en servidores de web. • Visual Basic .NET, parte de .NET, es un lenguaje prácticamente equivalente en funcionalidades a C# (por ejemplo, no admite pseudo-punteros), añadiendo la capacidad de POO que sus anteriores versiones (como Visual Basic 6) no poseían: Herencia, polimorfismo... Ventajas e inconvenientes Ventajas • Visual Basic es un lenguaje simple y por tanto fácil de aprender. 22 • Su mayor facilidad radica en el dibujado de formularios, mediante el arrastre de controles. • La sintaxis está cercana al lenguaje humano. • Las ramas de Visual Basic X ha muerto. Microsoft ha comenzado con su versión .NET, completamente diferente del Visual Basic original. Visual Basic .NET compila hacia el mismo código final que C#. Visual Basic .NET es mucho más potente y alberga muchas más funcionalidades que ésta versión. • Es un lenguaje RAD, centrado en conseguir en el menor tiempo posible los resultados deseados, por eso mismo su mayor uso está en las pequeñas aplicaciones, como gestión de bares, empresas, restaurantes... • Tiene una ligera implementación de POO • Permite el tratamiento de mensajes de Windows. • Gran parte del trabajo en el diseño de formularios está realizado, gracias a la gran gama de controles incorporados junto al lenguaje que ahorran costes de tiempo de desarrollo. • Permite crear controles personalizados fácilmente del mismo modo que el diseño de formularios. Inconvenientes • Es propietario de Microsoft, por tanto nadie que no sea del equipo de desarrollo de esta compañía decide la evolución del lenguaje. • Sólo existe un compilador & IDE, llamado igual que el lenguaje. • Sólo genera ejecutables para Windows. • La sintaxis es bastante inflexible. • Los ejecutables generados son relativamente lentos. • NO es adecuado para aplicaciones grandes, multimedia, de oficina, videojuegos, editores gráficos... • NO permite características de programación avanzada. • NO permite generar librerías dinámicas (DLL). • Sólo permite el uso de funciones de librerías dinámicas (DLL) stdcall. • Para que los ejecutables que genera funcionen necesita una DLL llamada MSVBVMxy.DLL: MicroSoft Visual Basic Virtual Machine x.y (versión). Provee todas las funciones y características implementadas en el lenguaje. 23 • Algunas funcionalidades están indocumentadas. • La ligera implementación de POO no permite sacar el máximo provecho de este modelo de programación. • NO soporta tratamiento de procesos como parte del lenguaje. • NO tiene manejo de excepciones. • NO incluye operadores a nivel de bits. • NO permite el manejo de memoria dinámica, punteros, arrays, etc. como parte del lenguaje. • NO avisa de ciertos errores o advertencias, como la conversión de tipos inadecuada. • El tratamiento de mensajes de Windows es básico e indirecto. • La gran gama de controles incorporados son, sin embargo, muy generales, lo que lleva a tener que reprogramar nuevos controles para una necesidad concreta de la aplicación. • Los controles personalizados no mejoran la potencia de la API de Windows, y en determinados casos acudir a ésta será el único modo de conseguir el control personalizado deseado. • La forma de programación que plantea Visual Basic ha ocasionado que muchos programadores de Visual Basic practiquen malas costumbres, entre las más comunes: o Arrays empezados en 1 o Variables globales o Variables sin declarar o Variables de tipo indefinido (Variant) o Variables con nombres inexpresivos o Código innecesario o Código ilegible o Código repetido - Falta de funciones y procedimientos o Uso incorrecto de la API de Windows o Uso de goto y etiquetas o Uso de controles como simples contenedores de datos o Dependencia de los controles a la hora de programar 24 3.3.7. JAVA. 3.3.7.1. Características. LENGUAJE FAMILIAR: Java no supuso de inicio una transformación total, partiendo del punto que se ha utilizado C y luego nos hemos movido algo en C++ iniciándonos ya en la programación orientada a objetos. LENGUAJE ORIENTADO A OBJETOS: Para que un lenguaje pueda considerarse orientado a objetos debe soportar como mínimo las características de: -encapsulación -herencia -polimorfismo -enlace dinámico. LENGUAJE ROBUSTO: Uno de los problemas más comunes en los lenguajes de programación es la posibilidad de escribir programas que pueden bloquear el sistema. Algunas veces este bloqueo puede ser inmediato, pero en otras ocasiones llega a aparecer inesperadamente porque, por ejemplo, la aplicación accede a zonas de memoria que no estaban siendo ocupadas por otros programas hasta ese momento. Un ejemplo claro de lenguaje no robusto es C. Al escribir código en C o C++ el programador debe hacerse cargo de la gestión de memoria de una forma explícita, solicitando la asignación de bloques a punteros y liberándolos cuando ya no son necesarios. En Java, los punteros, la aritmética de punteros y las funciones de asignación y liberación de memoria (malloc( ) y free( ) ) no existen. En lugar de los punteros se emplean referencias a objetos, los cuales son identificadores simbólicos. El gestor de memoria de Java lleva una contabilidad de las referencias a los objetos. Cuando ya no existe una referencia a un objeto, éste se convierte en candidato para la recogida de basura (garbage collection). 25 LENGUAJE DE ALTO RENDIMIENTO ( MÚLTIPLES THREADS ): Una de las características del lenguaje es que soporta la concurrencia a través de threads. En ocasiones puede interesarnos dividir una aplicación en varios flujos de control independientes, cada uno de los cuales lleva a cabo sus funciones de manera concurrente. Cuando los distintos flujos de control comparten un mismo espacio lógico de direcciones, se denominan threads. LENGUAJE PORTABLE: El principal objetivo de los diseñadores de Java, y dado el gran crecimiento de las redes en los últimos años, fue el de desarrollar un lenguaje cuyas aplicaciones una vez compiladas pudiesen ser inmediatamente ejecutables en cualquier máquina y sobre cualquier sistema operativo. Por ejemplo, un programa desarrollado en Java en una estación de trabajo Sun que emplea el sistema operativo Solaris, debería poderse llevar a un PC que utilice sistema operativo Windows NT. LENGUAJE LO MÁS SIMPLE POSIBLE: Los diseñadores de Java trataron de mantener las facilidades básicas del lenguaje en un mínimo y proporcionar un gran número de extras con las librerías de clases. LENGUAJE SEGURO: Se pretendía construir un lenguaje de programación que fuese seguro, esto es, que no pudiera acceder a los recursos del sistema de manera incontrolada. Por este motivo se eliminó la posibilidad de manipular la memoria mediante el uso de punteros y la capacidad de transformación de números en direcciones de memoria ( tal y como se hace en C ) evitando así todo acceso ilegal a la memoria. Esto se asegura porque el compilador Java efectúa una verificación sistemática de conversiones. 3.3.7.2. LOS PAQUETES GRÁFICOS DE LAS JFC 3.3.7.2.1. Introducción Las JFC (Java Foundation Classes) son parte de la API de Java compuesto por clases que sirven para crear interfaces gráficas visuales para las aplicaciones y applets de Java. 26 Así como Sun presenta estas JFC, Microsoft ha desarrollado otro paquete propio con el nombre de AFD (Application Foundation Classes). Las JFC contienen dos paquetes gráficos: AWT y Swing. • AWT presenta componentes pesados, que en cada plataforma sólo pueden tener una representación determinada. Está disponible desde la versión 1.1 del JDK como java.awt. • Swing presenta componentes ligeros, que pueden tomar diferente aspecto y comportamiento pues lo toman de una biblioteca de clases. Está disponible desde la versión 1.2 del JDK como javax.swing aunque antes se podían encontrar versiones previas como com.sun.java. o como java.awt.swing. B. Modelo de eventos Tanto AWT como Swing tienen en común un sistema para gestionar los eventos que se producen al interactuar con el usuario de la interfaz gráfica; su modelo de eventos. El funcionamiento del modelo de eventos se basa en la gestión de excepciones. Para cada objeto que represente una interfaz gráfica, se pueden definir objetos "oyentes" (Listener), que esperen a que suceda un determinado evento sobre la interfaz. Por ejemplo se puede crear un objeto oyente que esté a la espera de que el usuario pulse sobre un botón de la interfaz, y si esto sucede, él es avisado, ejecutando determinada acción. La clase base para todos estos eventos que se pueden lanzar es la clase AWTEvent (perteneciente al paquete java.awt). El modelo de eventos de AWT depende del paquete java.awt.event, que en Swing se amplía con el paquete javax.swing.event. Existen dos tipos básicos de eventos: • Físicos: Corresponden a un evento hardware claramente identificable. Ej: se ha pulsado una tecla (KeyStrokeEvent). • Semánticos: Se componen de un conjunto de eventos físicos, que sucedidos en un determinado orden tienen un significado más abstracto: El usuario ha elegido un elemento de una lista desplegable (ItemEvent). 27 C. Subpaquetes de AWT A continuación se enumeran los paquetes que componen las JFC, así como su funcionalidad, ordenados por orden de antigüedad. Esto es importante, porque debe de tenerse en cuenta si se va a utilizar para crear applets, ya que normalmente los navegadores no soportan la última versión de la API de Java en su propia máquina virtual. Si queremos que nuestra applet se vea igual en varios navegadores, deberemos de tener en cuenta qué paquetes podemos utilizar y cuáles no, comprobando la versión de Java que soportan los navegadores que nos interesen. a.) Desde la versión 1.0 • java.awt: Contiene todas las clases básicas de AWT para crear interfaces e imprimir gráficos e imágenes, así como la clase base para los eventos en componentes: AWTEvent. • java.awt.image: Para crear y modificar imágenes. Utiliza productores de imágenes, filtros y "consumidores de imágenes". Permite renderizar una imagen mientras está siendo generada. b.) Desde la versión 1.1 • java.awt.datatransfer: Transferencia de datos entre aplicaciones. Permite definir clases "transferibles" entre aplicaciones, y da soporte al mecanismo del portapapeles (copiar y pegar). • java.awt.event: Modelo de eventos de AWT. Contiene eventos, oyentes y adaptadores a oyentes. c.) Desde la versión 1.2 • java.awt.color: Utilización de colores. Contiene la implementación de una paleta de colores basada en la especificada por el ICC (Consorcio Internacional de Color). • java.awt.dnd: Operaciones de arrastrar y soltar. • java.awt.font: Todo lo referente a las fuentes de texto. Soporta fuentes del tipo True Type, Type 1, Type 1 Multiple Master, y OpenType. • java.awt.geom: Aporta clases de Java 2D, para crear objetos en 2 dimensiones, utilizando geometría plana (elipses, curvas, áreas...). 28 • java.awt.im: Para utilizar símbolos Japoneses, Chinos o Coreanos. • java.awt.image.renderable: Para producir imágenes que sean independientes de redering (animación). • java.awt.print: Para imprimir documentos. Incorpora capacidad para gestionar diversos tipos de documentos, formatos de página e interactuar con el usuario para controlar la impresión de trabajos. D. Subpaquetes de Swing A continuación se enumeran los paquetes que componen Swing, así como su funcionalidad: • javax.swing: Tiene los componentes básicos para crear componentes ligeros Swing. • javax.swing.border: Para dibujar bordes personalizados en los componentes Swing. • javax.swing.colorchooser: Para utilizar el componente JColorChooser. • javax.swing.event: Eventos lanzados por componentes Swing, así como oyentes para dichos eventos. Extiende los que se encuentran en el paquete AWT java.awt.event. • javax.swing.filechooser: Para utilizar el componente JFileChooser. • javax.swing.plaf: Permite a Swing utilizar múltiples representaciones. Se utiliza por aquellos desarrolladores que no pueden crear un nuevo aspecto de interfaz, basado en los que Swing ya incorpora (como Basic o Metal). • javax.swing.plaf.basic: Objetos que utilizan interfaces de aspecto "Basic". Este aspecto es el que presentan por defecto los componentes Swing. En este paquete se encuentran gestores de impresión, eventos, oyentes y adaptadores. Se puede crear un aspecto personalizado de interfaz utilizando este paquete. • javax.swing.plaf.metal: Objetos que utilizan interfaces de aspecto "Metal". • javax.swing.plaf.multi: Permite a los usuarios combinar aspectos de interfaz, entre auxiliares y los que existen por defecto. • javax.swing.text: Para manejar componentes de texto (modificables o no). Soporta sintaxis resaltada, edición, estilos... • javax.swing.text.html: Contiene la clase HTMLEditorKit, basada en la versión 3.2 de la especificación HTML, y clases para crear editores de texto HTML • javax.swing.text.html.parser: Contiene analizadores de texto HTML. 29 • javax.swing.text.rtf: Contiene la clase RTFEditorKit para crear editores de documentos en formato RTF (Rich-Text-Format). • javax.swing.tree: Para personalizar la forma en que son utilizados los árboles generados por la clase java.awt.swing.JTree. • javax.swing.undo: Permite realizar operaciones de deshacer/rehacer en las aplicaciones que cree el usuario. 3.3.7.2.2. AWT (Abstract Windowing Toolkit) A. Introducción AWT es un conjunto de herramientas GUI (Interfaz Gráfica con el Usuario) diseñadas para trabajar con múltiples plataformas. Este paquete viene incluido en la API de Java como java.awt ya desde su primera versión, con lo que las interfaces generadas con esta biblioteca funcionan en todos los entornos Java disponibles (incluyendo navegadores, lo que les hace especialmente eficientes para la creación de applets Java). En el apartado "VI.3. Ejemplo de creación de una applet" se muestra un breve ejemplo de cómo utilizar las clases del AWT para crear una applet y una aplicación de Java. La siguiente figura muestra la jerarquía de clases para las principales clases de AWT: 30 Imagen 7: Jerarquía de las clases de AWT En este apartado vamos a estudiar algunas de las clases más importantes del AWT, así como su funcionalidad. B. Component Esta clase representa a cualquier objeto que puede ser parte de una interfaz gráfica de usuario. Es la clase padre de muchas de las clases del AWT. Su propósito principal es representar algo que tiene una posición y un tamaño, que puede ser dibujado en la pantalla y que pueda recibir eventos de entrada (que responda a las interacciones con el usuario). La clase Component presenta diversos métodos, organizados para cubrir varios propósitos. A continuación se explican algunos de ellos. a.) Tamaño y posición del componente • Dimension getSize(); Devuelve la anchura y altura del componente como un objeto de la clase Dimension, que tiene como campos: width (anchura) y heigth (altura). • void setSize(int ancho, int largo); Establece la anchura y altura del componente. • Dimension getPreferredSize(); Devuelve el tamaño que este componente debería tener. • void setPreferredSize(); Establece el tamaño que este componente debería tener. • Dimension getMinimumSize(); Devuelve el tamaño mínimo que este componente debería tener. • void setMinimumSize (int ancho, int largo); Establece el tamaño mínimo que este componente debería tener. • Rectangle getBounds(); Devuelve las coordenadas de este componente como un objeto de la clase Rectangle, que tiene como campos: x, y, width y heigth. • void setBounds(int x, int y, int ancho, int largo); Establece las coordenadas de este componente. 31 b.) Acciones sobre el componente • boolean getEnabled(); Comprueba si el componente está o no activo. • void setEnabled(boolean); Establece el componente a activo o inactivo. • boolean getVisible(); Comprueba si el componente está o no visible. • void setVisible(boolean); Establece si el componente está visible o invisible. • void paint(Graphics g); Indica al AWT que ha de dibujar el componente g. • void repaint(); Indica al AWT que ha de volver a dibujar el componente. • void update(Graphics g); Es llamado por AWT cuando se invoca el método repaint(). Por defecto llama a paint(). c.) Eventos de interacción con el usuario A su vez hay tres tipos de métodos, para la gestión de eventos mediante el nuevo modelo de eventos de AWT (desde la versión 1.1). Hay tres tipos de métodos: • void add Tipo_Listener(_Tipo_Listener l); Añade un oyente a la espera de algún tipo de eventos sobre este componente. • void remove_Tipo_Listener(_Tipo_Listener l); Elimina algún oyente que estaba a la espera de algún tipo de eventos sobre este componente. • void process_Tipo_Event(_Tipo_Event e); Procesa eventos del tipo _Tipo_Event enviándolos a cualquier objeto _Tipo_Listener que estuviera escuchando. En estos métodos _Tipo_ puede ser cualquiera de los siguientes: Component, Focus, InputMethod, Key, Mouse, MouseMotion. C. Container La clase Container sabe cómo mostrar componentes embebidos (que a su vez pueden ser instancias de la clase Container). Algunos de los métodos de la clase Container son: • Component add(Component c); Añade un componente al contenedor. • void print(Graphics g); Imprime el contenedor. 32 • void printComponents(Graphics g); Imprime cada uno de los componentes de este contenedor. • LayoutManager getLayout(); Devuelve el gestor de impresión (LayoutManager) asociado a este contenedor, que es el responsable de colocar los componentes dentro del contenedor. • void setLayout(LayoutManager 1); Establece un gestor de impresión para este componente. Estos objetos Container tienen un LayoutManager asociado que define la manera en que van a posicionarse los objetos componentes en su interior. D. Gestores de impresión LayoutManager y LayoutManager2 son dos interfaces encargadas de la representación y posicionamiento en pantalla de componentes AWT. De estas interfaces se proporcionan cinco implementaciones en AWT. Cada una de ellas reparte los objetos de una forma particular: • BorderLayout: En cinco lugares: Norte, Sur, Este, Oeste y Centro (North, South, East, West y Center). • CardLayout: Permite gestionar varios componentes de los que sólo uno se visualiza a la vez, permaneciendo los demás invisibles debajo. • FlowLayout: De izquierda a derecha horizontalmente en cada línea. Cuando sobrepasan una línea se comienza a la izquierda de la siguiente. • GridLayout: En una tabla en la que todas las casillas tienen el mismo tamaño. • GridBagLayout: En una tabla, pero las casillas no tienen que tener el mismo tamaño. E. Otras clases Por supuesto AWT no se limita a estas clases. Dentro de esta biblioteca podemos encontrar multitud de clases prefabricadas para facilitar el diseño gráfico. A continuación explicamos algunas de ellas. a.) Clases contenedoras (hijas de Container) 33 • Panel: Permite hacer una presentación más avanzada que Container mediante la combinación con subpaneles o subclases para crear contenedores personalizados. La clase Applet que sirve para crear applets Java, hereda de esta clase Panel. • ScrollPane: Una barra de desplazamiento, horizontal o vertical. • Window: Una ventana sin borde. • Frame: Una ventana que no tiene borde. Puede tener asociado un objeto Menubar (una barra de herramientas o barra de menú personalizada). • Dialog: Una ventana usada para crear diálogos. Tiene la capacidad de ser modal con lo que sólo este contenedor recibiría entradas del usuario. • Filedialog: Un diálogo que usa el selector de archivos nativo del sistema operativo. b.) Clases componentes (hijas directas de Component) • Button: Un botón gráfico para el que se puede definir una acción que sucederá cuando se presione el botón. • Canvas: Permite pintar o capturar eventos del usuario. Se puede usar para crear gráficos o como clase base para crear una jerarquía de componentes personalizados. • Checkbox: Soporta dos estados: on y off. Se pueden asociar acciones que se ejecuten (triggers) cuando el estado cambie. • Choice: Menú desplegable de opciones. • Label: Cadena de etiqueta en una localización dada. • List: Una lista desplegable de cadenas. • Scrollbar: Desplegable de objetos Canvas. • TextComponent: Cualquier componente que permita editar cadenas de texto.Tiene dos clases hijas: • TextField: Componente de texto consistente en una línea que puede ser usada para construir formularios. • TextArea: Componente para edición de texto de tamaño variable. F. Eventos de AWT AWT tiene sus propios eventos, que se explican a continuación. a.) Eventos físicos 34 Son todos hijos del evento ComponentEvent, que indica algún cambio en un objeto Component: • InputEvent: Se ha producido una entrada del usuario. Tiene como eventos hijos KeyEvent (pulsación de una tecla) y MouseEvent (acción sobre el ratón). • FocusEvent: Avisa al programa de que el componente ha ganado o perdido la atención (enfoque) del usuario. Esto se deduce de la actividad del usuario (ratón y teclado). • WindowEvent: Avisa al programa de que el usuario ha utilizado uno de los controles de ventana a nivel del sistema operativo, como los controles de minimizar o cerrar. • ContainerEvent: Se envía cuando se añaden o eliminan componentes a un contenedor. • PaintEvent: Evento especial que señala que el sistema operativo quiere dibujar de nuevo una parte de la interfaz. Un componente debe sobreescribir el método paint() o el método update() para gestionar este evento. b.) Eventos semánticos Son todos hijos del evento AWTEvent, que es el evento base de la jerarquía de eventos: • ActionEvent: Avisa al programa de acciones específicas de componentes como las pulsaciones de botones. • AdjustmenteEvent: Comunica que una barra de desplazamiento ha sido ajustada. • ItemEvent: Avisa al programa cuando el usuario interacciona con una elección, una lista o una casilla de verificación. • TextEvent: Avisa cuando un usuario cambia texto en un componente TextComponent, TextArea o TextField. • InputMethodEvent: Avisa que un texto que está siendo creado utilizando un método de entrada está cambiando (se ha escrito algo más...). • InvocationEvent: Este evento ejecuta el método run() en una clase Runnable cuando es tratado por el thread del despachador (dispatcher) de AWT. 3.3.7.2.3. SWING A. Introducción 35 El paquete Swing es el nuevo paquete gráfico que ha aparecido en la versión 1.2 de Java. Está compuesto por un amplio conjunto de componentes de interfaces de usuario que funcionen en el mayor número posible de plataformas. Cada uno de los componentes de este paquete puede presentar diversos aspectos y comportamientos en función de una biblioteca de clases. En la versión 1.0 de Swing, que corresponde a la distribuida en la versión 1.2 de la API de Java se incluyen tres bibliotecas de aspecto y comportamiento para Swing: • metal.jar: Aspecto y comportamiento independiente de la plataforma. • motif.jar: Basado en la interfaz Sun Motif. • windows.jar: Muy similar a las interfaces Microsoft Windows 95. La siguiente imagen muestra una aplicación de ejemplo (adjunta al JDK 1.2) que muestra las diferentes interfaces para una misma aplicación según se utilice una u otra biblioteca: Imagen 8: Diferentes aspectos de una interfaz Swing Es la nueva clase denominada UiManager la que se encarga del aspecto y comportamiento de una aplicación Swing en un entorno de ejecución. En el apartado "VI.3. Ejemplo de creación de una applet" se muestra un breve ejemplo de cómo utilizar las clases de Swing para crear una aplicación utilizando Swing. B. Nuevas características La arquitectura Swing presenta una serie de ventajas respecto a su antecedente AWT: 36 • Amplia variedad de componentes: En general las clases que comiencen por "J" son componentes que se pueden añadir a la aplicación. Por ejemplo: JButton. • Aspecto modificable (look and feel): Se puede personalizar el aspecto de las interfaces o utilizar varios aspectos que existen por defecto (Metal Max, Basic Motif, Window Win32). • Arquitectura Modelo-Vista-Controlador: Esta arquitectura da lugar a todo un enfoque de desarrollo muy arraigado en los entornos gráficos de usuario realizados con técnicas orientadas a objetos. Cada componente tiene asociado una clase de modelo de datos y una interfaz que utiliza. Se puede crear un modelo de datos personalizado para cada componente, con sólo heredar de la clase Model. • Gestión mejorada de la entrada del usuario: Se pueden gestionar combinaciones de teclas en un objeto KeyStroke y registrarlo como componente. El evento se activará cuando se pulse dicha combinación si está siendo utilizado el componente, la ventana en que se encuentra o algún hijo del componente. • Objetos de acción (action objects): Estos objetos cuando están activados (enabled) controlan las acciones de varios objetos componentes de la interfaz. Son hijos de ActionListener. • Contenedores anidados: Cualquier componente puede estar anidado en otro. Por ejemplo, un gráfico se puede anidar en una lista. • Escritorios virtuales: Se pueden crear escritorios virtuales o "interfaz de múltiples documentos" mediante las clases JDesktopPane y JInternalFrame. • Bordes complejos: Los componentes pueden presentar nuevos tipos de bordes. Además el usuario puede crear tipos de bordes personalizados. • Diálogos personalizados: Se pueden crear multitud de formas de mensajes y opciones de diálogo con el usuario, mediante la clase JOptionPane. • Clases para diálogos habituales: Se puede utilizar JFileChooser para elegir un fichero, y JColorChooser para elegir un color. • Componentes para tablas y árboles de datos: Mediante las clases JTable y JTree. • Potentes manipuladores de texto: Además de campos y áreas de texto, se presentan campos de sintaxis oculta JPassword, y texto con múltiples fuentes JTextPane. Además hay paquetes para utilizar ficheros en formato HTML o RTF. • Capacidad para "deshacer": En gran variedad de situaciones se pueden deshacer las modificaciones que se realizaron. 37 • Soporte a la accesibilidad: Se facilita la generación de interfaces que ayuden a la accesibilidad de discapacitados, por ejemplo en Braille. C. Principales clases Las clases de Swing se parecen mucho a las de AWT. Todas las clases explicadas en el apartado "IV.2 AWT" de este tutorial tienen una nueva versión en Swing con el prefijo J. Así la clase Panel de AWT tiene una clase JPanel en Swing. Esto se cumple para todas las clases menos para Choice, Canvas, FileDialgog y ScrollPane. De hecho todas las clases componentes de Swing (clases hijas de JComponent), son hijas de la clase Component de AWT. • ButtonGroup: Muestra una lista de elementos (JRadioButton) con solo uno seleccionable. Cada elemento tiene un círculo, que en caso del elemento seleccionado contendrá un "punto". • JToggleButton: Es como un botón normal, pero al ser pinchado por el usuario queda activado. • JProgressBar: Representa una barra de estado de progreso, mediante la que habitualmente se muestra el desarrollo de un proceso en desarrollo (ejemplo: la instalación de una aplicación). • JTabbedPane: Es una ventana con solapas (la que utiliza Windows). Este componente había sido muy solicitado. • JApplet: Aunque ya existía una clase Applet en AWT, esta nueva versión es necesaria para crear applets Java que utilicen interfaces Swing. Por supuesto Swing no se limita a estas clases, sino que posee muchas más con diversas funcionalidades. Para estudiarlas consulte la documentación del JDK 1.2 de Java. D. Nuevos gestores de impresión Swing incorpora nuevos gestores de impresión, ampliando los cinco que AWT incorporaba. Entre ellos conviene destacar los siguientes: 38 • BoxLayout: Es similar al FlowLayout de AWT, con la diferencia de que con él se pueden especificar los ejes (x o y). Viene incorporada en el componente Box, pero está disponible como una opción en otros componentes. • OverlayLayout: Todos los componentes se añaden encima de cada componente previo. • SpringLayout: El espacio se asigna en función de una serie de restricciones asociadas con cada componente. • ScrollPaneLayout: Incorporado en el componente ScrollPane. • ViewportLayout: Incorporado en el componente Viewport. E. JrootPane La clase JRootPane permite colocar contenido de las applets creadas con la clase JApplet en un determinado plano de impresión (capa). Por orden de cercanía al usuario, estas capas son: • glassPane: Una capa que abarca toda la parte visible (por defecto no es visible). • layeredPane: Una subclase de JComponent diseñada para contener cuadros de diálogo, menús emergentes y otros componentes que deben aparecer flotando entre el usuario y el contenido. • menubar: Una capa opcional, que si aparece estará anclada en la parte superior. • contenPane: La capa en que se dibujará la mayor parte del contenido. Así pues cada vez que se vayan a añadir componentes a una applet de clase JApplet, debe añadirse a uno de estas capas. Por ejemplo: laJApplet.getContentPane().add( unComponente ); F. Nuevos eventos de Swing Swing incorpora su nuevo conjunto de eventos para sus componentes. a.) Eventos físicos Sólo aparecen dos nuevos eventos físicos, descendientes de InputEvent: 39 • MenuKeyEvent: Un menú de árbol ha recibido un evento de KeyEvent (acción sobre el ratón). • MenuDragMouseEvent: Un menú de árbol ha recibido un evento de MouseEvent (pulsación de una tecla). b.) Eventos semánticos Son todos hijos del evento de AWT AWTEvent, que es el evento base de la jerarquía de eventos: • AncestorEvent: Antecesor añadido desplazado o eliminado. • CaretEvent: El signo de intercalación del texto ha cambiado. • ChangeEvent: Un componente ha sufrido un cambio de estado. • DocumentEvent: Un documento ha sufrido un cambio de estado. • HyperlinkEvent: Algo relacionado con un vínculo hipermedia ha cambiado. • InternalFrameEvent: Un AWTEvent que añade soporte para objetos JInternalFrame. • ListDataEvent: El contenido de una lista ha cambiado o se ha añadido o eliminado un intervalo. • ListSelectionEvent: La selección de una lista ha cambiado. • MenuEvent: Un elemento de menú ha sido seleccionado o mostrado o bien no seleccionado o cancelado. • PopupMenuEvent: Algo ha cambiado en JPopupMenu. • TableColumnModelEvent: El modelo para una columna de tabla ha cambiando. • TableModelEvent: El modelo de una tabla ha cambiado. • TreeExpansionEvent: El nodo de un árbol se ha extendido o se ha colapsado. • TreeModelEvent: El modelo de un árbol ha cambiado. • TreeSelectionEvent: La selección de un árbol ha cambiado de estado. • UndoableEditEvent: Ha ocurrido una operación que no se puede realizar. G. El patrón de diseño Modelo-Vista-Controlador Muchos de los componentes Swing están basados en un patrón de diseño denominado "Modelo-Vista-Controlador". El concepto de este patrón de diseño se basa en tres elementos: 40 • Modelo: Almacena el estado interno en un conjunto de clases. • Vista: Muestra la información del modelo • Controlador: Cambia la información del modelo (delegado). 3.3.8. La elección para el programa. La elección de JAVA para la realización del programa obedece a varios puntos que ya hemos mencionado al hablar de sus características más importantes. En primer lugar la familiaridad del lenguaje. Durante la carrera en la intensificación de Telemática se estudia Java y se trabaja de forma directa en el lenguaje o indirecta para otras prácticas mas orientadas a comunicación en red. Personalmente he trabajado en una beca de prácticas en la que he podido practicar con el lenguaje o más concretamente en una serie de paquetes orientados a dispositivos móviles. El otro punto importante para mi elección es su independencia de la plataforma. La máquina virtual que podemos instalar en cualquier máquina nos permite trabajar sin importar en que SO nos encontremos. En cuanto a la elección de un paquete u otro dentro de los componentes gráficos, he seguido una práctica bastante habitual a la hora de la realización de interfaces gráficos en Java. Por una parte he empleado AWT para que se encargue de toda la gestión de eventos y por otra SWING para añadir algunos componentes más sofisticados. 41