Swing no solamente da un toque de profesionalidad a nuestros programas escritos en Java, sino que proporciona un método muy potente para procesar los eventos. Quizás el único problema con Swing sea la velocidad, puesto que si utilizamos componentes Swing nuestra aplicación correrá a menor velocidad. El motivo es muy sencillo: utilizando Swing no estamos haciendo uso de los componentes que el propio Windows provee, sino que estamos utilizando componentes que nada tienen que ver con el corazón del sistema operativo. Otro detalle a tener en cuenta a la hora de utilizar componentes Swing es que debemos intentar evitar mezclar componentes de Windows (AWT) y componentes Swing en nuestra aplicación. Si lo hacemos, algunos componentes Swing de nuestra aplicación podrían no aparecer, puesto que los componentes de Windows son dibujados en pantalla por encima de los componentes Swing. En realidad pasar a Swing es un salto importante. En primer lugar tenemos que cambiar bastante la mentalidad en cuanto a cómo procesar eventos. En segundo lugar, no debemos hacer uso de componentes de Windows conjuntamente con componentes Swing. Y en tercer y último lugar, nuestra aplicación será un poco más lenta. Pero estos tres pequeños precios a pagar nada tienen que ver con las aplicaciones prácticas de usar Swing. Una ventaja añadida a la utilización de Swing es, sin duda, la portabilidad. Si creamos una aplicación con componentes de Windows y deseamos ejecutar la misma aplicación en un MAC, puede que no consigamos la misma distribución o tamaño de los componentes en pantalla. En cambio, si utilizamos Swing, debido a que son componentes que forman ya parte de Java, queda garantizado que todas las máquinas virtuales, con independencia del sistema operativo, soporten Swing del mismo modo. Una vez conocidas las limitaciones y ventajas de Swing vamos a ver cómo utilizar este nuevo conjunto de componentes y cómo procesar eventos. En primer lugar, y antes de empezar a programar, debemos tener en cuenta que Swing no siempre ha sido parte inseparable de Java, sino que fue añadido a partir de la versión 1.2. Por este motivo deberemos comprobar qué versión del JDK estamos utilizando. Si estamos utilizando una versión del JDK que aún no soporta Java, podemos bien actualizar el JDK a la versión 1.2 (o 1.3), o bien podemos bajarnos el soporte Swing para versiones viejas del JDK. En ambos casos deberemos ir a la Web de Sun (www.javasoft.com) para bajarnos los correspondientes ficheros. Los componentes Swing no son más que clases en Java. Todo el paquete de componentes Swing están contenidos en el paquete javax.swing. Para crear un componente Swing, no tendremos más que crear una nueva instancia de la clase que corresponde al componente. Por ejemplo, para crear una instancia de un botón, simplemente deberemos escribir: JButton button = new JButton("Demo"); Una vez creado el objeto, simplemente deberemos añadirlo a un contenedor utilizando el método add que ya hemos visto con anterioridad. Crear listeners Cualquier clase puede ser convertida en listener simplemente implementando una interfaz determinada. La interfaz a implementar depende de qué eventos deseemos procesar. Para procesar acciones sobre un componente (por ejemplo pulsar un botón) deberemos implementar la interfaz ActionListener, contenida en el paquete java.awt.event. Pero existen distintos tipos de interfaces para listeners. Si deseamos, por ejemplo, detectar si el ratón está siendo arrastrado sobre un componente en concreto, deberemos implementar la interfaz MouseMotionListener. En la Web de Sun se pueden encontrar descripciones concretas sobre cada tipo de interfaz. Para conseguir que un listener procese los eventos realizados sobre un determinado componente, deberemos asociar el componente con un listener. De esta forma, los métodos de la clase que actúa como listener serán llamados cada vez que se produzca un evento sobre el componente asociado a éste. Para asociar un evento con un componente, deberemos hacer uso de los métodos dentro del componente. Imaginemos que hemos escrito una clase, a la que llamaremos Oyente y deseamos que procese los eventos sobre un objeto JButton ya instanciado. Simplemente tendremos que escribir la siguiente línea de código: boton.addActionListener ( Oyente ); Distintos botones pueden tener el mismo listener. Por lo tanto podemos utilizar el siguiente código: boton.addActionListener ( Oyente ); boton2.addActionListener ( Oyente ); En el siguiente ejemplo se crea una clase que actúa como listener de un botón: Ejemplo 1: Crear listeners y componentes Swing Oyente.java import java.awt.event.*; public class Oyente implements ActionListener, MouseMotionListener { public Oyente() { } public void actionPerformed ( ActionEvent e ) { System.out.println("El boton ha sido pulsado!"); } public void mouseMoved ( MouseEvent e ) { System.out.println("El raton se esta moviendo sobre el boton: x: " + e.getX() + " y: " + e.getY() ); } public void mouseDragged ( MouseEvent e ) { System.out.println("El raton se esta moviendo sobre el boton"); } } Principal.java import java.awt.*; import javax.swing.*; public class Principal extends Frame { private JButton boton; public Principal() { super (); // Crear el boton boton = new JButton ("Esto es un boton"); // Crear el listener setLayout ( new BorderLayout() ); Oyente oyente = new Oyente(); boton.addActionListener( oyente ); boton.addMouseMotionListener( oyente ); reshape(50,50,300,340); // Añadir boton this.add ( boton ); validate (); setVisible ( true ); } public static void main ( String[] main ) { new Principal (); } }
En la clase Principal.java creamos una ventana, una instancia de un botón (que se añade a la ventana) y también creamos un listener (Oyente.java) que en este caso procesa los eventos de pulsación del ratón y movimiento del cursor del ratón sobre el componente. Como se puede ver en el fuente, cada vez que uno de estos eventos es generado, un determinado método del oyente es llamado. Las clases que son pasadas como parámetros a los métodos del listener contienen información específica del evento que ha sido generado. En la clase Oyente.java se imprime en pantalla el evento y la posición del cursor dentro del componente cada vez que se mueve el cursor del ratón sobre el botón. En los próximos artículos profundizaremos más en el tema del Swing y realizaremos un exhaustivo examen de los otros componentes disponibles en esta nueva librería de Java. |
|