5.2.1 Cambios de estado de la ventana

 

Hola, ¿qué hay? vamos a ver cómo controlar los diferentes estados de la ventana, es decir, como desencadenar una acción o detectar que una ventana ha sido maximizada y en ese momento concreto desencadenar una acción. Si queremos desencadenar una acción indiferentemente del estado de la ventana ya sea maximizada, minimizada, restaurada, etc., tenemos que utilizar la siguiente interfaz:



Esta interfaz solo implementa un método que recoge solo un parámetro de tipo WindowEvent, esto significa que no vamos a necesitar ninguna clase adaptadora pero sí que vamos a necesitar la clase WindowEvent:



Esta clase tiene dos métodos: getNewState() es el estado actual de la ventana y getOldState() es el estado anterior de la ventana. Por ejemplo, si la ventana tiene un tamaño parcial y luego la maximizamos de forma que ocupa toda la pantalla, el estado anterior, es decir, getOldState será la ventana de tamaño parcial y la ventana maximizada será el estado actual el método getNewState().

Vamos a crear una práctica en la cual se ejecutará un frame que cuando cambie su estado desencadenará una acción, nos imprimirá un mensaje en consola indicando que el estado de la ventana ha cambiado. Para ello nos creamos un nuevo archivo CambioEstadoVentana cuyo código es el siguiente:

package event;

 

import javax.swing.*;

 

import java.awt.event.*;

 

public class CambioEstadoVentana {

 

       public static void main(String[] args) {

           

             MarcoEstado mimarco=new MarcoEstado();

 

       }

 

}

class MarcoEstado extends JFrame{

     

       public MarcoEstado() {

           

             setVisible(true);

           

             setBounds(300, 300, 500, 250);

       }

}

Nos aparece un marco o una ventana que cuando maximicemos o minimicemos el marco en consola nos aparezca una frase indicando que la ventana ha cambiado de estado. A continuación de la clase MarcoEstado vamos a crearnos una clase que implemente WindowStateListener que es la que va a controlar el estado de la ventana:

class CambioEstado implements WindowStateListener{

   

   

}

Nos aparece un error debido a que estamos utilizando esta interface, cuando implementamos una interfaz esto nos obliga o nos marca el diseño de la clase, nos obliga a reescribir o reconstruir el método que implementa esta interface. Como ya hemos visto tiene un solo método por lo que tenemos que reconstruirlo:

class CambioEstado implements WindowStateListener{

 

      @Override

      public void windowStateChanged(WindowEvent e) {

            // TODO Auto-generated method stub

           

      }

   

   

}

Dentro de este método mediante un System.out vamos a indicar que nos imprima un mensaje en la consola cuando la ventana cambie de estado:

class CambioEstado implements WindowStateListener{

 

      @Override

      public void windowStateChanged(WindowEvent e) {

           

            System.out.println("La ventana ha cambiado de estado");

           

      }

   

   

}

Ahora tenemos que añadir una instancia perteneciente a esta clase y ponerla a la escucha.

     public MarcoEstado() {

           

             setVisible(true);

           

             setBounds(300, 300, 500, 250);

            

             CambioEstado nuevo_estado=new CambioEstado();

            

             addWindowStateListener(nuevo_estado);

 

       }

Si probamos la aplicación, no nos aparece nada por consola pero en cuanto la minimicemos:



Al igual que si la maximizamos.

Hemos visto cómo controlar el estado de la ventana, es decir, cuando la ventana cambia de estado, es maximizada, minimizada, etc. Sin embargo, si queremos controlar también el estado en el que se encuentra tenemos que utilizar los métodos que se encuentran en la clase WindowEvent que ya se han npmbrado: getNewState() y getOldState(). Como siempre podéis revisar la API de Java para conocer más acerca de estos métodos.

Seguimos con el ejemplo anterior, si vamos a la clase CambioEstado, además de indicarle que nos imprima un mensaje cuando cambia el estado también que nos dé información en qué estado se encuentra la ventana:

class CambioEstado implements WindowStateListener{

 

      @Override

      public void windowStateChanged(WindowEvent e) {

           

            System.out.println("La ventana ha cambiado de estado");

           

            System.out.println(e.getNewState());

           

      }

   

   

}

Si probamos la aplicación, en consola nos tiene que aparecer el primer mensaje del System.out y si cambiamos el estado de la ventana nos tiene que aparecer un número:



Si maximizamos la ventana:



Si la minimizamos:



Si la restauramos:



Aparecen los números porque los diferentes estados de la ventana están codificados con un código, con un número. Para evitar imprimir los números y saber exactamente el estado de la ventana le vamos a indicar que imprima un mensaje en consola cuando la ventana este maximizada, haríamos lo siguiente:

public void windowStateChanged(WindowEvent e) {

           

            System.out.println("La ventana ha cambiado de estado");

           

            //System.out.println(e.getNewState());

           

        if(e.getNewState()==6) {

           

            System.out.println("La ventana esta maximizada");

     }

 

           

      }

Comentamos la línea que nos informa del nuevo estado de la ventana mediante un número entero, mediante un condicional if llamamos al método getNewState indicándole que si es igual a 6, porque 6 es el estado maximizado que nos imprima un mensaje en consola.

Puede resultar difícil recordar todos los números referentes a los diferentes estados de la ventana, en lugar de un número podemos indicarle el nombre de la constante:

if(e.getNewState()==Frame.MAXIMIZED_BOTH) {

           

            System.out.println("La ventana esta maximizada");

     }            

Sería exactamente lo mismo. Podemos encadenar más estados:

if(e.getNewState()==Frame.MAXIMIZED_BOTH) {

           

            System.out.println("La ventana esta maximizada");

     }else if(e.getNewState()==Frame.NORMAL) {

          

            System.out.println("La ventana esta normal");

     }else if(e.getNewState()==Frame.ICONIFIED) {

          

            System.out.println("La ventana esta minimizada");

     }

   

}

Con cualquier duda ya sabéis que lo podéis hacer a través de los comentarios del blog, entre todos nos ayudaremos a solventar todas esas dudas que nos pueden surgir. Hasta pronto!

5.2 EVENTOS DE VENTANA << >> 5.3 EVENTOS DE TECLADO



No hay comentarios:

Publicar un comentario