You are on page 1of 3

Manejo de Eventos Las interfaces desarrolladas hasta el momento se visualizan adecuadamente pero todava no prestan el servicio que deberan

pues al presionar sus botones no hacen nada. Que debemos tener listo para poner en total funcionamiento el programa? 1. Lo primero son todas las clases que modelan las entidades del mundo y que permiten resolver los problemas de los que se encargar el programa. Recordemos que la interfaz grfica presenta solamente las opciones para que el usuario pueda ingresar los datos y visualizar los resultados, es decir, su funcin es la de interactuar con el usuario del programa, pero en ningn momento la interfaz tiene la responsabilidad de resolver los problemas para los que fue desarrollado el programa. Por lo tanto, es necesario que se realice el modelamiento de las clases que representan a las entidades del problema y se lleve a cabo su construccin en el lenguaje de programacin. Para el ejemplo del convertidor de temperatura de grados centgrados a Fahrenheit y Kelvin, nuestro modelamiento quedara as: Debemos tener en cuenta que debido al crecimiento en la cantidad de clases que maneja el programa y con el objetivo de conservar el orden, empezamos a agrupar las clases de acuerdo con el objetivo de estas en al menos dos paquetes:
+ Convertidor centigrados:double + Convertidor() +asignarCentigrados(cen:double):void +obtenerCentigrados():double +convertirAFahrenheit():double +convertirAKelvin():double

temperatura

A. Un paquete para las clases que modelan las entidades del problema (en el caso del ejemplo el paquete se llama temperatura), y B. Otro paquete para las clases que construyen la interfaz del programa, incluyendo la clase con el mtodo main. La nica clase necesaria para resolver el problema en este caso es Convertidor que tiene como atributo la temperatura en centgrados, el mtodo constructor, sus getter y setter, y los mtodos que convierten a la unidad de temperatura deseada.

Figura IU-15

2.

Luego, debemos comunicar la interfaz con la clase principal de las entidades que modelan la solucin del problema. Esto lo conseguimos con una relacin entre la clase ventana y la clase principal de las entidades del problema, as: En el diagrama de clases: En Java, la relacin se establece como un atributo en la clase VentanaTemperatura del tipo de la clase Convertidor as:
temperatura <<JFrame>> + VentanaTemperatura + VentanaTemperatura() Aqu van las otras clases del paquete miConvertidor + Convertidor centigrados:double + Convertidor() public VentanaTemperatura(){

temperaturainterfaz

archivo: PanelEntrada.java
//aqu van el package y todos los imports de swing //pero el siguiente import es muy importante pues //trae la clase principal del otro paquete

import temperatura.Convertidor;
public class VentanaTemperatura extends JFrame{

private Convertidor miConvertidor; miConvertidor = new Convertidor(); Figura IU-16


} //aqu va el resto de instrucciones del //mtodo constructor de la ventana

3.

Ahora nos vamos a los paneles y debemos distinguir cuales de ellos van a manejar eventos, es decir, cuales van a tener botones que respondan a los requerimientos del usuario. Claramente, de los dos paneles que manejamos en el ejemplo, solamente el panel Entrada manejar eventos, pues tiene el botn Convertir, mientras que el otro panel (el panel Resultados) no presenta ningn botn. Sobre toda clase panel que maneje eventos se deben hacer varios cambios, clasificados en tres categoras (cambios sobre la clase, cambios sobre los botones y cambios del panel en relacin con la ventana): Cambios sobre la clase: A. Se deben agregar dos importaciones: import java.awt.*; e import java.awt.event.*;

B.

La declaracin de la clase debe, adems de tener la declaracin extends JPanel, tener la declaracin implements ActionListener, de manera que quede: public class PanelConEventos extends JPanel implements ActionListener{ De esta manera, la declaracin de la clase PanelEntrada del ejemplo quedara as: public class PanelEntrada extends JPanel implements ActionListener{

C.

Debe agregarse un mtodo llamado actionPerformed que ser el mtodo que se invocar automticamente cuando el botn sea presionado. La firma del mtodo es: public void actionPerformed(ActionEvent ev). Por ahora, el mtodo puede quedar definido de la siguiente manera en la clase del panel que maneja eventos:
public void actionPerformed(ActionEvent ev){ }

Cambios sobre los botones: A. Por cada botn definido en la clase del panel, debemos agregar una constante de tipo cadena asociada con la accin que va a realizar el botn. Para el caso del ejemplo, ya que el botn se encarga de convertir, la constante se declarar de la siguiente manera:
public final static String CONVERTIR=convertir;

B.

En el constructor y despus de inicializar los botones, se debe invocar dos mtodos a cada botn, los mtodos son setActionCommand y addActionListener, el primero es para asociar la accin a realizar con el botn y el segundo es para indicar que clase va a atender el evento del botn. Para el ejemplo tratado, los llamados en el constructor de la clase panel quedaran as:
butConvertir.setActionCommand(CONVERTIR); //La accin que le asociamos al botn est en la //constante que acabos de definir butConvertir.addActionListener(this); //Le indicamos que la clase actual (this) va a //responder al evento del botn

Cambios del panel en relacin con la ventana Ya que debemos atender el requerimiento del usuario al presionar el botn, de alguna forma nos debemos comunicar con las clases que modelan las entidades del problema. Cmo hacemos esto?, Quin tiene relacin en la interfaz con alguna de esas entidades? Pues esa relacin ya la establecimos desde la clase ventana, por lo tanto, cuando se produzca el evento debemos comunicarnos con la ventana para que ella le indique al mundo cual es el problema que necesitamos solucionar. Por esa razn debemos establecer una relacin entre cada panel que maneja eventos y la clase ventana de la interfaz. A. Se debe declarar una relacin entre la clase del panel que maneja los eventos y la clase de la ventana, de manera que ahora la relacin queda en los dos sentidos pues ya ventana tena una relacin hacia el panel. En java esa relacin se declara como un atributo, y en el ejemplo planteado quedara as:
private VentanaTemperatura miVentanaTemperatura;

B.

La inicializacin de la relacin hacia la ventana no se debe hacer como comnmente la realizamos (creando un nuevo objeto) sino que esta vez vamos a recibir un objeto del tipo de la ventana como parmetro en el constructor del panel y con el valor de ese parmetro se inicializar el atributo relacin hacia la ventana, as:
//el constructor de la clase PanelEntrada cambia en su firma //y se agrega la instruccin de inicializacin public PanelEntrada(VentanaTemperatura ventana){ miVentanaTemperatura = ventana; //Esta inicializacin se da de forma similar a un setter //aqu continan las dems instrucciones del constructor del panel }

C.

El siguiente cambio se da en el constructor de la clase ventana, pues al cambiar el constructor del panel, la creacin del objeto de ste desde la ventana cambiar tambin para pasarle al panel un objeto de la ventana. En este caso se pasa un objeto de la misma clase (this). Para el ejemplo tratado, la instruccin de creacin del panel de Entrada desde la ventana quedara as:
//el constructor de la clase de la ventana cambia al crear los paneles //pues debe pasarles el objeto de la ventana (de ella misma this-) a los paneles public VentanaTemperatura(){ //aqu van las dems instrucciones del constructor de la ventana miPanelEntrada = new PanelEntrada(this); // aqu van las dems instrucciones del constructor de la ventana }

4.

Una vez establecido toda la estructura para poder escuchar los eventos del botn y haber establecido el canal de comunicacin desde el panel hacia la ventana y de all al mundo, entonces procedemos a escribir las instrucciones que indican como se debe atender el requerimiento del usuario que se gener al oprimir el botn. Atender este requerimiento necesita de una serie de pasos que nos van a llevar en un viaje desde el panel hasta la ventana, luego al mundo y de all nuevamente a los paneles. Los pasos son los siguientes: a) El mtodo actionPerformed de la clase del panel con los botones, es el primer mtodo que se invoca (automticamente) cuando un botn es presionado. Por tanto, al interior de este mtodo inicia la atencin al requerimiento. Debido a que puede haber varios botones en el mismo panel, lo primero que hacemos es identificar cul botn fue el que presion el usuario. Esta verificacin la hacemos preguntndole al evento cual fue la accin o el comando que tiene el botn que fue presionado y luego este comando se compara con la constante declarada para el botn correspondiente. Para el ejemplo, quedara as:
public void actionPerformed(ActionEvent ev){ String comando; comando = ev.getActionCommand(); if(comando.equals(CONVERTIR)){ //aqu delegamos la atencin del requerimiento solicitado por el usuario //a un mtodo de la ventana, pues es la ventana la que se puede comunicar //con las clases que modelan las entidades del problema miVentanaTemperatura.gestionarConversion(); } }

b) Creamos un nuevo mtodo en la clase de la ventana que permita realizar toda la gestin que necesita el requerimiento del usuario. Para el caso del ejemplo, oprimir el botn Convertir implica: 1) Pedirle al campo de texto que me entregue la temperatura digitada por el usuario. 2) Convertir esa temperatura digitada por el usuario a un valor de tipo entero. 3) Pasarle el valor entero a la clase que modela el problema, que en este caso es Convertidor y lo hacemos a travs del setter del atributo centrigrados. 4) Una vez asignado el valor de la temperatura en centgrados, invocamos los mtodos que devuelven el valor de la temperatura pero en grados Fahrenheit y en Kelvin. 5) Con los valores ya transformados en Fahrenheit y Kelvin debemos pasar esos valores a los campos de texto que visualizan esa informacin.

You might also like