Gauge, Item y Form

(Imagen: Edgar Degas - El ajenjo)

Seguimos con la descendencia de Screen, y ahora nos toca explorar a Form y todo lo que podemos poner en él. Un Form es un subtipo de Screen que puede albergar una colección de controles de interfaz de usuario, a los que llamaremos items, y que son instancias de la clase Item.

En este post exploraremos el funcinamiento de dos subtipos de Item: Gauge y StringItem; y para esto utilizaremos un MIDlet de ejemplo tomado -como es usual- del libro de Knudsen. Este MIDlet nos mostrará un Gauge -un indicador- y un texto que nos mostrará el valor que almacena este Gauge. El código fuente es el siguiente:

package test;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Gauge;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.ItemStateListener;
import javax.microedition.lcdui.StringItem;
import javax.microedition.midlet.*;

/**
* @author cgavidia
*/
public class GaugeTracker extends MIDlet implements ItemStateListener, CommandListener {

private Gauge mGauge;
private StringItem mStringItem;

public GaugeTracker() {
int initialValue=3;
this.mGauge = new Gauge("Gauge Title", true, 5, initialValue);
this.mStringItem = new StringItem(null, "[value]");
this.itemStateChanged(mGauge);
}


public void startApp() {
Form form = new Form("Gauge Tracker");
form.addCommand(new Command("Exit", Command.EXIT,0));
form.setCommandListener(this);
form.append(this.mGauge);
form.append(this.mStringItem);
form.setItemStateListener(this);

Display.getDisplay(this).setCurrent(form);
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

public void itemStateChanged(Item item) {
if (item == this.mGauge){
this.mStringItem.setText("Value = " + this.mGauge.getValue());
}
}

public void commandAction(Command c, Displayable d) {
if (c.getCommandType() == Command.EXIT){
this.notifyDestroyed();
}
}
}



Primero definimos como atributos el Gauge y el StringItem que vamos a mostrar. Gauge es un selector que almacena un valor entero, y StringItem es una etiqueta de texto común y corriente. El constructor de Gauge que hemos usado recibe 4 parámetros: el primero es su etiqueta, el segundo un boolean que nos indica si es interactivo o no, y los dos últimos son el valor máximo y el valor inicial. Nuestro Gauge es interactivo debido a que el usuario va a poder cambiar su valor; pero existe la posibilidad de usar Gauge no-interactivos, que se utilizan para cosas como barras de progreso. Pero este no es el caso.

El constructor de StringItem recibe dos parámetros: una etiqueta y un valor. A la etiqueta le asignamos null para que no sea visible y como valor ponemos una cadena arbitraria. Y después, invocamos al método itemStateChanged, que agregamos debido a la implementación de la interfaz ItemStateListener. Los items en un form disparan eventos cuando el usuario interactúa con ellos. Para que nuestra aplicación responda a estos eventos es necesario registrar un objeto ItemStateListener (como nuestro MIDlet) dentro de un form. Esto ya lo haremos más adelante.

Terminada la ejecución del constructor y obtenida la instancia, comienza la ejecución de startApp. Lo primero a hacer es obtener un Form, y lo hacemos mediante su constructor que sólo recibe como parámetro el título. A este form le agregamos un Command para terminar la aplicación, y le asignamos como CommandListener a nuestro MIDlet. Luego, asignamos nuestros dos items - mGauge y mStringItem - al Form que acabamos de crear mediante el método append. También es necesario asignarle al Form un ItemStateListener, para manejar la lógica producto de la interacción con el usuario: esto lo hacemos mediante setItemStateListener (recordar que el MIDlet implementa ItemStateListener). Terminamos la lógica de startApp mostrando al usuario el Form recién configurado mediante setCurrent.

El usuario puede cambiar los valores del Gauge, y nosotros requerimos que cuando pase esto se actualice el texto mostrado por mStringItem. Este proceso lo realizamos en el método itemStateChanged: con setText cambiamos el valor del StringItem y con getValue obtenemos el valor del Gauge. Para finalizar, implementamos la lógica para salir de la aplicación en commandAction, de la misma manera que venimos haciéndolo hace un par de posts. Al ejecutar la aplicación, verían algo así:



Ese sería el final del post. Hasta otra..!!

Basado en Wireless Java Developing with J2ME de Jonathan Knudsen.

Publicar un comentario