ActionListener

De ChuWiki
Revisión del 06:19 1 jun 2006 de Chuidiang (Discusión | contribuciones) (creado)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar

Los ActionEvent

Hay muchos componentes java, por ejemplo, JButton, JTextField, JComboBox, etc, que permiten al usuario realizar una acción típica con ellos: pulsar el botón, pulsar <INTRO> en un JTextField para indicar que ha terminado de editarlo, seleccionar una opción en el JComboBox, etc. Es la acción principal que se puede hacer con ese componente java.

Para que nuestro código se entere de ello, debemos hacer una clase que implemente la interface ActionListener. Hay muchas formas de hacer esto y vamos a verla.


Una clase normalita

Una forma es hacer una clase en un fichero java que implemente ActionListener.

public class MiClase implements ActionListener
{
   public void actionPerformed (ActionEvent e)
   {
      // Aqui el código que queremos que se ejecute cuando tiene lugar la acción.
      // la pulsación del botón, el <INTRO> en el JTextField, elección en el JComboBox, etc.
   }
}

Luego, simplemente tenemos que añadir esta clase al componente java usando su método addActionListener().

JButton boton = new JButton ("Pulsame");
MiClase elListener = new MiClase();
boton.addActionListener (elListener);

Este método no se suele usar casi nunca, puesto que es bastante engorroso hacerse una clase para cada uno de los componentes java que tengamos en la ventana que hagan algo.

Otra pega es que la clase es totalmente independiente, por lo que no tenemos acceso a los métodos de ninguna ortra clase, salvo que hagamos métodos para pasárselas.

Una clase interna

Otra forma es hacer una clase interna dentro de otra clase. Por ejemplo, si nuestra clase es una clase que hereda de JFrame y tiene botones, podemos hacerlo así

public class MiVentana extends JFrame
{
   public MiVentana()
   {
       JButton boton = new JButton ("Pulsame");
       MiClase elListener = new MiClase();
       boton.addActionListener (elListener);
   }
   public void pulsado()
   {
      System.out.println("Pulsado el botón");
   }
   ...
   pubic class MiClase implements ActionListener
   {
      public void actionPerformed (ActionEvent e)
      {
         pulsado();
      }
   }
}

Este método sigue presentando el inconveniente de que hay que hacer una clase completa para cada componente java que tengamos en la ventana que queramos que haga algo.

La ventaja es que desde este componente sí podemos acceder a métodos de la clase externa a la que pertenece la clase interna. Como vemos en el ejemplo, desde MiClase podemos llamar al método pulsado() de la clase MiVentana.


Hacer que la clase principal implemente ActionListener

Otra forma que sí se usa a veces es hacer que la clase principal implemente ActionListener así

public class MiVentana extends JFrame implements ActionListner
{
   public MiVentana()
   {
       JButton boton = new JButton ("Pulsame");
       MiClase elListener = new MiClase();
       boton.addActionListener (this);
   }
   public void actionPerformed (ActionEvent e)
   {
         System.out.println("Pulsado");
   }
}

Aquí ahorramos hacer una clase nueva y tenemos accesibles todos los métodos de la clase principal. Esta opción es muy cómoda si tenemos pocos componentes.


Clase anónima

La opción que más se usa es la de hacer la clase "sobre la marcha". El código es este

public class MiVentana extends JFrame
{
   public MiVentana()
   {
       JButton boton = new JButton ("Pulsame");
       MiClase elListener = new MiClase();
       boton.addActionListener (new ActionListener()
       {
         public void actionPerformed (ActionEvent e)
         {
            pulsado();
         }
       });
   }
   public void pulsado()
   {
      System.out.println("Pulsado el botón");
   }
}

De esta forma, cuando compilemos se creará algo parecido a un fichero

MiVentana$1.class

Ese es el fichero de la clase anónima.


Distinguir qué botón causa la acción

Cuando nos decidimos a hacer una clase, suele ser habitual querer aprovechar la clase para varios botones. En el método actionPerformed() de esa clase se nos pasa un ActionEvent. Con este ActionEvent podemos obtener información sobre quién es el que ha provocado el evento.

  event.getSource();

Este método nos devuelve el componente java (JButton, JTextField, etc) que ha provocado. Si la clase está añadida, por ejemplo a boton1, boton2 y boton3, en el método actionPerformed() podemos hacer algo como esto

public void actionPerformed (ActionEvent e)
{
   Object fuente = e.getSource();
   if (fuente==boton1)
      metodoParaBoton1();
   else if (fuente==boton2)
      metodoParaBoton2();
   else if (fuente==boton3)
      metodoParaBoton3();
}

Otra opción interesante, es decirle al botón cual es su "comando". Se hace así

boton.setActionComando("Borra");  // Borra es un texto cualquiera, que NO sale en el botón

Luego, en el ActionEvent, podemos obtener el "comando" del componente que ha provocado el evento.

public void actionPerformed (ActionEvent e)
{
   String comando = e.getActionCommand();
   if (comando.equlas("Borra"))
      metodoParaBorra();
   else if (comando.equlas("Crea"))
      metodoParaCrea();
   else if (comando.equlas("Modifica"))
      metodoParaModifica();
}

Este método tiene la ventaja, además de ser más claro, que permite que añadamos el mismo comando a varios botones o componentes y todos ellos harán lo mismo. Por ejemplo, imagina que tenemos un menú en el que una de las opciones es "Borra" y una barra de herramientas rápida en la que tenemos un botón que también "Borra". Añadiendo el mismo ActionListener a ambos, menú y botón, la acción que se ejecutará es la misma.