SlideShare una empresa de Scribd logo
How to make Listeners in Java
             por Nery Chucuy




                                                    Contacto
                                        idesisnery@gmail.com
                               http://idesisnery.blogspot.com
Tabla de contenidos

        Introducción

        Idea principal

        Elaboración

        Aplicaciones

        Apéndice A
Introducción [contenidos]

      Algunas veces necesitamos estar pendientes de ciertos acontecimientos
en nuestros programas, pero no siempre queremos o es factible llevar todo el
control de determinados sucesos en la lógica principal de la aplicación. Esta guía
pretende llevarnos por el camino de la creación de nuestros propios Listeners y
Events en Java, que es una forma de dar solución a lo antes planteado. Se
recomienda leer esta guía e ir analizando el código juntamente, es posible
entender el ejemplo leyendo el código y no esta guía, pero puede tender a
confundir si solo se lee la guía. Fue desarrollado en NetBeans 5.5 jdk 1.6.0_02.
Espero les sirva.

Idea principal [contenidos]

      Imaginemos que tenemos una clase Persona, entre sus atributos dicha
clase posee uno que se denomina nombre el cual obviamente define el nombre
de dicha persona. Lo que vamos a hacer es un Listener que esté al pendiente de
dicha clase persona, en especial del atributo nombre y que cuando algún objeto
cambie dicho atributo , podamos ejecutar las acciones que necesitemos (en este
caso, mostremos en consola el valor anterior del atributo y el nuevo nombre);
esto por supuesto si dicho objeto crea un LIstener para Persona.

Elaboración [contenidos]

      A continuación describiré la lógica del funcionamiento así como el
contenido de cada clase o interfaz y sus métodos más importantes, el código
fuente esta bien documentado así que no necesitamos tanto detalleaquí.

Pensando en la forma que trabaja un Listener en Java, como por ejemplo el
KeyListener, podemos vislumbrar que debe haber un Evento que es el que
contiene la información de lo acontecido cuando la tecla se presionó (para saber
que tecla fue, etc) así como también que en algún lugar debe haber una llamada
al listener del teclado, lo que nos deja con la siguiente información:

   ●   Debemos tener un Evento
   ●   Debemos tener un escuchador del evento es decir, el Listener
   ●   El evento debe dispararse en algún momento en algún lugar de nuestro
       código.

MiEvento.java
      Esta clase se encarga de encapsular la información del evento que ocurre
en un instante en el tiempo de ejecución de nuestro programa, hereda de
AWTEvent para poderse definir como un evento, también debe poseer un
número identificador de evento (puros formalidades de Java). Según esto,
cuando algún objeto cambie el valor del atributo nombre de un objeto tipo
persona, se deberá crear un objeto tipo MiEvento con la información
correspondiente.

MiEventoListener.java
      Esta es una interfaz que utilizamos para definir el método que contendrá
las acciones a realizar cada vez que se detecte nuestro evento, es como el
método actionPerformed definido por la interfaz ActionListener.
Persona.java
     Esta clase es la que posee la información de una Persona. Contiene dos
métodos importantes que son el método para cambiar el nombre un método
que disparará el evento.

El primer método a señalar es el que se encarga de disparar el evento:

  protected void fireMiEvento(MiEvento MiEventoEvent)
  {
    //objengo todos los listeners que estan pendientes de esta clase
     Object[] listeners = MiEventoListeners.getListenerList();
    //el numero de listeners que estan pendientes de esta clase
    int numListeners = listeners.length;
    for (int i = 0; i<numListeners; i+=2)
    {
         if (listeners[i]==MiEventoListener  .class) //Si es un listener de MiEvento
         {
             // Envio el evento al metodo del Listener que implementaron
               ((MiEventoListener)listeners[i+1] .cambioEstado(MiEventoEvent);
                                                 )
         }
     }
  }

Nota: Si deseas saber por qué el incremento del ciclo for es de 2 y se hace
referencia a posiciones i e i+1 en el cuerpo del ciclo, consultar el apéndice b.

 El segundo método importante es el de cambio de nombre; cuando alguien use
