Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Recordatorio del ActionListener
aliens9889 Sin conexión
programador
**

Mensajes: 31
Registro en: Apr 2012
Reputación: 0
Mensaje: #1
Lightbulb Recordatorio del ActionListener
Hola profesor como esta!? le hago el recordatorio sobre mostar un ejemplo con el ActionListener que hablamos hoy en clase Thanks!!!!

There's not impossible Problems. All of them have a Solution. Just take a Moment to Find it!!! Cool
25-06-2012 07:45 PM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
demian Sin conexión
Administrator
*******

Mensajes: 1.808
Registro en: Jun 2010
Reputación: 0
Mensaje: #2
RE: Recordatorio del ActionListener
Primero que nada, este tutorial está muy interesante:

http://www.jguru.com/faq/view.jsp?EID=98547

Muestra como implementar un objeto que dispare eventos. Eso es más o menos lo que quieres hacer, sólo que tu no quieres disparar un evento tuyo sino usar una ActionEvent/ActionListener.

En tu caso, imagina que tienes un objeto "MiPropioBoton" y quieres que dispare ActionEvents, es decir que se le puedan asociar ActionListeners tal como a un JButton. Para eso tienes que implementar en MiPropioBoton cuatro métodos:

Código:
public class MyPropioBoton {

  // Esto es una lista especial que se usa para almacenar "Listeners".
  protected EventListenerList eventListenerList = new EventListenerList();

  // EN ALGUN LUGAR DE LA CLASE VA EL RESTO DEL CÓDIGO QUE
  // NO TIENE QUE VER CON LOS LISTENERS...

  // Esto permite desde otra clase asociar un action listener a esta clase
  public void addActionListener(ActionListener listener) {
    eventListenerList.add(ActionListener.class, listener);
  }

  // Esto permite remover un action listener cuando no te interesa que reciba más eventos
  public void removeActionListener(ActionListener listener) {
    eventListenerList.remove(ActionListener.class, listener);
  }

  // Esto te retorna un arreglo con todos los action listeners asociados
  public EventListener[] getActionListener() {
    return eventListenerList.getListeners(ActionListener.class);
  }

  // Esto dispara un ActionEvent, que produce se invoquen en cascada los métodos
  // actionPerformed de todos los Action Listeners involucrados
  private void fireActionEvent(ActionEvent evt) {
    EventListener[] eventListeners = getActionListener();

    for (int i = 0; i < eventListeners.length; i++) {
      ActionListener listener = (ActionListener) eventListeners[i];
      listener.actionPerformed(evt);
    }
  }

  public alLlamarAEstoSeDisparaUnEvento() {

    // Bla, bla... código en general

    // Aquí dispara el evento
    ActionEvent evt = new ActionEvent( ... ); // No recuerdo los argumentos pero no es relevante
    fireActionEvent(evt); // Se invocan todos los action listeners.
  }

El uso de esta clase es idéntico al de un JButton, es decir, le añades el/los listeners que responden al evento y cuando se invoca alLlamarAEstoSeDisparaUnEvento, o a cualquier otro método que tenga que disparar eventos entonces se invoca a fireActionEvent que en cascada invoca al actionPerformed de todos los listeners registrados.

Espero sea de ayuda.
Saludos,

[Imagen: dmi-1.jpg]
(Este mensaje fue modificado por última vez en: 26-06-2012 12:30 PM por demian.)
26-06-2012 12:22 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
aliens9889 Sin conexión
programador
**

Mensajes: 31
Registro en: Apr 2012
Reputación: 0
Mensaje: #3
Information RE: Recordatorio del ActionListener
Hola Profesor como esta!? hemos estado viendo el ejemplo que nos mostro pero sigue siendo algo confunso de entender. Los metodos que tiene el ActionListener las estamos implementando pero sin obtener algun resultado significativo. podria darnos un consejo mas sobre esto!? Gracias profesor!!!!!

There's not impossible Problems. All of them have a Solution. Just take a Moment to Find it!!! Cool
30-06-2012 07:02 PM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
demian Sin conexión
Administrator
*******

Mensajes: 1.808
Registro en: Jun 2010
Reputación: 0
Mensaje: #4
RE: Recordatorio del ActionListener
Este ejemplo lo escribí rápido pero funciona:

Código:
package org.cyrano.swing.event.actionlistener;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class UsesSomethingThatFiresEvents {

  public static void main(String[] args) {

    SourceOfActionEvents sourceOfActionEvents1 = new SourceOfActionEvents();
    SourceOfActionEvents sourceOfActionEvents2 = new SourceOfActionEvents();

    // Add the action listener to the objects...
    sourceOfActionEvents1.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        System.err.println("Hello Source Of Action Events 1!!!");
      }
    });

    sourceOfActionEvents2.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        System.err.println("Hello Source Of Action Events 2!!!");
      }
    });

    // Something happen and the events are fired

    sourceOfActionEvents1.doSomethingThatGeneratesAnEvent();
    sourceOfActionEvents2.doSomethingThatGeneratesAnEvent();
  }
}

