lunes, 28 de mayo de 2012

La interfaz Gráfica


La historia: AWT

         Fue definido como un conjunto de paquetes inicialmente, para la construcción de interfaces graficas. Esta basado en contenedores gráficos mas componentes gráficos, mas modelo de eventos. Los componentes de AWT están implementados en código nativo, es decir que están restringidos a las características de la plataforma.
         Por ejemplo si la plataforma no permite imágenes en los botones, entonces no será posible construir un botón con una imagen en lugar del texto. La mayoría de los componentes de AWT son subclases de Component, excepto los contenedores de mayor nivel como Frame, Dialog y Applet.

Estructura de una aplicación AWT

         Los componentes de AWT están dentro del paquete java.awt. Todo componente se utiliza dentro de un java.awt.Frame. La pantalla a construir será una subclase de java.awt.Frame. La pantalla estará compuesta por:
         Los atributos, que son componentes gráficos. Los métodos, que manejan los eventos que ocurren sobre los componentes gráficos. El método initComponent(), método llamado por el constructor donde se inicializan todos los componentes gráficos.

La actualidad: Swing

         Swing, nombre del proyecto dedicado a la construcción de componentes gráficos. Si bien ha
 quedado inmortalizado como Swing, su denominación es JFC (Java Fundation Classes) ya que incluye otros paquetes adicionales. Las JFC incluyen un grupo de características para la creación de interfaces graficas. Los componentes Swing GUI es una de las características de las JFC.
         Esta basado en contenedores gráficos mas componentes gráficos mas un modelo de eventos. Es el conjunto de paquetes utilizados para la construcción de interfaces graficas. Los componentes Swing están implementados sin código nativo, es decir que están no restringidos a las características de la plataforma.
         Por ejemplo, si la plataforma no permite imágenes en los botones, con Swing es posible agregarlos. La mayoría de los componentes de Swing son subclases de JComponent, excepto los contenedores de mayor nivel como JFrame, JDialog y JApplet. Swing utiliza algunas clases de AWT.

Estructura de una aplicación Swing

         Los componentes de Swing están dentro de paquetes como javax.swing. Todo componente grafico se utiliza dentro de un javax.swing.JFrame. La pantalla a construir será una subclase de javax.swing.JFrame.
         A diferencia de los componentes de AWT, los componentes Swing comienzan  con la letra J. Por ejemplo, un marco en AWT se llama Frame y en Swing se llama JFrame, o un botón en AWT es Button, y en Swing es JButton. La pantalla estará compuesta por:
         Los atributos, son componentes gráficos. Los métodos, se manejan como los eventos que ocurren sobre un componente grafico. El método initComponents, método que es llamado por el constructor, donde se inicializan todos los componentes gráficos.

Swing vs. AWT

         Ambos representan distintas maneras de armar una interfaz grafica. AWT es el primer framework de Java para construcción grafica y luego nace Swing. Los componentes AWT están implementados con código nativo mientras que los componentes Swing no.
         Por esta razón los componentes Swing pueden tener más funcionalidad ya que no están restringidos a las características comunes de cada plataforma. Como regla, en Swing los componentes deben ser añadidos a objetos JPanel y no directamente a JFrame.

Swing como negocio

         Existen empresas dedicadas a construir componentes Swing, que se venden por separado a la JDK. En Swing los componentes gráficos pueden poseer mas funcionalidad ya que no son dependientes de la plataforma, como por ejemplo, los componentes Swing no tienen por que ser necesariamente rectangulares, se pueden armar botones redondos. Los botones pueden mostrar tanto texto como imágenes. Su visualización es la misma en todas las plataformas.

Componentes Swing: Contenedores

         Son contenedores gráficos que tienen la función de organizar a los distintos componentes gráficos. Estos contenedores proporcionan la infraestructura que necesitan los componentes Swing para el manejo de eventos y su dibujo.
         Existen contenedores a nivel general, como JFrame, JDialog y JApplet. Los contenedores a nivel general tienen un papel de contenedores, que contendrán a todos los componentes gráficos, a excepción del componente JMenuBar. Estos en general no son visibles.
         Existen contenedores de nivel intermedio, como JPanel, JTabbedPanel y JScrollPane. Estos son de carácter mas visible, y son utilizados, o contenidos por los contenedores de nivel general.

--JFrame
Es la clase utilizada para la construcción de una ventana. Representa a una ventana primaria. Es la ventana de mayor nivel dentro de una aplicación. Sirve como contenedor de los componentes.

--JDialog
         Es la clase utilizada para la construcción de una ventana secundaria. Es una ventana dependiente de una ventana primaria. Permite dialogar con el usuario.

