|
![]() |
Movimiento del Foco |
Anterior | Siguiente |
Los programas típicos de los entornos de
ventanas que disponen de un interfaz gráfico permiten mover el foco entre los diversos
Componentes del interfaz mediante la tecla del Tabulador en el sentido de las
agujas del reloj y mediante la combinación Mayúsculas y Tabulador, realiza el movimiento
del foco en sentido inverso a través de los Componentes. Esto es lo que se conoce como Movimiento
Transversal. En el JDK este método de desplazamiento está soportado sin que el programador tenga que realizar esfuerzo alguno. El orden en que se mueve el foco entre los Componentes viene determinado, aparentemente, por el orden en que se han instanciado y parece no poder modificarse, tal como sucede en otros entornos de desarrollo. En el esquema estándar de movimiento del foco, se excluyen algunos tipos de Componentes para que no puedan ganar el foco (una Etiqueta, por ejemplo) y, en principio no puede forzarse a que sea de forma diferente. Sin embargo, en el ejemplo que se presenta, se implementa un esquema de desplazamiento del foco utilizando una tecla distinta a la estándar. Aunque nunca se utilice esto en un programa normal, sí que proporciona una buena demostración del uso de ciertos aspectos del modelo de Delegación de Eventos que se ha introducido. En el programa java1108.java, se implementa la capacidad de movimiento del foco utilizando las teclas F12 y Mayúsculas y F12. También se hace que aquellos Componentes que normalmente no se tienen en cuenta a la hora de pasarles el foco, puedan adquirirlo. También se hace que el movimiento del foco sea independiente del orden en que se instancian los Componentes, sin demasiado esfuerzo adicional en lo que a programación se refiere. En el ejemplo anterior java1107.java, se mostraba cómo un Componente podía ganar el foco y responder al teclado; y cómo ganaba el foco cuando recibía la pulsación del ratón. Por simplicidad, en el ejemplo que sigue se ha eliminado esta capacidad del programa, pero podría implementarse del mismo modo. Aunque el listado el programa es largo, vuelve a ser repetitivo. Se coloca un objeto Button, un objeto TextField y un objeto Label sobre un objeto Frame para componer el interfaz gráfico que presenta la aplicación. Se instancia y registra un objeto receptor de eventos del foco, FocusListener, para recibir los eventos focusGained() y focusLost() sobre los objetos Frame y Label. Cuando se producen estos eventos, el objeto FocusListener hace que el Frame, cuando tiene el foco, cambie su color de fondo a azul y, cuando es la Etiqueta quien tiene el foco, el color del texto se vuelve rojo. Un objeto KeyListener es instanciado y registrado para recibir eventos keyPressed() desde el Frame, etiqueta, botón y campo de texto. Cuando se pulsa una tecla, el objeto que tiene el foco genera un evento keyPressed(), aunque sea un objeto, como la Etiqueta, que normalmente no genere este tipo de eventos. Si se pulsa la tecla F12 o Mayúsculas-F12, el objeto KeyListener implementa un esquema definido en el programa que mueve el foco al Componente siguiente o al anterior, respectivamente. Al contrario que el método estándar de control del foco con la tecla del Tabulador, la determinación de quién es el Componente siguiente o anterior al que se desplazará el foco, es independiente del orden en que se han instanciado los Componentes. Y también, al contrario que en el movimiento estándar del foco, en este ejemplo, se han incluido los objetos Label y Frame en la secuencia de movimiento. |
|