este método se disparará el evento.

  public void setNombre(String nombre) {
    String nombreAntiguo = this.nombre;
    this.nombre = nombre;
    //disparamos el evento, enviandole como parametr un objeto MiEvento
                                                    o
    //con la informacion que me interesa.
    this.fireMiEvento(
          new MiEvento(this,MiEvento.ID_MI_EVENTO,nombreAntiguo,nombre));
  }

Main.java
      En esta clase hacemos la implementación del listener y realizamos una
operación de cambio de nombre con el objeto tipo persona. Lo importante acá es
que en la declaración de la clase vamos a implementar el listener que creamos:

public class Main implements MiEventoListener

y vamos a definir que acciones realizar cuando esto suceda:

 public void cambioEstado(MiEvento me)
  {
    //....código
  }
Aplicaciones [contenidos]

      Finalmente veremos algunas aplicaciones que podemos darle a esto. Una
de las razones de trabajarlo así es que podemos organizar de una mejor manera
las acciones en nuestros proyectos así como también definir actitudes diferentes
en respuesta a eventos iguales.

   ●   Si tuviésemos n hilos y cada uno contiene determinado objeto que posee x
       estados; podríamos manejar en una clase principal las reacciones ante el
       cambio de estado de dichos objetos cuando los hilos están en ejecución,
       tomando en cuenta que el objeto Evento puede tener cuanta información
       necesitemos.

   ●   Si realizáramos un juego de carreras por ejemplo, podríamos definir que
       como respuesta al movimiento del vehículo en terreno hostil, éste
       disminuya su aceleración y en car
                                       retera la aumente.

   ●   Es un buen logro la independencia de resultados en base a un mismo
       evento. En algunos casos podríamos nada más estar interesados en llevar
       un log de lo que sucede, en algunos otros posiblemente necesitemos
       alterar el flujo del programa dependiendo de lo sucedido.
Apéndice A [contenidos]

    - El por qué de la forma de operación del ciclo que dispara el evento.-
Démosle un vistazo de nuevo:

for (int i = 0; i<numListeners; i+=2)
      {
          if (listeners[i]==MiEventoListener  .class) //Si es un listener de MiEvento
          {
              // Envio el evento al metodo del Listener que implementaron
                ((MiEventoListener)listeners[i+1] .cambioEstado(MiEventoEvent);
                                                  )
          }
      }

Podemos observar que los listeners en posiciones pares sirven para verificar que
el listener sea del tipo que nos interesa (en este caso MiEventoListener) para así
disparar el método relacionado. Los listeners en posiciones impares hacen
referencia a la clase que hace las del listener ya de forma específica y llama a su
método cambioEstado que hemos redefinido para nuestra conveniencia.

Como podemos recordar, el método addListener de persona hace llamada al
método add de la clase EventListenerList.java enviándole dos parámetros: el tipo
de clase del listener y el objeto listener como tal.

            MiEventoListeners.add(MiEventoListener.class, listener);

Si le damos un vistazo a la clase EventListenerList.java podemos observar que lo
que hace este método es agregar dos entradas al arreglo por cada llamada, una
donde graba el tipo de clase de listener y la otra donde referencia al listener en
si; por eso cuando avanzamos de dos en dos en el for de verifiación de listeners,
realmente estamos tratando con un solo listener (verificando su tipo de clase y
el listener como tal).

Más contenido relacionado

PPT
Manejo de Eventos en java
PPT
Eventos en Java
PDF
Java Gestion Eventos
PPT
Manejo Eventos
PPT
Manejo de eventos
PPT
Manejo Eventos en java
DOCX
Eventos, Topicos Avanzados de Programacion
PPTX
Eventos y listeners en Java Swing
Manejo de Eventos en java
Eventos en Java
Java Gestion Eventos
Manejo Eventos
Manejo de eventos
Manejo Eventos en java
Eventos, Topicos Avanzados de Programacion
Eventos y listeners en Java Swing

