FocusListener y FocusAdapter

De ChuWiki

A veces es interesante enterarnos de cuando un componente java -un botón, un campo de texto, etc- gana o pierde el foco. Por ejemplo, podemos querer que cambie el color del botón que tiene el foco, de forma que resalte sobre los demás.

Para enterarnos de cuando un componente java gana o pierde el foco, hay que añadirle un FocusListener, es decir, una clase que implemente la interface FocusListener.

El siguiente código, por ejemplo, hace que un botón se ponga de color rojo cuando gana el foco y recupere su color original cuando lo pierde

JButton boton = new JButton ("Pulsame");
// Guardamos el color de background por defecto.
final Color colorBackgroundDefecto = boton.getBackground();
...
boton.addFocusListener(new FocusListener() {
   public void focusGained(FocusEvent e) {
      e.getComponent().setBackground(Color.RED);
      // e.getOpositeComponent() devuelve el Component que le
      // cede el foco a nuestro botón.
   }
   public void focusLost(FocusEvent e) {
      e.getComponent().setBackground(colorBackgroundDefecto);
      // get.OpositeComponent() devuelve el Component al que
      // nuestro botón cede el foco.
   }
});

En el evento FocusEvent que recibimos está almacenado el Component que ha ganado o perdido el foco. Se puede obtener con e.getComponent(). Basta con cambiarle el color a ese Component, que es el que origina el evento y es, por tanto, el botón.

El evento FocusEvent también tiene el método getOpositeComponent(), que nos permite saber qué Component le ha cedido el foco a nuestro botón o a qué Component le cede el foco nuestro botón. Por ejemplo, si tiene el foco un JTextField y el foco pasa a nuestro JButton, getComponent() nos devolverá el JButton y getOpositeComponent() nos devolverá el JTextField. Y al revés, si el JButton tiene el foco y se lo pasa al JTextField, getComponent() seguirá devolviendo el JButton y getOpositeComponent() seguirá devolviendo el JTextField.

Si no tenemos interés en ambos casos, pérdida y ganancia del foco, sino sólo en uno de ellos, en vez de usar FocusListener e implementar ambos métodos, podemos usar FocusAdapter e implementar sólo uno de ellos. FocusAdapter es una clase que implementa a FocusListener, pero cuyos métodos no hacen nada. Es tarea nuestra redefinir sólo aquellos que queramos que hagan algo.

boton.addFocusListener (new FocusAdapter() {
   public void focusGained (FocusEvent e) {
      // El botón gana el foco
   }
   // No hace falta definir focusLost()
});

Enlaces[editar]