AYUDA PARA VIAJE A CARTAGENA

 

SIGUIENTE

5. Interfaces gráficas de usuario
5.1. Descripción del capítulo
En este punto vamos a entrar de lleno en la programación de MIDlets usando el
perfil MIDP. Este perfil es el encargado de definir, como ya sabemos, peculiaridades de
un tipo de dispositivos, en nuestro caso, teléfonos móviles. Este perfil se ocupa de
definir aspectos como interfaces de usuario, sonidos, almacenamiento persistente, etc.
Estos aspectos los veremos en profundidad en los siguientes capítulos. En este
concretamente, nos vamos a centrar en el paquete javax.microedition.lcdui (Interfaz de
usuario con pantalla LCD), que es donde se encuentran los elementos gráficos que
vamos a utilizar en nuestras aplicaciones.
En primer lugar realizaremos una introducción a las interfaces de usuario en
los dispositivos MIDP. En este punto realizaremos una división entre interfaces de
usuario de alto nivel e interfaces de usuario de bajo nivel. Esta división continuará hasta
el final del capítulo ya que veremos por separado cada una de estas interfaces y los
elementos que están presentes en cada una de ellas.
Conforme avancemos en el capítulo, se irán describiendo las clases que
componen el paquete javax.microedition.lcdui y sus correspondientes métodos. Hay
que recordar que el objetivo de este proyecto no es ser una guía de referencia, por lo que
no vamos a explicar exhaustivamente cada clase y método. En cambio, realizaremos un
gran número de MIDlets con los que tendremos la oportunidad de ver como funciona
cada una de estas clases. Al final del capítulo, seremos capaces de crear interfaces de
usuario fáciles de usar, controlar eventos y comunicarnos con el usuario a través de un
entorno amigable.
5.2. Introducción a las interfaces de usuario
Teniendo en cuenta la diversidad de aplicaciones que podemos realizar
para los dispositivos MID (llamaremos así a los dispositivos que soportan MIDP), y los
elementos que nos proporcionan la configuración CLDC y el perfil MIDP, vamos a
dividir a estos elementos en dos grupos:
• Por un lado estudiaremos los elementos que componen la interfaz de usuario
de alto nivel. Esta interfaz usa componentes tales como botones, cajas de
texto, formularios, etc. Estos elementos son implementados por cada
dispositivo y la finalidad de usar las APIs de alto nivel es su portabilidad. Al
51
Capítulo 5: Interfaces gráficas de usuario
usar estos elementos, perdemos el control del aspecto de nuestra aplicación
ya que la estética de estos componentes depende exclusivamente del
dispositivo donde se ejecute. En cambio, usando estas APIs de alto nivel
ganaremos un alto grado de portabilidad de la misma aplicación entre
distintos dispositivos. Fundamentalmente, se usan estas APIs cuando
queremos construir aplicaciones de negocios.
• Por otro lado tenemos las interfaces de usuario de bajo nivel. Al crear una
aplicación usando las APIs de bajo nivel, tendremos un control total de lo
que aparecerá por pantalla. Estas APIs nos darán un control completo sobre
los recursos del dispositivo y podremos controlar eventos de bajo nivel como,
por ejemplo, el rastreo de pulsaciones de teclas. Generalmente, estas APIs se
utilizan para la creación de juegos donde el control sobre lo que aparece por
pantalla y las acciones del usuario juegan un papel fundamental.
Display
Command Displayable
Ticker Screen Canvas
Figura 5.1 Jerarquía de clases derivadas de Display e Item
Una vez hecha la anterior clasificación, veremos cada una de estos grupos con
mayor detalle estudiando los elementos que los integran. En el caso de las interfaces de
alto nivel, crearemos una aplicación con la que desde nuestro teléfono móvil vamos a
poder enviar órdenes a un ordenador que controlará los electrodomésticos de una casa.
De esta manera, desde nuestro móvil podremos, por ejemplo, ver el estado de nuestra
alarma, encender la calefacción, programar el vídeo o incluso calentar la cena que antes
Graphics
Textbox List Alert Form
Item
ChoiceGroup DateField TextField Gauge ImageItem StringItem
52
Java a Tope. Java 2 Micro Edition
de salir de casa habíamos dejado en el microondas para que cuando lleguemos esté
preparada.
Veremos también los mecanismos que nos proporcionan las APIs de bajo nivel
para la creación de juegos. Antes de adentrarnos en cada uno de las interfaces es
necesario estudiar algunos conceptos generales que son comunes a ambas.
El paquete javax.microedition.lcdui incluye las clases necesarias para crear
interfaces de usuario, tanto de alto nivel como de bajo nivel. En la Figura 5.1 podemos
ver la organización de estas clases, que son las que estudiaremos en este capítulo.
Vamos a empezar nuestro estudio de estas clases por la clase Display, y así
iremos descendiendo en la jerarquía de clases hasta estudiar cada una en concreto.
5.2.1. La clase Display
public class Display
La clase Display representa el manejador de la pantalla y los dispositivos de
entrada. Todo MIDlet debe poseer por lo menos un objeto Display. En este objeto
Display podemos incluir tantos objetos Displayable como queramos. La clase Display
puede obtener información sobre las características de la pantalla del dispositivo donde
se ejecute el MIDlet, además de ser capaz de mostrar los objetos que componen nuestras
interfaces.
En la Tabla 5.1 podemos ver los métodos incluidos en esta clase
Métodos Descripción
void callSerially(Runnable r) Retrasa la ejecución del método run() del objeto r
para no interferir con los eventos de usuario.
boolean flashBacklight(int duracion) Provoca un efecto de flash en la pantalla.
int getBestImageHeight(int imagen) Devuelve el mejor alto de imagen para un tipo dado.
int getBestImageWidth(int imagen) Devuelve el mejor ancho de imagen para un tipo
dado.
int getBorderStyle(bolean luminosidad) Devuelve el estilo de borde actual.
int getColor(int color) Devuelve un color basado en el parámetro pasado.
Displayable getCurrent() Devuelve la pantalla actual.
static Display getDisplay(MIDlet m) Devuelve una referencia a la pantalla del MIDlet m.
boolean isColor() Devuelve true o false si la pantalla es de color o b/n.
int numAlphaLevels() Devuelve el número de niveles alpha soportados.
int numColors() Devuelve el número de colores aceptados por el
MID.
void setCurrent(Alert a, Displayable d) Establece la pantalla d despues de la alerta a
void setCurrent(Displayable d) Establece la pantalla actual
void setCurrent(Item item) Establece la pantalla en la zona dónde se encuentre
el item
boolean vibrate(int duracion) Realiza la operación de vibración del dispositivo.
Tabla 5.1 Métodos de la clase Display
53
Capítulo 5: Interfaces gráficas de usuario
Como hemos dicho al principio de este punto, todo MIDlet debe poseer al
menos una instancia del objeto Display. Para obtenerla emplearemos el siguiente
código:
Display pantalla = Display.getDisplay(this)
La llamada a este método la realizaremos dentro del constructor del MIDlet.
De esta forma nos aseguramos que el objeto Display esté a nuestra disposición durante
toda la ejecución de éste. Además, dentro del método startApp tendremos que hacer
referencia a la pantalla que queramos que esté activa haciendo uso del método
setCurrent(). Hay que tener en cuenta que cada vez que salimos del método pauseApp,
entramos en el método startApp, por lo que la construcción de las pantallas y demás
elementos que formarán parte de nuestro MIDlet la tendremos que hacer en el método
constructor.
import javax.microedition.midlet.*
import javax.microedition.lcdui.*
public class MiMIDlet extends MIDlet{
Display pantalla;
public MiMIDlet{
pantalla = Display.getDisplay(this);
// Construir las pantallas que vayamos a utilizar en el MIDlet,
// es decir, crear los objetos Displayable.
}
public startApp{
if (pantalla == null)
pantalla.setCurrent(Displayable d);
// d tiene que ser un objeto que derive de la clase Displayable:
// Form, Textbox, …
...
}
public pauseApp{
...
}
public destroyApp{
...
}
}
En el caso de que se entre por primera vez en el método startApp, el valor
de pantalla después de la llamada al método getDisplay() será null. Si no es así, es
porque volvemos del estado de pausa por lo que debemos de dejar la pantalla tal como
está.
5.2.2. La clase Displayable
public abstract class Displayable
La clase Displayable representa a las pantallas de nuestra aplicación.
Como hemos dicho, cada objeto Display puede tener tantos objetos Displayable como
54
Java a Tope. Java 2 Micro Edition
quiera. Como veremos más adelante, nuestras aplicaciones estarán formadas por varias
pantallas que crearemos dentro del método constructor. Mediante los métodos
getCurrent y setCurrent controlamos qué pantalla queremos que sea visible y
accesible en cada momento.
La clase abstracta Displayable incluye los métodos encargados de
manejar los eventos de pantalla y añadir o eliminar comandos. Estos métodos aparecen
en la Tabla 5.2.
Métodos Descripción
void addComand(Command cmd) Añade el Command cmd.
int getHeight() Devuelve el alto de la pantalla.
Ticker getTicker() Devuelve el Ticker (cadena de texto que se
desplaza) asignado a la pantalla.
String getTitle() Devuelve el título de la pantalla.
int getWidth() Devuelve el ancho de la pantalla.
bolean isShown() Devuelve true si la pantalla está activa.
void removeCommand(Command cmd) Elimina el Command cmd.
void setCommandListener(CommandListener l) Establece un listener para la captura de
eventos.
void setTicker(Ticker ticker) Establece un Ticker a la pantalla.
void setTitle(String s) Establece un título a la pantalla.
protected void sizeChanged(int w, int h) El AMS llama a este método cuándo el área
disponible para el objeto Displayable es
modificada.
Tabla 5.2 Métodos de la clase Displayable
5.2.3. Las clases Command y CommandListener
public class Command
Un objeto de la clase Command mantiene información sobre un evento.
Podemos pensar en él como un botón de Windows, por establecer una analogía.
Generalmente, los implementaremos en nuestros MIDlets cuando queramos detectar y
ejecutar una acción simple.
Existen tres parámetros que hay que definir cuando construimos un objeto
Command:
• Etiqueta: La etiqueta es la cadena de texto que aparecerá en la pantalla del
dispositivo que identificará a nuestro Command.
• Tipo: Indica el tipo de objeto Command que queremos crear. Los tipos
que podemos asignarle aparecen en la Tabla 5.3.
Tipo Descripción
BACK Petición para volver a la pantalla anterior
CANCEL Petición para cancelar la acción en curso
EXIT Petición para salir de la aplicación
HELP Petición para mostrar información de ayuda
55
Capítulo 5: Interfaces gráficas de usuario
ITEM Petición para introducir el comando en un “item” en la pantalla
OK Aceptación de una acción por parte del usuario
SCREEN Para Commands de propósito más general
STOP Petición para parar una operación
Tabla 5.3 Tipos de los objetos Command
La declaración del tipo sirve para que el dispositivo identifique el
Command y le dé una apariencia específica acorde con el resto de
aplicaciones existentes en el dispositivo.
• Prioridad: Es posible asignar una prioridad específica a un objeto
Command. Esto puede servirle al AMS para establecer un orden de
aparición de los Command en pantalla. A mayor número, menor prioridad.
Por ejemplo, si queremos crear un objeto Command con la etiqueta “Atras”, de
tipo BACK y prioridad 1 lo haremos de la siguiente manera:
new Command(“Atras”,Command.BACK,1)
La Tabla 5.4 muestra los métodos de la clase Command.
Métodos Descripción
public int getCommandType() Devuelve el tipo del Command.
public String getLabel() Devuelva la etiqueta del Command.
public String getLongLabel() Devuelve la etiqueta larga del Command.
public int getPriority() Devuelve la prioridad del Command.
Tabla 5.4 Métodos de la clase Command
No basta sólo con crear un objeto Command de un determinado tipo para que
realice la acción que nosotros deseamos, de acuerdo a su tipo. Para ello tenemos que
implementar la interfaz CommandListener.
En cualquier MIDlet que incluyamos Commands, tendremos además que
implementar la interfaz CommandListener. Como sabemos, una interfaz es una clase
donde todos sus métodos son declarados como abstract. Es misión nuestra implementar
sus correspondientes métodos. En este caso, la interfaz CommandListener sólo
incluye un método commandAction(Command c, Displayable d) en donde
indicaremos la acción que queremos que se realice cuando se produzca un evento en el
Command c que se encuentra en el objeto Displayable d.
En el siguiente punto veremos más elementos que nos ayudarán a crear
nuestras interfaces de usuario y estudiaremos ejemplos donde podremos ver el uso de
los Commands y de CommandListener.
5.3. La interfaz de usuario de alto nivel
Ya tenemos un concepto general de cómo manejar y controlar las acciones del
usuario a través de objetos Command y de cómo insertar éstos en la pantalla del
dispositivo MID. En este punto vamos a profundizar un poco más en la jerarquía de
clases de la figura 5.1 y vamos a estudiar la clase Screen y todas las subclases
56
Java a Tope. Java 2 Micro Edition
derivadas de ella. Todas estas clases conforman la interfaz de usuario de alto nivel. Por
tanto, vamos a estudiar las APIs de alto nivel y realizaremos al final un ejemplo
recopilatorio donde usaremos todos los elementos que veamos en este punto.
Como decíamos, la clase Screen es la superclase de todas las clases que
conforman la interfaz de usuario de alto nivel:
public abstract class Screen extends Displayable
En la especificación MIDP 1.0 esta clase contenía cuatro métodos que le
permitían definir y obtener el título y el ticker: setTitle(String s), getTitle(),
setTicker(Ticket ticker) y getTicker(). El ticker es una cadena de texto que se
desplaza por la pantalla de derecha a izquierda. En la especificación MIDP 2.0 que es la
más reciente en este momento, estos cuatro métodos han sido incluidos en la clase
Displayable.
5.3.1. La clase Alert
public class Alert extends Screen
El objeto Alert representa una pantalla de aviso. Normalmente se usa cuando
queremos avisar al usuario de una situación especial como, por ejemplo, un error. Un
Alert está formado por un título, texto e imágenes si queremos. Vamos a ver como crear
una pantalla de alerta. Para ello contamos con dos constructores:
Alert(String titulo)
Alert(String titulo, String textoalerta, Image imagen, AlertType tipo)
Además podemos definir el tiempo que queremos que el aviso permanezca en
pantalla, diferenciando de esta manera dos tipos de Alert:
1. Modal: La pantalla de aviso permanece un tiempo indeterminado hasta que
es cancelada por el usuario. Esto lo conseguimos invocando al método
Alert.setTimeOut(Alert.FOREVER).
2. No Modal: La pantalla de aviso permanece un tiempo definido por
nosotros. Para ello indicaremos el tiempo en el método
setTimeOut(tiempo). Una vez finalizado el tiempo, la pantalla de aviso
se eliminará de pantalla y aparecerá el objeto Displayable que nosotros
definamos.
Podemos elegir el tipo de alerta que vamos a mostrar. Cada tipo de alerta tiene
asociado un sonido. Los tipos que podemos definir aparecen en la Tabla 5.5.
Tipo Descripción
ALARM Aviso de una petición previa
CONFIRMATION Indica la aceptación de una acción
ERROR Indica que ha ocurrido un error
INFO Indica algún tipo de información
WARNING Indica que puede ocurrir algún proble
Tabla 5.5 Tipos de alerta
57
Capítulo 5: Interfaces gráficas de usuario
Es posible ejecutar el sonido sin tener que crear un objeto Alert, invocando al
método playSound(Display) de la clase AlertType, por ejemplo:
AlertType.CONFIRMATION.playSound(display)
En el siguiente ejemplo vamos a ver los dos tipos de alerta: modal y no modal.
Vamos a crear un objeto Form donde insertaremos dos comandos. Cada uno de ellos
activará una pantalla de alerta. El código de nuestro ejemplo aparece e acontinuación, y
los resultados visuales en la Figura 5.2.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class EjemploAlerta extends MIDlet implements CommandListener{
Alert alerta1,alerta2;
Command salir, aler1, aler2;
Displayable temp;
Display pantalla;
Form pantallainicial;
public EjemploAlerta(){
// Obtengo la referencia a la pantalla del MIDlet
pantalla = Display.getDisplay(this);
// Creo los objetos que forman las pantallas del MIDlet
salir = new Command("Salir",Command.EXIT,1);
aler1 = new Command("Alerta Modal",Command.SCREEN,1);
aler2 = new Command("Alerta No Modal",Command.SCREEN,1);
// Creo la pantalla de alerta 1
alerta1 = new Alert("Alerta Modal","Esta alerta desaparecerá"+
"cuando pulses el botón de aceptar", null, AlertType.INFO);
// Creo la pantalla de alerta 2
alerta2 = new Alert("Alerta No Modal","Esta alerta desaparecera"+
" cuando pasen 5 segundos”,null,AlertType.INFO);
alerta1.setTimeout(Alert.FOREVER);
alerta2.setTimeout(5000);
// Creo la pantalla principal del MIDlet
pantallainicial = new Form(“Programa principal”);
// Inserto objetos en la pantalla
pantallainicial.addCommand(salir);
pantallainicial.addCommand(aler1);
pantallainicial.addCommand(aler2);
pantallainicial.setCommandListener(this);
}
public void startApp() {
pantalla.setCurrent(pantallainicial);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
58
Java a Tope. Java 2 Micro Edition
public void commandAction(Command c, Displayable d){
if (c == salir){
destroyApp(false);
notifyDestroyed();
}
else if (c == aler1){
pantalla.setCurrent(alerta1,pantallainicial); //Método sobrecargado de
} // la clase Display. Primero muestra un objeto del
else{ //tipo Alert y a continuación un Displayable.
Pantalla.setCurrent(alerta2,pantallainicial);
}
}
}
5.3.2. La clase List
public class List extends Screen implements Choice
La clase List nos va a permitir construir pantallas que poseen una lista de
opciones. Esto nos será muy útil para crear menús de manera independiente. La clase
List implementa la interfaz Choice y esto nos va a dar la posibilidad de crear 3 tipos
distintos de listas cuyo tipo están definidos en esta interfaz (Tabla 5.6).

Tipo Descripción
EXCLUSIVE Lista en la que un sólo elemento puede ser seleccionado a la vez.
IMPLICIT Lista en la que la selección de un elemento provoca un evento.
MULTIPLE Lista en la que cualquier número de elementos pueden ser
seleccionados al mismo tiempo.
 

5.3.3. La clase TextBox
public class TextBox extends Screen
Una TextBox es una pantalla que nos permite editar texto en ella. Cuando
creamos una TextBox, tenemos que especificar su capacidad, es decir, el número de
64
caracteres que queremos que albergue cómo máximo. Esta capacidad puede ser mayor
que la que el dispositivo puede mostrar a la vez. En este caso, la implementación
proporciona un mecanismo de scroll que permite visualizar todo el texto. Hemos de
tener en cuenta que la capacidad devuelta por la llamada al constructor de clase puede
ser distinta a la que habíamos solicitado. De cualquier forma, el método getMaxSize()
devuelve la capacidad máxima que permite un TextBox ya creado.
Podemos también poner restricciones al texto que se puede incluir en una
TextBox. Estas restricciones se encuentran en la clase TextField, íntimamente
relacionada con Textbox como veremos más adelante, y se detallan en la Tabla 5.8.
Valor Descripción
ANY Permite la inserción de cualquier carácter.
CONSTRAINT_MASK Se usa cuándo necesitamos determinar el valor actual
de las restricciones
EMAILADDR Permite caracteres válidos para direcciones de correo
electrónico.
NUMERIC Permite sólo números.
PASSWORD Oculta los caracteres introducidos mediante una
máscara para proporcionar privacidad.
PHONENUMBER Permite caracteres válidos sólo para números de
teléfono
URL Permite caracteres válidos sólo para direcciones URL.
Tabla 5.8 Restricciones de entrada de caracteres
Ya tenemos todo lo necesario para crear cualquier tipo de TextBox. La llamada
al constructor la realizaríamos de la siguiente manera:
TextBox(String titulo, String texto, int tamaño, int restricciones)

Por ejemplo, si invocamos al constructor de la siguiente forma:
TextBox cajatexto = new TextBox(“Contraseña”,””,30,
TextField.NUMERIC | TextField.PASSWORD)
65
Capítulo 5: Interfaces gráficas de usuario
obtendremos una TextBox que sólo acepta números y además no los muestra por
pantalla al ponerle la restricción PASSWORD (ver Figura 5.4).
La clase TextBox contiene los métodos que se indican en la Tabla 5.9.
Métodos Descripción
void delete(int desplazamiento, int longitud) Borra caracteres del TextBox.
int getCaretPosition() Devuelve la posición del cursor en pantalla.
int getChars(char[] datos) Copia el contenido del TextBox en datos.
int getConstraints() Devuelve las restricciones de entrada.
int getMaxSize() Devuelve el tamaño máximo del TextBox.
String getString() Devuelve el contenido del TextBox.
void insert(char[] datos, int des, int long, int pos) Inserta un subrango de caracteres de datos
en el TextBox.
void insert(char[] datos, int pos) Inserta la cadena de caracteres datos en una
posición determinada.
void setChars(char[] datos, int des, int long) Reemplaza el contenido del TextBox por un
subconjunto de caracteres de datos.
void setConstraints(int restricciones) Establece las restricciones de entrada.
void setInitialInputMode(String caracteres) Establece un tipo de entrada inicial.
int setMaxSize(int capacidad) Establece el tamaño máximo del TextBox.
void setString(String texto) Establece el contenido del TextBox.
int size() Devuelve el número de caracteres.
Tabla 5.9 Métodos de la clase TextBox
5.3.4. La clase Form
public class Form extends Screen
Un formulario (clase Form) es un componente que actúa como contenedor de
un número indeterminado de objetos. Todos los objetos que puede contener un
formulario derivan de la clase Item.
El número de objetos que podemos insertar en un formulario es variable pero,
teniendo en cuenta el tamaño de las pantallas de los dispositivos MID, se recomienda
que se número sea pequeño para evitar así el scroll que se produciría si insertáramos
demasiados objetos en un formulario.
Para referirnos a los Items o componentes de un formulario usaremos unos
índices, siendo 0 el índice del primer Item y Form.size()-1 el del último. El método
size() nos devuelve el número de Items que contiene un formulario.
Un mismo Item no puede estar en más de un formulario a la vez. Si, por
ejemplo, deseamos usar una misma imagen en más de un formulario, deberemos borrar
esa imagen de un formulario antes de insertarla en el que vamos a mostrar por pantalla.
Si no cumplimos esta regla, se lanzaría la excepción IllegalStateException.
La Tabla 5.10 muestra los métodos de la clase Form.
66
Métodos Descripción
Int append(Image imagen) Añade una imagen al formulario.
int append(Item item) Añade un Item al formulario.
int append(String texto) Añade un String al formulario.
void delete(int num) Elimina el Item que ocupa lo posición num.
void deleteAll() Elimina todos los Items del formulario.
Item get(int num) Devuelve el Item que se encuentra en la
posición num.
int getHeight() Devuelve la altura en pixels del área disponible
(sin realizar scroll) para los Items.
int getWidth() Devuelve la anchura en pixels del área
disponible (sin realizar scroll) para los Items.
void insert(int num, Item item) Inserta un Item justo antes del que ocupa la
posición num.
void set(int num, Item item) Reemplaza el Item que ocupa la posición num.
void
setItemStateListener(ItemStateLis
tener listener)
Establece un ‘listener’ que captura los eventos
que produzcan cualquier Item del formulario.
int size() Devuelve el número de Items del formulario.
Tabla 5.10 Métodos de la clase Form
5.3.4.1. Manejo de Eventos
El manejo de eventos de un formulario se hace de manera muy similar al de los
Commands. Es necesario implementar la interfaz ItemStateListener que contiene un
solo método abstracto itemStateChanged(Item item). Cuando realizamos algún tipo
de acción en un Item de un formulario, ejecutamos el código asociado a ese Item que
definamos en el método itemStateChanged(Item item) de igual forma que hacíamos
con el método commandAction(Command c, Displayable d) cuando manejamos
Commands.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class ManejoItems extends MIDlet implements ItemStateListener,
CommandListener{
Display pantalla;
Form formulario;
TextField txt;
Command salir;
public ManejoItems(){
pantalla = Display.getDisplay(this);
formulario = new Form("");
txt = new TextField("Introduce datos","",70,TextField.ANY);
salir = new Command("Salir",Command.EXIT,1);
67
formulario.append(txt);
formulario.addCommand(salir);
formulario.setItemStateListener(this);
formulario.setCommandListener(this);
}
public void startApp() {
pantalla.setCurrent(formulario);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command c, Displayable d){
if (c == salir){
destroyApp(false);
notifyDestroyed();
}
}
public void itemStateChanged(Item i){
if (i == txt){
System.out.println("Evento detectado en el TextBox");
}
}
}
En este ejemplo hemos insertado un objeto TextField que deriva de la clase
Item, y cada vez que insertamos texto en el TextField mostramos un mensaje por la
consola de salida en la que informamos que se ha producido un evento. Además de
TextField los Item que podemos insertar en un formulario son: StringItem, ImageItem,
DateField, ChoiceGroup y Gauge. Todos ellos los veremos a continuación.
5.3.4.2. La Clase StringItem
public class StringItem extends Item
La clase StringItem es la clase más simple que deriva de Item. Simplemente es
una cadena no modificable de texto, es decir, una cadena de texto con la que el usuario
no puede interactuar de ninguna manera. Para construir un StringItem haremos uso de
cualquiera de sus dos constructores:
StringItem(String etiqueta, String texto)
StringItem(String etiqueta, String texto, int apariencia)
donde:
• etiqueta – es la etiqueta del Item.
68
• texto – es el texto que contiene el Item
• apariencia – es la apariencia del texto: Item.PLAIN, Item.HYPERLINK,
Item.BUTTON.
Invocar al primer constructor es lo mismo que hacer la llamada:
StringItem(etiqueta, texto, Item.PLAIN).
Los métodos que posee la clase StringItem aparecen en la Tabla 5.11, y su
apariencia en la Figura 5.5.
Métodos Descripción
int getAppearanceMode() Nos devuelve la apariencia del texto
Font getFont() Nos devuelve la Fuente del texto
String getText() Nos devuelve el texto del StringItem
void setFont(Font fuente) Establece la Fuente del texto.
void setText(String texto) Establece el texto del StringItem
Tabla 5.11 Métodos de la clase StringItem
Figura 5.5 Apariencia de un StringItem
5.3.4.3. La clase ImageItem
public class ImageItem extends Item
La clase ImageItem nos da la posibilidad de incluir imágenes en un formulario.
Al igual que la clase StringItem, el usuario no podrá interactuar con la imagen.
Para crear un objeto ImageItem haremos uso de uno de sus dos constructores:
ImageItem(String etiqueta, Image imagen, int layout, String textoalt)
ImageItem(String etiqueta, Image imagen, int layout, String textoalt, int
apariencia)
El parámetro textoalt especifica una cadena de texto alternativa a la imagen en
caso de que ésta exceda la capacidad de la pantalla. Por su parte, el parámetro layout
indica la posición de la imagen en la pantalla. Los valores que puede tomar este
parámetro aparecen en la Tabla 5.12.
Valor Descripción
LAYOUT_LEFT Imagen posicionada a la izquierda
69
LAYOUT_RIGHT Imagen posicionada a la derecha
LAYOUT_CENTER Imagen centrada
LAYOUT_DEFAULT Posición por defecto
LAYOUT_NEWLINE_AFTER Imagen posicionada tras un salto de línea
LAYOUT_NEWLINE_BEFORE Imagen posicionada antes de un salto de línea
Tabla 5.12 Valores que puede tomar el parámetro layout
Los métodos de la clase ImageItem podemos verlos en la Tabla 5.13.
Métodos Descripción
String getAltText() Nos devuelve la cadena de texto alternativa.
Int getAppearanceMode() Nos devuelve la apariencia
Image getImage() Nos devuelve la imagen
Int getLayout() Nos devuelve el posicionado de la imagen
void setAltText(String textoalt) Establece un texto alternativo
void setImage(Image imagen) Establece una nueva imagen
void setLayout(int layout) Establece un nuevo posicionado en pantalla
Tabla 5.13 Métodos de la clase ImageItem
5.3.4.4. La clase TextField
public class TextField extends Item
Un TextField es un campo de texto que podemos insertar en un formulario y
dónde podemos editar texto. Ya hemos visto algo muy parecido cuándo estudiamos la
clase TextBox. Las diferencias entre ambas son:
• Un TextField tiene que ser insertado en un formulario, mientras que un
TextBox puede implementarse por sí mismo.
• TextField deriva de la clase Item, mientras que TextBox deriva
directamente de Screen, y sus eventos los controlamos a través de
Commands. Por esta razón, los eventos que produce un TextField los
controlamos a través del método itemStateChanged(Item item),
mientras que en un TextBox los controlamos en el método
commandAction(Command c, Displayable d).
Sin embargo, ambas clases comparten las restricciones de entrada que veíamos
en la Tabla 5.8.
Para crear un TextField sólo hay que invocar al constructor con los siguientes
parámetros:
TextField(String etiqueta, String texto, int capacidad, int restricciones)
Otros métodos de esta clase pueden verse en la Tabla 5.14.
Métodos Descripción
void delete(int desplazamiento, int longitud) Borra caracteres del TextField.
int getCaretPosition() Devuelve la posición del cursor en pantalla.
int getChars(char[] datos) Copia el contenido del TextField en datos.
70
int getConstraints() Devuelve las restricciones de entrada.
int getMaxSize() Devuelve el tamaño máximo del TextField.
String getString() Devuelve el contenido del TextField.
void insert(char[] datos, int des, int long, int pos) Inserta un subrango de caracteres de datos en
el TextField.
void insert(char[] datos, int pos) Inserta la cadena de caracteres datos en una
posición determinada.
void setChars(char[] datos, int des, int long) Reemplaza el contenido del TextField por un
subconjunto de caracteres de datos.
void setConstraints(int restricciones) Establece las restricciones de entrada.
void setInitialInputMode(String caracteres) Establece un tipo de entrada inicial.
int setMaxSize(int capacidad) Establece el tamaño máximo del TextField.
void setString(String texto) Establece el contenido del TextField.
int size() Devuelve el número de caracteres.
Tabla 5.14 Métodos de la clase TextField
5.3.4.5. La clase DateField
public class DateField extends Item
El componente DateField nos permite manejar fechas y horas en nuestro
formulario. Para ello, hace uso de la clase java.util.Date ya que es con este objeto con
el que trabaja.
Cuando creamos un objeto DateField, podemos definir si queremos que el
usuario edite la fecha, la hora o ambas. Esto lo hacemos de la siguiente manera:
DateField(String etiqueta, int modo)
donde modo puede ser DATE, TIME o DATE_TIME.
También podemos realizar la invocación al constructor de la siguiente manera:
DateField(String etiqueta, int modo, java.util.TimeZone zonahoraria)
El siguiente código nos muestra como crear un componente DateField que, a
partir de la hora actual nos permita insertar la fecha y hora que deseemos. El aspecto del
objeto DateField depende del dispositivo MID dónde lo ejecutemos, aunque suele ser
muy vistoso:
Date fechaactual = new Date(); // Creo un objeto Date con fecha actual
DateField fecha = new DateField(“Fecha”,DateField.DATE_TIME);
fecha.setDate(fechaactual); // Establezco en el objeto la fecha actual
Ya sólo nos queda insertar el componente fecha en un formulario y podremos
seleccionar la fecha y hora que deseemos. El resultado visual puede apreciarse en la
Figura 5.6.
71

 

SIGUIENTE

Psend kept free because of these great sponsors.a..

Other Sponsors

electrical connectors, Mangosteen Juice, real estate short sale, Jupiter FL real estate,

Furniture Markdown

Great Deals on furniture - Free Shipping!
Discount Furniture
Daybeds
Metal Beds
Platform Beds
Futons

Y-Net Wireless Internet

Denver area high speed wireless privider.
Colorado High Speed Internet, Wireless Internet Denver, VOIP Denver CO, T1 provider Denver, Denver Wireless ISP , Denver Internet Access,

Dog House Technologies

Doghouse Techonologies is located in Tampa Bay FL and offer professional web design, ecommerce development and custom application design for the internet.
Tampa Bay Web Design, E-Commerce Web Design, Tampa Bay Search Engine Marketing, Tampa Web Hosting, Florida Web Design, Custom Application Development, Search Engine Optimization,