jueves, 28 de julio de 2016

036.- POO - Programación SDI y Programación MDI - Continuación - Java y NetBeans

Ventanas Internas:

Tal como se explicó en la entrada anterior de este blog, una aplicación MDI contiene un panel del tipo JDesktopPane, dentro del cual se depositan objetos del tipo JInternalFrame. Los objetos JInternalFrame son ventanas internas.

El programador debe añadir a su proyecto una clase heredada de JInternalFrame. Esta clase será la ventana interna. El programador diseña el aspecto de esta ventana y añade los métodos que considere necesarios para el manejo de dichas ventanas internas.

En la entrada anterior se creó un pequeño proyecto “Visor de Fotos” donde hicimos todo esto. Este programa es capaz de abrir varias fotos en sus correspondientes ventanas internas.

En este post veremos como podemos actuar sobre las distintas ventanas internas que han sido abiertas en el JDesktopPane, y para ello usaremos de nuevo el proyecto “Visor de Fotos”.



EJERCICIO GUIADO N° 1

En este ejercicio guiado inicial, programaremos la opción Cerrar del proyecto VisorDeFotos. Esta opción debe ser capaz de cerrar la ventana interna que esté activa en ese momento.

Se sabe cual es la ventana interna activa porque aparece por encima de las demás, y porque tiene su barra de título de color nitido, mientras que las demás aparecen en gris. La forma de seleccionar una ventana interna es simplemente hacer clic sobre ella.




  1. Abre el proyecto VisorDeFotos que realizó en la entrada anterior.

  1. Accede a la ventana principal del proyecto, haciendo doble clic sobre la clase VentanaPrincipal.

  1. Accede al evento actionPerformed de la opción de menú Cerrar y programa lo siguiente:



  1. Ejecuta el programa y comprueba el funcionamiento de la opción Cerrar. Se recomienda que abra varias imágenes en su programa y luego seleccione una de ellas. Active la opción Cerrar y observe como la ventana interna se cierra.

  1. El funcionamiento del código que acaba de programar es el siguiente:

El panel interno panelInterno es un objeto del tipo JDesktopPane. Estos paneles son paneles especiales preparados para contener ventanas internas (JInternalFrame) y poseen algunos métodos muy útiles para manipular las ventanas internas que contienen.

Uno de los métodos que más usaremos será getSelectedFrame. Este método devuelve la ventana interna seleccionada ahora mismo, o null si no hay ninguna seleccionada.

En el código anterior, observarás que creamos un objeto vActiva del tipo VentanaInterna, y le asignamos la ventana interna seleccionada en este momento, ejecutando el método getSelectedFrame:

VentanaInterna vActiva = (VentanaInterna) panelInterno.getSelectedFrame();


Ahora ya podemos trabajar con vActiva sabiendo que se refiere a la ventana activa. Lo que se hace a continuación es cerrar la ventana activa vActiva usando el método dispose típico de los objetos de ventana.

Esto se hace, claro está suponiendo que haya alguna ventana activa, por eso se comprueba que getSelectedFrame no haya devuelto null, porque en ese caso es que no hay ventana interna activada y por tanto no se puede cerrar.


  1. Este código es muy común a la hora de trabajar en aplicaciones MDI. Primero se comprueba cual es la ventana activa y luego se actúa sobre ella. Veamos ahora otro ejemplo. Añade al menú la opción Información de Ventana Activa:

       
                                      

  1. Accede al evento actionPerformed de esta nueva opción y programa lo siguiente:

text alt



  1. Este código muestra la ruta del fichero de la imagen que está seleccionada en este momento. Observa que el proceso es el mismo.

Primero se extrae la ventana activa, usando el método getSelectedFrame, almacenándola en una variable llamada vActiva.

VentanaInterna vActiva = (VentanaInterna) panelInterno.getSelectedFrame();


Si esta variable es null, entonces es que no hay ninguna ventana activa.

Si es distinta de null, se trabaja con ella. En el ejemplo anterior extraemos el texto de la barra de título de la ventana y lo mostramos en un JOptionPane. (Recuerda que hemos programado la apertura de las ventanas internas de forma que en la barra de título aparezca la ruta de la imagen).


  1. Ejecuta el programa y comprueba el funcionamiento de la opción del menú Información de Ventana Activa.

  1. Se ha visto que a través del método getSelectedFrame propio de los JDesktopPane se puede acceder a la ventana activa. Pero, ¿cómo puedo acceder a otra ventana interna aunque no esté activa?

Para hacer esto, la clase JDesktopPane posee un método llamado getAllFrames la cual devuelve un vector conteniendo todas las ventanas internas que hay actualmente en el JDesktopPane.


  1. Para practicar con el método indicado en el punto anterior, añade al menú Archivo una nueva opción llamada Cerrar Todo:

     
       


  1. Accede al evento actionPerformed de la nueva opción y programa lo siguiente:




  1. Analicemos el código anterior.

Lo primero que se observa es el uso del método getAllFrames. Este método devuelve un vector conteniendo todas las ventanas internas actuales. En nuestro código, almacenamos estas ventanas en un vector llamado v.

JInternalFrame v[] = panelInterno.getAllFrames();


A continuación, recorremos todo el vector y vamos cerrando cada ventana almacenada en el vector.

Como puedes observar, este código hace que se cierren todas las ventanas de imagen abiertas.



  1. Ejecuta el programa y comprueba el funcionamiento de la opción Cerrar Todo.


  1. Este código es un ejemplo de actuación sobre todas las ventanas internas abiertas. A continuación usaremos esta misma idea para organizar las ventanas dentro del panel interno. Añade las siguientes opciones al menú:

     
                      


  1. La opción Cascada organizará las ventanas internas abiertas en cascada. Para ello entra en el evento actionPerformed de dicha opción y programa lo siguiente:

 



  1. Analicemos el código:

Observa de nuevo el uso de getAllFrames para almacenar todas las ventanas internas abiertas en un vector v:

JInternalFrame v[] = panelInterno.getAllFrames();


A continuación se recorre el vector y se asigna a cada ventana interna (cada elemento del vector) un tamaño con el método setSize y una posición con el método setLocation. Las posiciones de cada ventana van variando para situar cada ventana una encima de la otra.

El vector se recorre al revés, desde la última ventana a la primera para mejorar la visualización de dichas ventanas.


  1. Ejecuta el programa y prueba el funcionamiento de la opción Cascada. Se recomienda que primero abra varias ventanas y luego pulse esta opción.





CONCLUSIONES:

En la programación MDI siempre actúan dos elementos:

- Un panel interno JDesktopPane, el cual contendrá las ventanas internas.

- Una clase del tipo JInternalFrame, la cual definirá el diseño de las ventanas internas.

El panel interno posee diversos métodos que permiten acceder a las ventanas actualmente abiertas dentro de él. Entre estos métodos podemos destacar:

- getSelectedFrame, que devuelve la ventana interna activa en el momento actual.

- getAllFrames, que devuelve un vector de JDesktopPane, conteniendo todas las ventanas internas abiertas en el panel interno.

Gracias a estos dos métodos podemos acceder a las ventanas internas y actuar sobre ellas.

No hay comentarios.:

Publicar un comentario