Código:
package org.cyrano.swing.event.actionlistener;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.event.EventListenerList;

public class SourceOfActionEvents {

  // --------------------------------------------------------------------------------
  // This is the logic for the event
  // --------------------------------------------------------------------------------

  // List of Listeners
  private EventListenerList eventListenerList = new EventListenerList();

  public void addActionListener(ActionListener l) {
    eventListenerList.add(ActionListener.class, l);
  }

  public void removeActionListener(ActionListener l) {
    eventListenerList.remove(ActionListener.class, l);
  }

  public ActionListener[] getActionListeners() {
    return eventListenerList.getListeners(ActionListener.class);
  }

  // This is just an utility to fire ActionEvents from this class
  private void fireActionEvent(ActionEvent evt) {
    ActionListener[] actionListenerArray = getActionListeners();

    for (ActionListener l : actionListenerArray) {
      l.actionPerformed(evt);
    }
  }

  // --------------------------------------------------------------------------------
  // This is the logic for your class (i.e. button)
  // --------------------------------------------------------------------------------

  // for example, detect a mouse click or something else...
  public void doSomethingThatGeneratesAnEvent() {

    // Do something...

    // Don't care about the id or the command
    ActionEvent evt = new ActionEvent(this, 0, null);
    fireActionEvent(evt);

    // Do something else
  }
}

La segunda clase es una fuente de eventos, en este caso de ActionListeners. La primera clase es un simple main de prueba que añade action listeners a instancias de la segunda clase. La primera la pueden ver como un JButton o como el botón que ustedes necesitan hacer.

No es indispensable, pero en el SVN hay un ejemplo de eventos personalizados en Swing. Le pueden dar una mirada. Ese ejemplo no ha gustado mucho, tengo tiempo que no lo veo pero quizá sea algo confuso. El URL directo es:

http://code.google.com/p/foo-org-ve/sour...t%2Fcustom

También pueden ir a mi google code (foo-org-ve) y bajar el proyecto SwingTutorial. Allí buscan el paquete org.cyrano.swing.event.custom y consiguen el código.

Me avisan cualquier cosa,
Saludos,

[Imagen: dmi-1.jpg]
30-06-2012 07:36 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
demian Sin conexión
Administrator
*******

Mensajes: 1.808
Registro en: Jun 2010
Reputación: 0
Mensaje: #5
RE: Recordatorio del ActionListener
(30-06-2012 07:02 PM)aliens9889 escribió:  
Hola Profesor como esta!? hemos estado viendo el ejemplo que nos mostro pero sigue siendo algo confunso de entender. Los metodos que tiene el ActionListener las estamos implementando pero sin obtener algun resultado significativo. podria darnos un consejo mas sobre esto!? Gracias profesor!!!!!

Por cierto, si no logran arreglarlo con lo que les acabo de publicar pueden compartir por aquí las partes significativas de su código, es decir, los [add/remove/get]ActionListener[s] y el fireActionEvent, y como lo invocan a ver si consigo algo extraño que pueda estar generando el problema.

[Imagen: dmi-1.jpg]
30-06-2012 07:39 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
luisboscan Sin conexión
Mata Tigres xD
**

Mensajes: 16
Registro en: Apr 2012
Reputación: 0
Mensaje: #6
RE: Recordatorio del ActionListener
La duda en general, es que si en vez de hacer todo con ActionEvent, es necesario implementarlo con MouseEvent para poder hacer las validaciones cuando haga click de si esta o no encima del boton algo así en el fire:
Código:
private void fireActionEvent(MouseEvent evt) {
    MiListener[] actionListeners = getActionListeners();
    for (MiListener actionListener : actionListeners) {
        actionListener.clicked(evt);
    }
}

MiListener es una interface para la funcion clicked, donde la funcion seria algo asi mas o menos:

