Tutorial de Java

Intercambio de Componentes

Anterior | Siguiente
Todavía se verán algunos ejemplos más, porque nunca por mucho fue mal año y es mejor reforzar lo que se sabe, o decir los mismo de otro modo, para que el lector pueda reconocer lo mismo desde diferentes puntos de vista si no se ha aclarado con explicaciones anteriores y, además, en todos los ejemplos habrá algo que pueda fijarse de mejor forma que lo que haya hecho algún ejemplo anterior, y eso es lo que se pretende.

En este caso, se va a tratar de hacer que un objeto Label funcione como un objeto Button, provocando que genere eventos de tipo ActionEvent atribuibles a un botón; es decir, los eventos serán enviados a un objeto receptor ActionListener registrado sobre un Button, donde serán procesados como si fuesen eventos originados por ese objeto Button, cuando en realidad su origen es el objeto Label.

Al contrario que en el ejemplo anterior, en este ejemplo, java1115.java, no se va a sobreescribir ningún método processXxxEvent(), sino que se centrará el código completamente al modelo fuente/receptor del Modelo de Delegación de Eventos. Dos objetos Label y un objeto Button son instanciados y añadidos a un objeto Frame. Cuando se pica sobre el botón, se genera un evento de tipo ActionEvent que es atrapado por un objeto ActionListener registrado sobre el objeto Button. El código del método actionPerformed() del objeto ActionListener cambia el color de fondo del objeto Label Muestra entre azul y amarillo, y viceversa.

Hasta aquí todo es normal. Sin embargo, se registra un objeto MouseListener sobre el objeto Label, para que cuando se pique sobre la etiqueta, el código del método mouseClicked() del objeto MouseListener genere un evento ActionEvent y lo coloque en la cola de eventos del Sistema. Lo que hace es simular que ha sido pulsado el botón, colocando la identificación del objeto Button en el parámetro source del objeto ActionEvent. El Sistema enviará este objeto ActionEvent al objeto ActionListener registrado sobre el objeto Button. El resultado final es que pulsando el ratón con el cursor colocado sobre la etiqueta, se invoca al método actionPerformed() registrado sobre el objeto Button, produciéndose exactamente el mismo resultado que cuando se pulsa el botón.

Durante la ejecución del programa se puede observar un efecto colateral curioso, y es que la etiqueta responde más rápido al ratón que el propio botón. Esto probablemente sea debido a los repintados que tiene que hacer el botón para simular la animación de la pulsación; quizá si se utilizasen simulaciones de los eventos pulsar y soltar sobre la etiqueta y se fuesen cambiando los colores de fondo, por ejemplo, se produjese una degradación similar.

El primer fragmento de código sobre el que hay que reparar en el ejemplo, son las dos sentencias en el constructor que registran objetos Listener sobre el botón y la etiqueta. Una cosa importante es que la referencia al objeto Button es pasada al constructor del objeto MouseListener del objeto Label, siendo éste el enlace que permite crear el evento ActionEvent desde la etiqueta y atribuírselo al botón.

También es interesante observar que el objeto Listener de la etiqueta no sabe nada sobre la otra etiqueta, Muestra, cuyo color se cambia durante la ejecución del programa. Esto es porque el objeto Label que va a simular al botón, no es el que cambia directamente el color del otro objeto Label; sino que va a ser el botón el encargado de realizar esa tarea.

miClickLabel.addMouseListener( new MiMouseListener( miBoton ) );
miBoton.addActionListener( new MiActionListener( miColorLabel ) );

La siguiente sentencia resultará conocida. Es la sentencia que va en el método mouseClicked() del objeto MouseListener que crea y envía el objeto ActionEvent y lo atribuye al objeto Button. Esto es posible, ya que tiene acceso a la referencia del objeto Button. Esta referencia es pasada como parámetro cuando el objeto MouseListener es construido, aunque puede hacerse de otras formas, por ejemplo, se podría consultar periódicamente la cola de eventos del Sistema en espera de cazar un evento de tipo ActionEvent y obtener la referencia del botón. Esta es una de las razones por las que se aplican normas estrictas de seguridad en el acceso de los applets a la cola de eventos del Sistema, porque podrían consultarla y obtener todo tipo de información si no se hiciese así.

Como el objeto ActionEvent es atribuido al objeto Button, será enviado al objeto ActionListener registrado sobre ese Button, donde será procesado como si su origen estuviese realmente en el botón.

Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(
    new ActionEvent( miBoton,
    ActionEvent.ACTION_PERFORMED,"evento" ) );

Ya lo único que resta es llamar la atención sobre la sintaxis del objeto ActionEvent, en donde se utiliza la referencia al objeto Button como primer parámetro, source, y hay que recordar que se debe indicar un valor correcto para el parámetro id, sino el evento no será tratado por el Sistema.

Navegador

Home | Anterior | Siguiente | Indice | Correo