List y MIDlets

(Imagen: Edgar Degas - The New Orleans Cotton Exchange)

En el post pasado nos encargamos de TextBox, un componente gráfico que hereda de Screen, que a su vez hereda de Displayable. Ahora, nos toca revisar a su "hermano": List, que también es del tipo Screen.

Los componentes List nos permiten seleccionar items de un grupo de alternativas posibles. Para representar a cada elemento, utilizamos una cadena de texto y/o una imagen. Es posible seleccionar uno o más elementos del List según el tipo de List que utilicemos... pero mejor esto hay que verlo con un ejemplo (tomado, una vez más, del libro de Knudsen). Construiremos un MIDlet que nos permita seleccionar entre tres opciones posibles: Airplane, Car y Hotel. Al seleccionar algún elemento se nos mostrará un alert con la selección realizada, y habilitaremos también un botón para terminar la aplicación. Entonces, he aquí el código fuente:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package test;

import java.io.IOException;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.List;
import javax.microedition.midlet.*;

/**
* @author cgavidia
*/
public class TravelList extends MIDlet implements CommandListener {
private List mList;
private Command mExitCommand, mNextCommand;

public TravelList() {
String[] stringElements = {"Airplane", "Car", "Hotel"};
Image[] imageElements = {this.loadImage("/airplane.png"), this.loadImage("/car.png"), this.loadImage("/hotel.png")};
this.mList = new List("Reservation Type", List.IMPLICIT, stringElements, imageElements);
this.mNextCommand = new Command("Next", Command.SCREEN, 0);
this.mExitCommand = new Command("Exit", Command.EXIT, 0);
mList.addCommand(mExitCommand);
mList.addCommand(mNextCommand);
mList.setCommandListener(this);
}


public void startApp() {
Display.getDisplay(this).setCurrent(this.mList);
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

public void commandAction(Command c, Displayable d) {
if (c == this.mNextCommand || c== List.SELECT_COMMAND){
int index = this.mList.getSelectedIndex();
Alert alert = new Alert("Your Selection", "You chose " + this.mList.getString(index), null, AlertType.INFO);
Display.getDisplay(this).setCurrent(alert, this.mList);
}else if (c == this.mExitCommand){
this.notifyDestroyed();
}
}

private Image loadImage(String string) {
Image image = null;
try {
image = Image.createImage(string);
} catch (IOException ex) {
ex.printStackTrace();
}
return image;
}
}


Al tratarse de un MIDlet extendemos de MIDlet (redundante, lo sé), e implementamos CommandListener para que nuestra misma clase responda a los eventos de los Commands (mediante el método commandAction, pero esto ya lo sabían). Definimos como atributo un List (mList) y dos Commands, uno para seleccionar elementos y otro para salir.

Recordando el ciclo de vida de un MIDlet, lo primero a ejecutarse es el constructor. Como les mencionaba, cada elemento del List está representado visualmente por una cadena de texto y una imagen, y el constructor nos permite pasarle como parámetros un array con todas las cadenas de texto y otro con todas las imágenes: para esto usamos a stringElements y a imageElements. Antes de olvidarlo, es necesario que agreguen las imágenes a su proyecto de aplicación móvil. Si están usando Java Platform Micro Edition SDK 3.0, es necesario importar la carpeta con las imágenes en "Resources".

Pero volvamos al constructor de List: el primer parámetro es el título y el segundo es el tipo de List. Al asiganarle List.IMPLICIT como tipo nos aseguramos que el usuario sólamente pueda realizar una selección al List e inmediatamente realizar una acción de la aplicación (sin necesidad de confirmación). También inicializamos los Commands mNextCommand y mExitCommand, y se los asignamos al List que acabamos de crear. Para finalizar, le asignamos también como Listener al List a nuestro propio MIDlet.

En startUp simplemente mostramos el List que ya hemos configurado adecuadamente en el constructor. Deberían poder ver algo así:



El usuario tiene la posibilidad de seleccionar una opción del List o terminar la aplicación, y todo esto es manejado en el método commandAction. Al tratarse de un List IMPLICIT, al método commandAction va a llegar un valor especial como parámetro Command: List.SELECT_COMMAND. En caso sea esta la acción realizada por el usuario, se mostrará un Alert que indicará la opción escogida, mediante el método getString de mList. Hemos usado el método setCurrent de dos parámetros para que después de mostrado el alert se muestre nuevamente la lista (el segundo parámetro) al usuario.

Y dejamos al método loadImage para el final. Este método nos permite obtener referencias Image que representen las imágenes que queremos mostrar. Image no tiene constructores, pero en cambio nos ofrece el metodo createImage que, en este caso, en base a una cadena que coincide con la ruta nos devuelve el objeto Image que necesitamos.

Con esto finalizaríamos el post. ¡Hasta otra!

Basado en Wireless Java Developing with J2ME de Jonathan Knudsen.

Publicar un comentario