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