La forma exacta en la que los componentes obtienen el foco depende del sistema de ventanas. Normalmente, el usuario selecciona el foco pulsando sobre una ventana o componente, pulsanto TAB entre componentes, o mediante cualquier otra interacción con un componente. Se puede pedir que un componente tenga el foco llamando al método requestFocus de Component
El interface FocusListener y su correspondiente clase adaptador, FocusAdapter, contienen dos métodos:
- void focusGained(FocusEvent)
- Llamado por el AWT justo después de que el componente obtenga el foco.
- void focusLost(FocusEvent)
- Llamado por el AWT justo después de que el componente pierda el foco.
El siguiente applet demuestra los eventos de foco. Pulsando sobre el botón que hay en la parte superior del applet, podrás traer una ventana que contiene una gran variedad de componentes. Un oyente de Foco escucha los eventos de foco de cada componente de la ventana, incluyendo la propia ventana (que es un ejemplar de una subclase de Frame llamada FocusWindow).
Intenta esto:
- Trae la ventana llamada Focus Demo Window pulsando sobre el botón de la parte superior del applet.
- Si es necesario, pulsa sobre la ventana para que sus contenidos puedan obtener el foco.
Verás un mensaje de "Focus gained" en el área del applet. La forma de obtener el foco es dependiente del sistema. Puedes detectar cuando la ventana obtiene o pierde el foco implementado un oyente de ventana y escuchar los eventos de activación o desactivación de ventana.- Pulsa el botón que hay a la derecha de la ventana Focus Demo Window, y luego pulsa sobre algún otro componente, como el campo de texto.
Observa que cuando el foco cambia de un componente a otro, el primer componente genera un evento de foco perdido antes de que el segundo componente genere un evento de foco obtenido.- Intenta cambiar el foco pulsando Tab o Shift-Tab.
La mayoría de los sistemas permiten utilizar la tecla Tab para circular a través de los componentes que pueden obtener el foco.- Miniaturiza la ventana Focus Demo Window.
Deberías ver un mensaje "Focus lost" del componente que tuvo el foco por última vez.
Puedes encontrar el código completo del applet en FocusDemo.java. Aquí tienes el código de manejo de eventos del applet:
public class FocusDemo ... implements FocusListener ... { ...//Donde ocurra la inicialziación window = new FocusWindow(this); ... public void focusGained(FocusEvent e) { displayMessage("Focus gained", e); } public void focusLost(FocusEvent e) { displayMessage("Focus lost", e); } void displayMessage(String prefix, FocusEvent e) { display.append(prefix + ": " + e.getSource() //XXX + "\n"); } ... } class FocusWindow extends Frame { ... public FocusWindow(FocusListener listener) { super("Focus Demo Window"); this.addFocusListener(listener); ... Label label = new Label("A Label"); label.addFocusListener(listener); ... Choice choice = new Choice(); ... choice.addFocusListener(listener); ... Button button = new Button("A Button"); button.addFocusListener(listener); ... List list = new List(); ... list.addFocusListener(listener); } }
Cada método de evento de foco tiene un sólo parámetro: un objeto FocusEvent. La clase FocusEvent define un método, isTemporary, que devuelve true si un evento de pérdida de foco es temporal. Es un conocimiento especial cuando deseas indicar que un componente particular obtenga el foco si la ventana vuelve a obtener el foco.El mensaje más común que enviarás a un objeto FocusEvent es getComponent (definido en ComponentEvent), que devuelve el componente que acaba de obtener o perder el foco, disparando el evento.