La actualidad más candente (18)

PPT
Programación III (Java) - 07 Eventos
PPTX
Menejo de eventos en java introduccion
PPTX
Eventos del ratón en Java
PDF
Control de eventos en gui
PPTX
Manejo de eventos en java
PPTX
Tópicos avanzados de programación eventos
PPTX
Manejoevento
PPTX
presentacion topicos unidad 1
PPT
6.eventos y swing
PPT
6.eventos y swing
PPTX
PPTX
Eventos
DOCX
Manejos de eventos john kevin castillo palacios
DOCX
Botones swing 14 11-2012
PDF
Java construye las interfaces gráficas del usuario mediante awt
PPT
Event Programing & Driven Mediator Pattern
PDF
Sesion12-Componentes AWT
PPTX
Interfaz gráfica de usuario
Programación III (Java) - 07 Eventos
Menejo de eventos en java introduccion
Eventos del ratón en Java
Control de eventos en gui
Manejo de eventos en java
Tópicos avanzados de programación eventos
Manejoevento
presentacion topicos unidad 1
6.eventos y swing
6.eventos y swing
Eventos
Manejos de eventos john kevin castillo palacios
Botones swing 14 11-2012
Java construye las interfaces gráficas del usuario mediante awt
Event Programing & Driven Mediator Pattern
Sesion12-Componentes AWT
Interfaz gráfica de usuario
Publicidad

Similar a Java Listeners (20)

PPT
Eventos
PDF
Nvo objects powerbuilder
DOCX
Programacion orientada a objetos
DOCX
Seguridad en access
PDF
Practica retro java 28102013
PDF
Sesion 02 clases en_vb_net
PPTX
Android master class
PPTX
TAP - Eventos
PPTX
modularidad de programación 2da parte (3) (1).pptx
DOCX
Porafolio unidad 1
DOCX
Porafolio unidad 1
PDF
Programacion Orientada Objetos.pdf
PDF
Trabajo investigativo sobre la programación orientada a objetos y java
PDF
Clase numero 6
PDF
Manual Swing-Java-PostgreSQL
PPTX
Como insertar una imagen en eclipse java
PPTX
Adrian eventos
PPT
Introducción a la Programaciónen Java
PPTX
clase 01-Programacion Oientada a Objetos.pptx
PPTX
Como insertar una imagen en eclipse
Eventos
Nvo objects powerbuilder
Programacion orientada a objetos
Seguridad en access
Practica retro java 28102013
Sesion 02 clases en_vb_net
Android master class
TAP - Eventos
modularidad de programación 2da parte (3) (1).pptx
Porafolio unidad 1
Porafolio unidad 1
Programacion Orientada Objetos.pdf
Trabajo investigativo sobre la programación orientada a objetos y java
Clase numero 6
Manual Swing-Java-PostgreSQL
Como insertar una imagen en eclipse java
Adrian eventos
Introducción a la Programaciónen Java
clase 01-Programacion Oientada a Objetos.pptx
Como insertar una imagen en eclipse
Publicidad

Último (20)