--JApplet
         El JApplet es la clase utilizada para la construcción de Applets que corren en navegadores. Representa el área de una aplicación dentro de una ventana de un navegador.

--JPanel
         JPanel es un contenedor de nivel intermedio. JPanel tiene como propósito simplificar el posicionamiento de componentes.

--Palette Window
         Contiene los ocmponentes gráficos para agregar a los formularios. Puede visualizar los componentes como iconos, o como iconos con nombre. Posee tanto los componentes AWT como los de SWING.

--Inspector Window

         Visualiza la jerquia de componentes del formulario seleccionado. Los componentes visibles por el usuario son visualizados dentro del formulario. Los componentes no visibles por el usuario son visualizados dentro del ítem, other components.

--Properties Window
         Visualiza las opciones a setear del componente seleccionado. Visualiza las propiedades del componente seleccionado

MDI, Documento de Multiples Interfaces

El hecho de necesitar agrupar funcionalidades distintas en una única aplicación genera la necesidad de ejecutar una única aplicación y tener acceso a resolver varias funcionalidades.
Un ejemplo de esto es la aplicación de una clínica donde se necesita resolver en una misma aplicación el concepto de turnos para los pacientes, agendas de los médicos y datos personales e historias clínicas de los pacientes.
Todo esto puede ser agrupado en un mismo sistema, en una misma aplicación al poder ejecutar varias interfaces o varias ventanas dentro de una ventana principal. El modo de acceder a estas multiples ventana de a una puede lograrse a través de un menú de selección de la funcionalidad que se requiere utilizar.
En nuestro ejemplo conceptual podemos tener un Menu Pacientes, y un submenú Datos Personales, de modo tal de resolver los temas de los datos personales del paciente, luego un submenú Historia Clinica, donde aparecen la lista de consultas y se puede seleccionar que se resolvió como diagnostico en cada consulta, luego un submenú de Turnos del paciente, donde se consoliden los datos de asiganacion de pacientes a médicos desde la perspectiva de un paciente.
Como otro menú podemos tener el Menu Medico, el cual puede tener un submenú Datos Personales del Medico, por ejemplo datos  de contactos y horarios en los que se lo puede encontrar, luego un submenú Agenda Semanal, donde se puede acceder a la información de agenda diaria del medico, que pacientes ya tiene asignados en que horarios y en que momento queda libre para una nueva asignación.
Logicamente se espera que todas estas ventana internas, ventanas que se disparan a partir de los submenúes vivan dentro de la aplicación de la ventana principal, de modo de poder abrir varias ventanas internas y poder pasar de una a otra sin cerrarlas.

Pasos para construir una aplicación MDI

1.       Generamos un JFrame nuevo, clic derecho en nuestro paquete -> New -> JFrame Form, y le asignamos el nombre VentanaPrincipal
2.       Dentro de VentanaPrincipal agregamos un JMenuBar, que encontramos como elemento de la solapa derecha, llamada SWING Menús
3.       Dentro de VentanaPrincipal agregamos un JDesktopPane, que encontramos como elemento en la solapa derecha, llamada SWING Containers
4.       Creamos una clase PacientesDatosPersonalesVentana del tipo JInternalFrame, clic derecho en nuestro paquete -> New -> JInternalFrame, si no se encuentra hacer clic en Other y buscar dentro de la carpetita que dice Java.
5.       Creamos la opción de menú PacientesMenu, desde la solapa izquierda de Navigator, clic derecho sobre JMenuBar, opción Add Menu
6.       Creamos la opción de submenú PacientesDatosPersonalesSubMenu, desde la solapa izquierda de Navigator, clic derecho sobre el nuevo JMenu antes creado, y Add JMenuItem
7.       Damos lugar a la instanciación de la Ventana Interna  PacientesDatosPersonalesSubMenu, desde clic derecho sobre el JMenuItem recién creado, opción Events, opción actionPerformed.
8.       Dentro del método agregamos lo siguiente:

PacientesDatosPersonalesVentana pdpv = new PacientesDatosPersonalesVentana();
        jDesktopPane1.add(pdpv);
pdpv.setVisible(true);
               
                Al correr el programa se tendrá el menú y submenú y al momento de seleccionar el submenú se disparara la ventana interna. De esta forma se puede continuar sumando opciones del menú e ítems de submenú en cada menú.
                Y las ventanas internas se programan independientes unas de las otras como si fuesen aplicaciones por separado, pero luego funcionaran todas juntas compartiendo recursos como acceso a la base de datos y otros recursos.


1 comentario: