viernes, 13 de julio de 2012

2.1 Manejo de Eventos

En esta unidad entenderás como manejar los eventos de un applet para cuando el usuario desee utilizar algun elemento que permita que el applet realice acciones, como un botón, un deslizador de barra, etc.
Evento
Un evento se refiere a alguna acción que puede ser realizada por el usuario para que el applet realice alguna serie de instrucciones. Ente algunos eventos dentro de un applet tenemos:
  • oprimir en un botón específico
  • mover una barra de desplazamiento
  • oprimir una tecla específica
Cuando un applet esta ejecutándose, éste puede estar esperando que el usuario active alguna secuencia de instrucciones mediante la selección de algún elemento de interfaz gráfica definida para esto, como lo hemos hecho anteriormente con el objeto de la clase Button.
Cuando creamos un objeto de interfaz gráfica que nos servirá para que el usuario indique alguna acción, es importante definirle a este objeto que será escuchado por la clase específica que se encarga de revisar si hay algún evento que ha sido realizado.
Escuchadores de eventos (Listeners)
Un Escuchador (Listener) es un objeto que es notificado cuando un evento ocurre. Este tiene dos requerimientos: 1) Debió haber sido registrado con una o más fuentes que reciben notificaciones sobre tipos de eventos específicos, y 2) Debe implementar métodos que reciban y procesen éstas notificaciones.
Los métodos que reciben y procesan estas notificaciones están definidos en un grupo de interfaces encontradas en java.awt.event. Por ejemplo la clase MouseMotionListener define dos métodos que reciben notificaciones cuando el ratón es arrastrado o movido. Algún objeto puede recibir y procesar uno o ambos de estos eventos si éste provee una implementación de esta interfase.
Eventos de Botón
Analicemos lo que se hace para manejar más de un botón, usemos el applet utilizado anteriormente para dar la suma de todos los números desde el 1 hasta el N:


Supongamos que ahora queremos tener un botón que limpie los valores de los campos, para volver a dar nuevos valores.
El applet quedaría muy parecido al anterior hecho, solo que ahora en el método action Performed debemos revisar cual fue el botón que se seleccionó, y esto será a través de la instrucción de decisión IF, y el método getSource() que es tomado de la clase ActionEvent, que es el parámetro que nos pasa el método actionPerformed. Dentro de este parámetro es donde se guarda la información sobre cual es el elemento gráfico que fue seleccionado.
Es importante no olvidar que todos las clases para poder usar eventos se toman utilizando  import  java.awt.event.*;
El applet quedaría como el siguiente:
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

// <applet width="150" height="200" code="AppletEventos1"></applet>
public class AppletEventos1 extends Applet implements ActionListener {
   Label l1, l2;
   TextField t1,t2;
   Button b1,b2;

   public AppletEventos1() {
      l1 = new Label("Numero");
      t1 = new TextField(8);
      l2 = new Label("Suma");
      t2 = new TextField(8);
      b1 = new Button("Suma");
      b2 = new Button("Limpia");
      add(l1);
      add(t1);
      add(b1);
      add(b2);
      add(l2);
      add(t2);
      b1. addActionListener(this);
      b2. addActionListener(this);
   }

   public void actionPerformed(ActionEvent ae) {
      if (ae.getSource() == b1) {
         int n = Integer.parseInt(t1.getText());
         int suma = 0;
         for (int i = 1; i<= n; i++) {
            suma += i;
         }
         t2.setText("" + suma);
      }
      if (ae.getSource() == b2) {
         t1.setText("");
         t2.setText("");
      }
   }
}
La ejecución del applet quedaría como el siguiente:
Donde lo mas importante aquí es entender el uso del método getSource() y el objeto ae perteneciente a la clase ActionEvent, que es el que nos esta pasando el evento de que se trata, la instrucción  
      if (ae.getSource() == b1) {
Lo que revisa es si el evento que fue el tomado corresponde al objeto del botón b1, si esto es cierto, entonces se realizan las intrucciones dentro del if, de otra manera se salta a continuar con el siguiente if.
La misma acción la podemos realizar, pero utilizando el método getActionCommand, pero aqui el cambio sería tomar el String que aparece en el elemento del botón, no el nombre del objeto botón, la instrucción pudiera ser :
if (ae.getActionCommand() == "Suma")
Ambas maneras son utilizadas para revisar cual fue el botón seleccionado.
De tal manera que el applet podría quedar como el siguiente y funcionaría igual:

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

// <applet width="150" height="200" code="AppletEventos1"></applet>
public class AppletEventos1 extends Applet implements ActionListener {
   Label l1, l2;
   TextField t1,t2;
   Button b1,b2;

   public AppletEventos1() {
      l1 = new Label("Numero");
      t1 = new TextField(8);
      l2 = new Label("Suma");
      t2 = new TextField(8);
      b1 = new Button("Suma");
      b2 = new Button("Limpia");
      add(l1);
      add(t1);
      add(b1);
      add(b2);
      add(l2);
      add(t2);
      b1. addActionListener(this);
      b2. addActionListener(this);
   }

   public void actionPerformed(ActionEvent ae) {
      if (ae.getActionCommand() == "Suma") {
         int n = Integer.parseInt(t1.getText());
         int suma = 0;
         for (int i = 1; i<= n; i++) {
            suma += i;
         }
         t2.setText("" + suma);
      }
      if (ae. getActionCommand() == "Limpia") {
         t1.setText("");
         t2.setText("");
      }
   }
}

Otro EJEMPLO

Ahora mostramos un ejemplo en el que utilizamos dos botones, un botón para dibujar círculos en el applet al azar (empezando más debajo de la coordenada 60, 80), el otro botón es para limpiar el applet.

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
// <applet width="150" height="200" code="AppletCirculos"></applet>
public class AppletCirculos extends Applet implements ActionListener {
Label l1;
TextField t1;
Button b1,b2;
boolean dibuja = false; // se inicializa dibuja en falso para no dibujar
public AppletCirculos() {
l1 = new Label("Circulos");
t1 = new TextField(8);
b1 = new Button("Dibuja");
b2 = new Button("Limpia");
add(l1);
add(t1);
add(b1);
add(b2);
b1. addActionListener(this);
b2. addActionListener(this);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == b1) {
dibuja = true; // si el usuario selecciona dibujar se pone verdadero
}
if (ae.getSource() == b2) {
dibuja = false; // si el usuario selecciona limpiar se pone en falso
}
repaint();
}
public void paint(Graphics g) {
if (dibuja) { // si dibuja es verdadero se dibuja
g.setColor(Color.red); // se cambia a rojo el color de dibujo
int circulos = Integer.parseInt(t1.getText()); // se toma el numero del texto
for (int i = 1; i <= circulos ; i++) { // ciclo de circulos
int x1 = (int) (Math.random()*100)+60;
int y1 = (int) (Math.random()*100)+80;
g.drawOval(x1,y1, 50, 50); // se dibuja un circulo en
// una posición al azar
}
}
else { // si dibuja es falso se limpia el applet
g.setColor(Color.white);
g.fillRect(0,0,200,200);
}
}
}

Algunos ejemplos de la vista del applet son:

No hay comentarios:

Publicar un comentario en la entrada