PDF
clase auditoria informatica 2025.........
PPTX
Presentación de Redes de Datos modelo osi
PPTX
Power Point Nicolás Carrasco (disertación Roblox).pptx
PDF
Influencia-del-uso-de-redes-sociales.pdf
PPTX
Sesion 1 de microsoft power point - Clase 1
PPTX
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
PDF
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
PDF
Maste clas de estructura metálica y arquitectura
PPTX
historia_web de la creacion de un navegador_presentacion.pptx
PDF
CyberOps Associate - Cisco Networking Academy
PDF
Estrategia de apoyo tecnología miguel angel solis
PPTX
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
PDF
SAP Transportation Management para LSP, TM140 Col18
PPTX
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
PDF
Estrategia de apoyo tecnología grado 9-3
PDF
Calidad desde el Docente y la mejora continua .pdf
PPTX
REDES INFORMATICAS REDES INFORMATICAS.pptx
PPTX
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PPTX
Propuesta BKP servidores con Acronis1.pptx
PPTX
Presentación PASANTIAS AuditorioOO..pptx
clase auditoria informatica 2025.........
Presentación de Redes de Datos modelo osi
Power Point Nicolás Carrasco (disertación Roblox).pptx
Influencia-del-uso-de-redes-sociales.pdf
Sesion 1 de microsoft power point - Clase 1
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
Maste clas de estructura metálica y arquitectura
historia_web de la creacion de un navegador_presentacion.pptx
CyberOps Associate - Cisco Networking Academy
Estrategia de apoyo tecnología miguel angel solis
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
SAP Transportation Management para LSP, TM140 Col18
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
Estrategia de apoyo tecnología grado 9-3
Calidad desde el Docente y la mejora continua .pdf
REDES INFORMATICAS REDES INFORMATICAS.pptx
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Propuesta BKP servidores con Acronis1.pptx
Presentación PASANTIAS AuditorioOO..pptx