Código:
public void clicked(MouseEvent e) {    
    if ((e.getX() <= (WIDTH + coordenada.x) && e.getX() >= coordenada.x) // Decision
            && (e.getY() <= (HEIGHT + coordenada.y) && e          // para saber si esta
                    .getY() >= coordenada.y)) {                       // o no dentro
        fireActionEvent(e);
    }
}

Después de eso no se que faltaría para que funcionara esto:

Código:
BotonGrafico boton = new BotonGrafico();
boton.addActionListener(new MiListener() {
            public void clicked(MouseEvent e) {
                    System.out.println("Aqui esta el boton!");
            }
        });

No se que mas faltaría, que estaría mal implementado o no, o si hay alguna otra forma para calcular el click del mouse para la validación y usar ActionListener y ActionEvent... De antemano gracias y disculpas por la molestia y por si es una mala codificacion jeje! Wink
30-06-2012 07:49 PM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
demian Sin conexión
Administrator
*******

Mensajes: 1.808
Registro en: Jun 2010
Reputación: 0
Mensaje: #7
RE: Recordatorio del ActionListener
Ok, entiendo la fuente de confusión.

No deberían mezclar (al menos no conceptualmente) lo relacionado al MouseListener y al ActionListener. Imaginen un botón simple. El botón debe detectar cuando el usuario le hace click, esto lo hace con un mouse listener, pero lo hace internamente. El programador que usa el botón no le interesa lo relacionado con el mouse listener. El programador que usa el botón probablemente no le interesa la coordenada X,Y en que se hizo click. Al programador que hizo el botón sólo le interesa que alguien apretó el botón.

Detectar el click->MouseListener, validar si realmente me hicieron click a mi (como botón) ->MouseListener.

Una vez que determino que me hicieron click (porque valido las coordenadas, etc, entonces allí disparan el ActionEvent.

En el caso de ustedes, tienen un JPanel sobre el que dibujan

Código:
+----------------------------------------+
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
+----------------------------------------+

El panel es el que maneja el MouseListener (sus botones individualmente no). El panel tiene una lista de "objetos que puede dibujar y que pueden manejar clicks" (pueden ser botones o pueden ser otras cosas, esa es la interfaz "Drawable" de la que hablamos. Cada vez que el panel detecta un click del mouse (con el MouseListener) entonces recorre la lista de Drawables e invoca a "click()" para cada uno de ellos.

Ahora bien, la parte importante, cada botón conoce sus coordenadas:

Código:
+----------------------------------------+
|+-----+                                 |
|| b1  |                                 |
|+-----+                                 |
|+-----+                                 |
|| b2  |                                 |
|+-----+                                 |
+----------------------------------------+

De manera que cuando se invoca a "click" sobre el botón entonces el mismo botón valida sus coordenadas, por ejemplo:

Código:
public class Boton {

// .....

  public void click(MouseEvent mouseEvt) {
  // Decision
  //  para saber si esta
  // o no dentro
  if ((mouseEvt.getX() <= (WIDTH + coordenada.x) && mouseEvt.getX() >= coordenada.x)
              && (mouseEvt.getY() <= (HEIGHT + coordenada.y) && mouseEvt.getY() >= coordenada.y)) {

        // Asumo que aquí es dentro... primero hay que crear un action event:
        ActionEvent actionEvt = new ActionEvent(this, 0, null);

         fireActionEvent(actionEvt);
      }
  }

// .....

}

Noten que allí dentro (en cada botón) se usa el MouseEvent para saber si el click cayó dentro o no del botón, y si cayó dentro entonces se crea un nuevo ActionEvent y se disparan los ActionListeners. Lo que tienen que ver es que en ningún momento se mezclan los MouseEvents/Listeners con los ActionEvents/Listeners. Es decir, el panel usa el MouseEvent para informarle a los botones que hicieron click, los botones determinan si el click les corresponde y si les corresponde entonces disparan un ActionEvent.

Cualquier cosa que pueda aclarar al respecto me dicen...

[Imagen: dmi-1.jpg]
30-06-2012 09:14 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
luisboscan Sin conexión
Mata Tigres xD
**

Mensajes: 16
Registro en: Apr 2012
Reputación: 0
Mensaje: #8
RE: Recordatorio del ActionListener
Creo que ya capte la idea Big Grin... Voy a probar con varios ejemplos para ver muchas gracias profesor! Tal cosa por aqui jeje Tongue
30-06-2012 10:11 PM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Enviar respuesta 


Salto de foro:


Usuario(s) navegando en este tema: 1 invitado(s)