Clases Adapter

Java proporciona ayudas para definir los métodos declarados en las interfaces Listener. Una de estas ayudas son las clases Adapter , que existen para cada una de las interfaces Listener que tienen más de un método. Su nombre se construye a partir del nombre de la interface, sustituyendo la palabra “Listener” por “Adapter”. Hay 7 clases Adapter: ComponentAdapter, ContainerAdapter, FocusAdapter, KeyAdapter, MouseAdapter, MouseMotionAdapter y WindowAdapter.

Las clases Adapter derivan de Object, y son clases predefinidas que contienen definiciones vacías para todos los métodos de la interface. Para crear un objeto que responda al evento, en vez de crear una clase que implemente la interface Listener, basta crear una clase que derive de la clase Adapter correspondiente, y redefina sólo los métodos de interés. Por ejemplo, la clase VentanaCerrable se podía haber definido de la siguiente forma:

1. // Fichero VentanaCerrable2.java
2. import java.awt.*;
3. import java.awt.event.*;
4. class VentanaCerrable2 extends Frame {
5. // constructores
6. public VentanaCerrable2() { super(); }
7. public VentanaCerrable2(String title) {
8. super(title);
9. setSize(500,500);
10. CerrarVentana cv = new CerrarVentana();
11. this.addWindowListener(cv);
12. }
13. } // fin de la clase VentanaCerrable2
14. // definición de la clase CerrarVentana
15. class CerrarVentana extends WindowAdapter {
16. void windowClosing(WindowEvent we) { System.exit(0); }
17. } // fin de la clase CerrarVentana

Las sentencias 15-17 definen una clase auxiliar (helper class) que deriva de la clase WindowAdapter. Dicha clase hereda definiciones vacías de todos los métodos de la interface WindowListener. Lo único que tiene que hacer es redefinir el único método que se necesita para cerrar las ventanas.

El constructor de la clase VentanaCerrable crea un objeto de la clase CerrarVentana en la sentencia 10 y lo registra como event listener en la sentencia 11. En la sentencia 11 la palabra this es opcional: si no se incluye, se supone que el event source es el objeto de la clase en la que se produce el evento, en este caso la propia ventana.

Todavía hay otra forma de responder al evento que se produce cuando el usuario desea cerrar la ventana. Las clases anónimas de Java son especialmente útiles en este caso. En realidad, para gestionar eventos sólo hace falta un objeto que sea registrado como event listener y contenga los métodos adecuados de la interface Listener. Las clases anónimas son útiles cuando sólo se necesita un objeto de la clase, como es el caso. La nueva definición de la clase VentanaCerrable podría ser como sigue:

1. // Fichero VentanaCerrable3.java
2. import java.awt.*;
3. import java.awt.event.*;
4. class VentanaCerrable3 extends Frame {
5. // constructores
6. public VentanaCerrable3() { super(); }
7. public VentanaCerrable3(String title) {
8. super(title);
9. setSize(500,500);
10. this.addWindowListener(new WindowAdapter() {
11. public void windowClosing() {System.exit(0);}
12. });
13. }
14. } // fin de la clase VentanaCerrable

Obsérvese que el objeto event listener se crea justamente en el momento de pasárselo como argumento al método addWindowListener(). Se sabe que se está creando un nuevo objeto porque aparece la palabra new. Debe tenerse en cuenta que no se está creando un nuevo objeto de WindowAdapter (entre otras cosas porque dicha clase es abstract), sino extendiendo la clase WindowAdapter, aunque la palabra extends no aparezca. Esto se sabe por las llaves que se abren al final de la línea 10.

Los paréntesis vacíos de la línea 10 podrían contener los argumentos para el constructor de WindowAdapter, en el caso de que dicho constructor necesitara argumentos. En la sentencia 11 se redefine el método windowClosing(). En la línea 12 se cierran las llaves de la clase anónima, se cierra el paréntesis del método addWindowListener() y se pone el punto y coma de terminación de la sentencia que empezó en la línea 10.

Fuente: Aprenda Java como si estuviera en primero de la Universidad de Navarra