Java Listeners

  • 1. How to make Listeners in Java por Nery Chucuy Contacto idesisnery@gmail.com http://idesisnery.blogspot.com
  • 2. Tabla de contenidos Introducción Idea principal Elaboración Aplicaciones Apéndice A
  • 3. Introducción [contenidos] Algunas veces necesitamos estar pendientes de ciertos acontecimientos en nuestros programas, pero no siempre queremos o es factible llevar todo el control de determinados sucesos en la lógica principal de la aplicación. Esta guía pretende llevarnos por el camino de la creación de nuestros propios Listeners y Events en Java, que es una forma de dar solución a lo antes planteado. Se recomienda leer esta guía e ir analizando el código juntamente, es posible entender el ejemplo leyendo el código y no esta guía, pero puede tender a confundir si solo se lee la guía. Fue desarrollado en NetBeans 5.5 jdk 1.6.0_02. Espero les sirva. Idea principal [contenidos] Imaginemos que tenemos una clase Persona, entre sus atributos dicha clase posee uno que se denomina nombre el cual obviamente define el nombre de dicha persona. Lo que vamos a hacer es un Listener que esté al pendiente de dicha clase persona, en especial del atributo nombre y que cuando algún objeto cambie dicho atributo , podamos ejecutar las acciones que necesitemos (en este caso, mostremos en consola el valor anterior del atributo y el nuevo nombre); esto por supuesto si dicho objeto crea un LIstener para Persona. Elaboración [contenidos] A continuación describiré la lógica del funcionamiento así como el contenido de cada clase o interfaz y sus métodos más importantes, el código fuente esta bien documentado así que no necesitamos tanto detalleaquí. Pensando en la forma que trabaja un Listener en Java, como por ejemplo el KeyListener, podemos vislumbrar que debe haber un Evento que es el que contiene la información de lo acontecido cuando la tecla se presionó (para saber que tecla fue, etc) así como también que en algún lugar debe haber una llamada al listener del teclado, lo que nos deja con la siguiente información: ● Debemos tener un Evento ● Debemos tener un escuchador del evento es decir, el Listener ● El evento debe dispararse en algún momento en algún lugar de nuestro código. MiEvento.java Esta clase se encarga de encapsular la información del evento que ocurre en un instante en el tiempo de ejecución de nuestro programa, hereda de AWTEvent para poderse definir como un evento, también debe poseer un número identificador de evento (puros formalidades de Java). Según esto, cuando algún objeto cambie el valor del atributo nombre de un objeto tipo persona, se deberá crear un objeto tipo MiEvento con la información correspondiente. MiEventoListener.java Esta es una interfaz que utilizamos para definir el método que contendrá las acciones a realizar cada vez que se detecte nuestro evento, es como el método actionPerformed definido por la interfaz ActionListener.
  • 4. Persona.java Esta clase es la que posee la información de una Persona. Contiene dos métodos importantes que son el método para cambiar el nombre un método que disparará el evento. El primer método a señalar es el que se encarga de disparar el evento: protected void fireMiEvento(MiEvento MiEventoEvent) { //objengo todos los listeners que estan pendientes de esta clase Object[] listeners = MiEventoListeners.getListenerList(); //el numero de listeners que estan pendientes de esta clase int numListeners = listeners.length; for (int i = 0; i<numListeners; i+=2) { if (listeners[i]==MiEventoListener .class) //Si es un listener de MiEvento { // Envio el evento al metodo del Listener que implementaron ((MiEventoListener)listeners[i+1] .cambioEstado(MiEventoEvent); ) } } } Nota: Si deseas saber por qué el incremento del ciclo for es de 2 y se hace referencia a posiciones i e i+1 en el cuerpo del ciclo, consultar el apéndice b. El segundo método importante es el de cambio de nombre; cuando alguien use este método se disparará el evento. public void setNombre(String nombre) { String nombreAntiguo = this.nombre; this.nombre = nombre; //disparamos el evento, enviandole como parametr un objeto MiEvento o //con la informacion que me interesa. this.fireMiEvento( new MiEvento(this,MiEvento.ID_MI_EVENTO,nombreAntiguo,nombre)); } Main.java En esta clase hacemos la implementación del listener y realizamos una operación de cambio de nombre con el objeto tipo persona. Lo importante acá es que en la declaración de la clase vamos a implementar el listener que creamos: public class Main implements MiEventoListener y vamos a definir que acciones realizar cuando esto suceda: public void cambioEstado(MiEvento me) { //....código }
  • 5. Aplicaciones [contenidos] Finalmente veremos algunas aplicaciones que podemos darle a esto. Una de las razones de trabajarlo así es que podemos organizar de una mejor manera las acciones en nuestros proyectos así como también definir actitudes diferentes en respuesta a eventos iguales. ● Si tuviésemos n hilos y cada uno contiene determinado objeto que posee x estados; podríamos manejar en una clase principal las reacciones ante el cambio de estado de dichos objetos cuando los hilos están en ejecución, tomando en cuenta que el objeto Evento puede tener cuanta información necesitemos. ● Si realizáramos un juego de carreras por ejemplo, podríamos definir que como respuesta al movimiento del vehículo en terreno hostil, éste disminuya su aceleración y en car retera la aumente. ● Es un buen logro la independencia de resultados en base a un mismo evento. En algunos casos podríamos nada más estar interesados en llevar un log de lo que sucede, en algunos otros posiblemente necesitemos alterar el flujo del programa dependiendo de lo sucedido.
  • 6. Apéndice A [contenidos] - El por qué de la forma de operación del ciclo que dispara el evento.- Démosle un vistazo de nuevo: for (int i = 0; i<numListeners; i+=2) { if (listeners[i]==MiEventoListener .class) //Si es un listener de MiEvento { // Envio el evento al metodo del Listener que implementaron ((MiEventoListener)listeners[i+1] .cambioEstado(MiEventoEvent); ) } } Podemos observar que los listeners en posiciones pares sirven para verificar que el listener sea del tipo que nos interesa (en este caso MiEventoListener) para así disparar el método relacionado. Los listeners en posiciones impares hacen referencia a la clase que hace las del listener ya de forma específica y llama a su método cambioEstado que hemos redefinido para nuestra conveniencia. Como podemos recordar, el método addListener de persona hace llamada al método add de la clase EventListenerList.java enviándole dos parámetros: el tipo de clase del listener y el objeto listener como tal. MiEventoListeners.add(MiEventoListener.class, listener); Si le damos un vistazo a la clase EventListenerList.java podemos observar que lo que hace este método es agregar dos entradas al arreglo por cada llamada, una donde graba el tipo de clase de listener y la otra donde referencia al listener en si; por eso cuando avanzamos de dos en dos en el for de verifiación de listeners, realmente estamos tratando con un solo listener (verificando su tipo de clase y el listener como tal).