Professional Documents
Culture Documents
Aplicaciones
Móviles I
2
ÍNDICE
Presentación 3
Red de contenidos 5
UNIDAD 1
SEMANA 1 : Java2 Micro Edition 7
SEMANA 2 : Manejo de Midlets 21
UNIDAD 2
SEMANA 3 : Interfaces de usuario 35
SEMANA 4 : Manejo de ventanas 49
SEMANA 5 : Manejo de listas 61
SEMANA 6 : Controles adicionales 71
SEMANA 9 : Manejo de formularios 79
SEMANA 10 : Manejo de controles Item 97
UNIDAD 3
SEMANA 11 : Almacenamiento se datos 111
SEMANA 12 : Manejo avanzado de datos 1 125
SEMANA 13 : Manejo avanzado de datos 2 137
SEMANA 14 : Introducción a las comunicaciones 149
PRESENTACIÓN
RED DE CONTENIDOS
Introducción Almacenamiento
a J2ME de Datos
Interfaz de
usuario Básico Avanzado Conectividad
J2ME MIDlets
UNIDAD DE
APRENDIZAJE
1
SEMANA
TEMARIO
• Introducción a J2ME
• Máquina virtual KVM, configuraciones y perfiles
• Sistemas operativos para móviles
• El AMS, el ciclo de vida de un MIDlet
• Estados de un MIDlet y su estructura básica
ACTIVIDADES PROPUESTAS
INTRODUCCION A J2ME
1.1. Introducción a las tecnologías móviles
1.2.1 Historia
La tecnología Java se creó como una herramienta de programación para
ser usada en un proyecto de Sun Microsystems en el año 1991. En un
principio fue diseñado para generar aplicaciones que controlaran
electrodomésticos.
Con la llegada de Internet Java2 obtiene gran difusión. Esto se produce
debido a su gran robustez e independencia de la plataforma donde se
ejecutase el código, lo cual lo hace ideal para la creación de componentes
interactivos integrados en páginas Web y programación de aplicaciones
independientes. Estos componentes se denominaron applets. Con los años,
Java ha progresado enormemente en varios ámbitos, e hizo necesaria la
creación de diferentes ediciones, cada una de ellas orientadas a algún tipo de
aplicación en particular.
La edición Java2 Micro Edition fue presentada en 1999 por Sun
Microsystems, orientada al desarrollo de aplicaciones para dispositivos
pequeños. Su primera versión estaba orientada al desarrollo sobre Palms. Es
1.2.2 Características
Algunas de las características de la tecnología Java2, y que han sido en
buena parte la razón de su gran difusión, se indican a continuación:
• Orientado a objetos.
Al programar en Java se pueden usar las clases existentes, derivar otras
clases a partir de las primeras y crear nuevas clases.
• Portable.
Las aplicaciones java2 se ejecutarán sobre cualquier sistema que tenga
instalado una máquina virtual java. No dependen de un hardware sistema
operativo en particular.
• Interpretado.
La ejecución de una aplicación Java2 es realizada por la máquina virtual,
instrucción por instrucción.
• Robusto.
La forma en que se diseño la arquitectura de Java2 hace que los errores
graves sean menos frecuentes.
1.2.3 Ediciones
Existen varias ediciones de Java, cada una de ellas diseñada para cierto
ambiente en particular, tal como se indica en la figura 1.1.
• Java Standard Edition (J2SE)
Es la edición que se emplea para desarrollar aplicaciones de escritorio,
así como applets. Es también la versión que base para las demás
ediciones.
• Java Entreprise Edition (J2EE)
Es la edición que se emplea para desarrollar aplicaciones distribuidas,
tales como aplicaciones Web o servlets. Incluye a la edición estándar.
Java 2
Enterprise
Edition
Java 2 TV Auto
Kilo Virtual Machine
Standard Profile Profile
Edition
Java 2
Micro Edition
Java 2
Micro Edition Smart
Card
Profile
Card VM
HotSpot CVM KVM
Figura 1.1: Ediciones de Java2
javax.microedition.*
J2EE
J2SE
J2ME
• Java Card
Es la versión de Java enfocada a aplicaciones que se ejecutan en “tarjetas
inteligentes” (smart cards), encontradas en equipos móviles, tarjetas de
crédito, etc. Es una versión muy limitada de Java.
2. ARQUITECTURA DE J2ME
2.3. Configuración
2.4. Perfiles
El perfil es el que define las APIs que controlan el ciclo de vida de la aplicación,
interfaz de usuario, etc. Más concretamente, un perfil es un conjunto de APIs
orientado a un ámbito de aplicación determinado. Los perfiles identifican un grupo
de dispositivos por la funcionalidad que proporcionan, por ejemplo,
electrodomésticos, teléfonos móviles, etc. y el tipo de aplicaciones que se
ejecutarán en ellos. Las librerías de la interfaz gráfica son un componente muy
importante en la definición de un perfil. Aquí podemos encontrar grandes
diferencias entre interfaces, desde el menú textual de los teléfonos móviles hasta
los táctiles de los PDAs.
2.6. Limitaciones
El presente manual está orientado al desarrollo en J2ME usando las clases del
perfil MIDP sobre la configuración CLDC. Para este tipo de desarrollo, existen
limitaciones en comparación con la programación en J2SE, que se especifican a
continuación:
• En la version CLDC1.0 no hay soporte para tipos en coma flotante. No
existen, por tanto, los tipos double ni float. Esta limitación está presente
porque los dispositivos carecen del hardware necesario para estas
operaciones. A partir de la versión CLDC 1.1, esta característica está
soportada.
• No existe soporte para JNI (Java2 Native Interface) debido a los recursos
limitados de memoria.
3. Proceso de desarrollo
3.2.1 Consideraciones
Para realizar un desarrollo en J2ME, específicamente en MIDP/CLDC,
se deben contar con las siguientes aplicaciones:
• Editor de código
• Preverificador
• Compilador
• Emulador
• Servidor Web Internet, del cual descargar las aplicaciones
Este último puede ser reemplazado por cualquier mecanismo de transferencia
de archivos actualmente disponibles en los dispositivos móviles (Bluetooth,
Infrarrojo, cable de datos, etc.), pero con algunas limitaciones dependientes
del modelo del equipo y con la desventaja que no se podría realizar una
instalación masiva.
Existen herramientas que integran varias de estas aplicaciones. Sun
Microsystems proporciona una que, si bien no es la única, es ampliamente
utilizada. Esta herramienta se denomina Sun Java Wireless Toolkit (SJWTK),
y cumple algunos de los requerimientos. Diversos editores de código, como
Eclipse o Netbeans, han creado librerías adicionales o plug-ins basadas en
SJWT, que proporcionan las herramientas faltantes.
http://java.sun.com/products/sjwtoolkit/download.html
3.2.3 Eclipse
Eclipse es una de las herramientas mas usadas para el desarrollo de
aplicaciones móviles con Java 2 Micro Edition. Como se indicó anteriormente,
existen paquetes adicionales o plug-ins que se basan en SJWTK y que
proporcionan las herramientas para la edición y depuración de código. Entre
los más conocidos están:
• Mobile Toolkit por Java2 applications
• Eclipse ME (http://eclipseme.org)
3.2.4 Netbeans
Al igual que Eclipse, Netbeans posee un paquete adicional, denominado
Mobility Pack, basado en SJWTK y que proporcionan las herramientas para la
edición y depuración de código.
3.2.5 Instalación
Los pasos para la instalación son:
1. Instalar JSDK 1.5;
2. Instalar Sun Java Wireless Toolkit 2.5;
3. Instalar la herramienta escogida para la edición de código. Esto es
independiente del paso 2;
4. Instalar el plug-in correspondiente;
5. Configura el plug-in para que utilice el SJWTK instalador en el paso 2.
Resumen
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
http://www.mailxmail.com/curso/informatica/dispositivosinalambricos
http://www.mailxmail.com/curso/informatica/j2me
http://www.it.uc3m.es/java/
http://programacion.com/java/tutorial/ags_j2me/
Si desea descargar las herramientas de programación, puede ir a las siguientes
páginas:
SJWTK: http://java.sun.com/products/sjwtoolkit/download.html
Eclipse ME: http://eclipseme.org
UNIDAD DE
APRENDIZAJE
1
SEMANA
MANEJO DE MIDLETS
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
MIDlets
3.3. Definición
3.4. Elementos
3.4.2 Descriptor
Es el archivo de texto plano con extensión jad. Contiene diversos datos
que son leídos por el gestor de aplicaciones al momento de descargar el
MIDlet. Revisar el capítulo siguiente para más detalles acerca del gestor de
aplicaciones. Los datos guardados pueden ser obligatorios y opcionales, y
adicionalmente se pueden agregar datos personalizados de la aplicación
• Datos obligatorios
o MIDlet-Name: Nombre del MIDlet
o MIDlet-Version: Versión del MIDlet
o MIDlet-Vendor: Nombre del vendedor
o MIDlet-Jar-URL: URL del sitio donde se descarga el MIDlet.
o MIDlet-Jar-Size: Tamaño del archivo jar
o MicroEdition-Profile: Nombre y version del perfil
o MicroEdition-Configuration: Nombre y version de la configuración
Nota:
Se utiliza el término MIDlet suite para referirse a los dos archivos, MIDlet jar y
descriptor, especialmente cuando contienen varias clases de tipo MIDlet.
4. Gestor de aplicaciones
4.1. Introducción
Para que todo aplicativo pueda ser instalado y funcione en un dispositivo móvil,
éste debe contar con ciertas características tanto en hardware como en software.
En cuanto al hardware, el equipo debe contar con los siguientes elementos:
• Un procesador, que es el que se va encargar de administrar los diferentes
accesorios del dispositivo celular;
• Una cantidad de memoria para el manejo de los procesos del sistema
operativo y aplicaciones. Cabe resaltar que esta memoria se divide en una
memoria tipo RAM, que es donde se ejecutan las aplicaciones, y una
memoria tipo ROM, en la cual se almacena parte de las aplicaciones que
contiene el dispositivo móvil.
• Además de poder tener una gran capacidad de batería.
En cuanto los requerimientos de software, el dispositivo debe contar con una
aplicación dentro del sistema operativo que sea el encargado de manejar las
aplicaciones. A dicha aplicación se le denomina gestor de aplicaciones.
4.2. Definición
4.3.1 Localización:
Es la fase en la que el aplicativo es localizado para ser instalado en el
dispositivo celular. Dicha localización se realiza por cualquiera de los medios
de instalación usados, como cable de datos, infrarrojo, Bluetooth y OTA.
4.3.2 Instalación:
Es la fase en el cual el MIDlet es instalado en el equipo.
4.3.3 Ejecución:
Es la fase en la cual el MIDlet es activado para su ejecución. El AMS se
encarga de cargar la aplicación y los elementos que implica para la ejecución,
como la máquina virtual.
4.3.4 Actualización:
Es la fase en el cual el MIDlet es actualizado en el equipo.
4.3.5 Borrado:
Es la fase en el cual el MIDlet es eliminado del equipo.
• En primer lugar, el AMS crea una nueva instancia del MIDlet y realiza la
llamada a su constructor, pasando éste al estado de “Pausa” durante un
corto período de tiempo que es utilizado por el AMS para cargar en
memoria el MIDlet y algunos recursos asociados.
• Cuándo el dispositivo está preparado para ejecutar el MIDlet, el AMS
invoca al método MIDlet.startApp() y pasa al estado de “Activo”. El MIDlet,
entonces, ocupa todos los recursos que necesita para su ejecución.
• Durante el estado “Activo”, el MIDlet puede pasar al estado de “Pausa” por
una acción del usuario, o bien, por el AMS (por ejemplo, por el ingreso de
una llamada telefónica) que reduciría, en todo lo posible, el uso de los
recursos del dispositivo por parte del MIDlet.
• Tanto en el estado “Activo” como en el de “Pausa”, el MIDlet puede pasar
al estado “Destruido” realizando una llamada al método
MIDlet.destroyApp(). Esto puede ocurrir porque el MIDlet haya finalizado
su ejecución o porque una aplicación prioritaria necesite ser ejecutada en
memoria en lugar del MIDlet. Una vez destruido el MIDlet, éste libera todos
los recursos ocupados.
5. Estructura básica
Un MIDlet es una aplicación realizada usando el perfil MIDP; por lo tanto, para
crear una aplicación con estas características se debe realizar lo siguiente:
• Crear una clase que herede de la clase javax.microedition.midlet.MIDlet, para
que el AMS pueda gestionar sus estados y tener acceso a sus propiedades;
• Sobrescribir los métodos que el MIDlet posee, que son: startApp, pauseApp y
destroyApp.
Asimismo, tomar en cuenta las siguientes observaciones:
• Los MIDlets, al igual que los applets carecen de la función main(). Aunque
existiese, el gestor de aplicaciones la ignoraría por completo.
• Un MIDlet no puede realizar una llamada a System.exit(). Una llamada a este
método lanzaría la excepción SecurityException.
La estructura básica de un MIDlet quedaría como sigue:
import javax.microedition.midlet.*;
6. Clase MIDlet
6.1. Constructor
Método que posee el mismo nombre de la clase sin argumentos. Aquí se pone
el código que se ejecutará al inicio de la aplicación. Si la llamada a este
constructor falla, se lanzaría la excepción SecurityException.
6.2. pauseApp()
6.2.1 Definición
protected abstract void pauseApp()
6.2.2 Descripción
Método que será llamado por el AMS cuando el MIDlet pasa a un
estado de “Pausa”. Para esto, el MIDlet debe estar en estado “Activo”.
Cuando se crea un MIDlet, este método debe ser sobrescrito para indicar lo
que se realizará cuando se produzca dicho cambio de estado, por ejemplo,
grabar algún dato en la memoria persistente. Si ocurre una excepción
RuntimeException durante la llamada a MIDlet.pauseApp(), el MIDlet será
destruido inmediatamente. Se llamará a su método MIDlet.destroyApp() para
liberar los recursos ocupados.
6.3. startApp()
6.3.1 Definición
protected abstract void startApp()
throws MIDletstateChangeException
6.3.2 Descripción
Método que será llamado por el AMS cuando el MIDlet pasa a un
estado “Activo”. Para esto el MIDlet debe estar en estado de “Pausa”. Cuando
se crea un MIDlet, este método debe ser sobrescrito para indicar lo que se
realizará cuando se produzca dicho cambio de estado, por ejemplo, mostrar
la ventana inicial. En el caso de que el MIDlet no pueda pasar al estado
“Activo” en este momento pero si pueda hacerlo en un momento posterior, se
lanzaría la excepción MIDletstateChangeException.
6.4. destroyApp()
6.4.1 Definición
protected abstract void (boolean incondicional)
throws MIDletstateChangeException
6.4.2 Descripción
Método que será llamado por el AMS cuando el MIDlet pasa a un
estado “Destruido”. Para esto el MIDlet debe estar en estado de “Pausa” o
“Activo”. Cuando se crea un MIDlet, este método debe ser sobrescrito para
indicar lo que se realizará cuando se produzca dicho cambio de estado, por
ejemplo, liberar todos los recursos y/o salvar en el almacenamiento
persistente algún dato que que deba ser guardado.
Si el parámetro ‘incondicional’ es false, el MIDlet puede lanzar la
excepción MIDletstateChangeException para indicar que no puede ser
6.5. notifyDestroyed()
6.5.1 Definición
public final void notifyDestroyed()
6.5.2 Descripción
Este método es usado para indicar al AMS que el MIDlet ha entrado en
el estado de “Destruido”. Normalmente, se llama este método después de
haber llamado a destroyApp(). El AMS considerará que todos los recursos
que ocupaba el MIDlet están libres para su uso.
6.6. notifyPaused()
6.6.1 Definición
public final void notifyPaused()
6.6.2 Descripción
Este método es usado para indicar al AMS que el MIDlet ha entrado en
el estado de “Pausa”. Este método sólo debe ser invocado cuándo el MIDlet
esté en el estado “Activo”. Para volver al estado “Activo” se deberá llamar al
método resumeRequest().
6.7. resumeRequest()
6.7.1 Definición
public final void resumeRequest()
6.7.2 Descripción
Este método proporciona un mecanismo a los MIDlets para indicar al
AMS su cambio de estado a “Activo”. El AMS, en consecuencia, es el
encargado de determinar qué aplicaciones han de pasar a este estado
llamando al método startApp().
Nota:
Los métodos startApp(), pauseApp() y destroyApp() los utiliza el AMS para
comunicarse con el MIDlet, mientras que los métodos resumeRequest(),
notifyPaused() y notifyDestroyed() los utiliza el MIDlet para comunicarse con el
AMS.
6.8. checkPermission()
6.8.1 Definición
public final int checkPermission(String permiso)
6.8.2 Descripción
Devuelve el estado de un permiso para la aplicación. El permiso se
especificado en el parámetro del mismo nombre. A continuación algunos
ejemplos de permisos:
• javax.wireless.messaging.sms.send: Permiso para enviar mensajes de
texto de tipo SMS
• javax.microedition.pim.ContactList.read: Permiso para leer la agenda de
contactos
• javax.microedition.io.Connector.bluetooth.client: Permiso para conectarse
como cliente a través de Bluetooth
Los valores devueltos por el método se corresponden con la siguiente
descripción:
• 0: si el permiso ha sido denegado
• 1: si el permiso ha sido habilitado
• -1: si el estado es desconocido
Usando este método podemos verificar con anterioridad si el usuario ha
autorizado a la aplicación a realizar ciertos servicios. De este modo, se podrá
realizar algún tipo de notificación al usuario.
6.9. getAppProperty()
6.9.1 Definición
public final String getAppProperty(String key)
6.9.2 Descripción
Este método devuelve el valor de una propiedad guardada en el
descriptor. El nombre de la propiedad a recuperar debe ir indicado en el
parámetro key. El método nos devuelve un String con el valor de la propiedad
o null si no existe ningún valor asociado al parámetro key. Si key es null, se
lanzará la excepción NullPointerException.
6.10. platformRequest()
6.10.1 Definición
public void boolean platformRequest(String url)
6.10.2 Descripción
Este método permite llamar a algún servicio proporcionado por el
dispositivo. Dicho servicio se especifica en el parámetro url, y varían de
acuerdo al modelo del mismo.
7. Ejemplos
7.1.1 Enunciado
Construir una aplicación que realice lo siguiente:
• Mostrar una ventana con el mensaje “Bienvenido a J2ME”
• Tendrá un botón para salir de la aplicación.
• La figura 5-1 indica como deberá verse la pantalla.
7.1.2 Código
/*
*Importar espacios de nombres
*javax.microedition.midlet: Aquí están el MIDlety clases relacionadas
*javax.microedition.lcdui: Aqui están las clases de la interfaz de usuario
**/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public HolaMundo()
{
// Inicializacion de variables
pantalla = Display.getDisplay(this);
botonSalir = new Command("Salir", Command.EXIT, 2);
formulario = new Form("Hola");
StringItem texto = new StringItem(" ", "Bienvenido a J2ME");
7.2.1 Enunciado
Construir una aplicación que realice lo siguiente:
• Permita ingresar un número telefónico en formato internacional. Para esto
se usará un control TextBox, cuyo valor inicial será la propiedad “prefijo”
(que debe ser creada en el descriptor).
• El título de la ventana indicará si la aplicación tiene o no el permiso de
envío de mensajes.
• Tendrá dos botones: uno para salir y otro para realizar la llamada usando
el método platformRequest().
• La figura 5-1 indica como deberá verse la pantalla.
7.2.2 Código
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
/*
Esta aplicación utiliza algunas funciones de la clase MIDlet, como
- getAppProperty: Para obtener el valor de una propiedad
- checkPermission: Para verificar el estado de un permiso
- platformRequest: Para efecutar una llamada a una funcion del equipo, en este
caso, para realizar una llamada telefonica
- notifyDestroyed: Para salir de la aplicacion
Algunas partes del codigo aun no han sido explicadas. Se recomienda no
detenerse alli, pues en las semanas siguientes se explicaran a detalle.
*/
// Se realiza lo siguiente:
// 1. Obtener una referencia a la pantalla
// 2. Crear una ventana de texto
// 3. Crear dos comandos
private Display dsp = Display.getDisplay(this);
private TextBox txtTelefono = new TextBox("Telefono", "", 13,
TextField.PHONENUMBER);
private Command cmdLlamar = new Command("Llamar", Command.OK, 2);
private Command cmdSalir = new Command("Salir", Command.EXIT, 2);
public Llamada()
{
// Se lee la variable “prefijo” del descriptor
if(getAppProperty("prefijo") != null)
txtTelefono.setString(getAppProperty("prefijo"));
if (permiso == 0)
txtTelefono.setTitle("SMS no permitidos");
else if (permiso == 1)
txtTelefono.setTitle("SMS permitidos");
else
txtTelefono.setTitle("SMS no configurado");
Resumen
Para construir un MIDlet, el paso inicial es crear una clase que herede de la clase
MIDlet y sobrescribir los métodos startApp(), pauseApp() y destroyApp().
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
http://www.mailxmail.com/curso/informatica/j2me
http://programacion.com/java/tutorial/ags_j2me/
http://leo.ugr.es/J2ME/MIDP/enlaces.htm
http://java.sun.com/javame/reference/apis/jsr118/
UNIDAD DE
APRENDIZAJE
2
SEMANA
INTERFACES DE USUARIO
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
• Crea la aplicación que se indica en el punto 4, que muestra una ventana con las
propiedades de la pantalla.
Las interfaces de usuarios se refieren a las clases que van a gestionar el manejo
de la pantalla de los dispositivos móviles. Para ello, J2ME define 2 tipos de interfaces,
con las cuales el desarrollador puede generar las pantallas que interactuarán con el
usuario final.
Aquí se tiene control total de toda la pantalla del dispositivo móvil ya que se
dará un control completo sobre los recursos del dispositivo y podremos controlar
eventos de bajo nivel como, por ejemplo, el rastreo de pulsaciones de teclas.
Como contraparte, las aplicaciones construidas con esta interfaz son menos
portables. Generalmente, esta interfaz se utiliza para la creación de juegos donde
el control sobre lo que aparece por pantalla y las acciones del usuario juegan un
papel fundamental.
2. Manejo de la pantalla
2.1.1 Definición
Esta clase es la que se encarga de controlar y administrar la pantalla del
dispositivo móvil, proporcionando los métodos que permitirán obtener
propiedades de la pantalla o realizar algunos cambios de estado, por ejemplo,
saber la cantidad de colores de la pantalla, si la pantalla maneja colores o es
monocromática, tamaño, producir efectos de iluminación, etc.
La clase Display no posee un constructor. En lugar de eso, tiene la
función estática getDisplay() que permite obtener una referencia a la pantalla
actual.
2.1.2 Métodos
• getDisplay()
o Definición
public static Display getDisplay(MIDlet m)
o Descripción
Devuelve una referencia a la pantalla. La variable m es una
referencia al MIDlet que se está ejecutando en ese momento.
o Ejemplo:
/*Si estuvieramos dentro del codigo del MIDlet*/
Display dsp = Display.getDisplay(this)
• flashBacklight()
o Definición
public boolean flashBacklight(int duracion)
o Descripción
Provoca un efecto de flash en la pantalla. En el parámetro de
duración, se colocará la cantidad de segundos que durará el flash.
Dicha cantidad esta definida en milisegundo (cada 1000 representa
1 segundo).
• getBorderStyle()
o Definición
public int getBorderStyle(boolean luminosidad)
o Descripción
Devuelve el estilo de borde actual. El parámetro luminosidad
activará la luminosidad de la pantalla del dispositivo.
• getColor()
o Definición
public int getColor(int color)
o Descripción
Devuelve un color basado en el parámetro pasado, es decir, que
podremos colocar en el parámetro el valor correspondiente a la
propiedad que se desea conocer, por ejemplo el color de fondo,
letra, borde, etc.; los parámetros a usar son :
Display.COLOR_BACKGROUND
Display.COLOR_FOREGROUND
Display.COLOR_HIGHLIGHTED_BACKGROUND
Display.COLOR_HIGHLIGHTED_FOREGROUND
Display.COLOR_BORDER
Display.COLOR_HIGHLIGHTED_BORDER
• numColors()
o Definición
public int numColors()
o Descripción
Devuelve el número de colores aceptados por el dispositivo.
• setCurrent()
o Definición
public void setCurrent(Displayable d)
public void setCurrent(Alert a, Displayable d)
o Descripción
Establece la pantalla actual o la que se desea mostrar. En el
caso de la segunda definición, previamente, se mostrará la alerta
especificada
• vibrate()
o Definición
public boolean vibrate(int duracion)
o Descripción
Realiza la operación de hacer vibrar el dispositivo. El parámetro
recibirá la cantidad de tiempo que deba vibrar en milisegundos.
• getCurrent()
o Definición
public Displayable getCurrent()
o Descripción
Retornará la pantalla que se encuentre activa.
• isColor()
o Definición
public boolean isColor()
o Descripción
Retorna un valor lógico que indicará que la pantalla es a color o
monocromática.
2.2.1 Definición
Esta clase es la que se va encargar de controlar las diversas ventanas
que se podrán mostrar en la pantalla del dispositivo celular y sus diversas
propiedades. Es la clase base de la cual derivan las clases TextBox, Alert,
List y Form, de la interfaz de alto nivel; y Canvas, de la interfaz de bajo nivel.
Por lo tanto, todos los métodos que se especifican a continuación pueden ser
usados en dichas clases.
2.2.2 Métodos
• getHeight()
o Definición
public int getHeight()
o Descripción
Devuelve el alto de la pantalla en píxeles.
• getWidth()
o Definición
public int getWidth()
o Descripción
Devuelve el ancho de la pantalla en píxeles.
• setTicker()
o Definición
public void setTicker(Ticker t)
o Descripción
Establece un Ticker en la pantalla del dispositivo. Un Ticker es
un control similar una marquesina, es decir, un texto desplazándose
en la parte superor de la ventana. Ir a la sección correspondiente a
la semana 6 para una explicación mas detallada acerca de este
control.
• getTicker()
o Definición
public Ticker getTicker()
o Descripción
Devuelve el Ticker asignado a la pantalla del dispositivo
• setTitle()
o Definición
public void setTitle(String s)
o Descripción
Establece el título de la pantalla
• getTitle()
o Definición
public String getTitle()
o Descripción
Devuelve el título de la pantalla
• addCommand()
o Definición
3.1. Consideraciones
Los eventos del teclado considerados son las pulsaciones de los botones
situados, generalmente, en la parte superior del dispositivo móvil. Estos botones
se indican en la ventana 2-1. Si se desea control las pulsaciones de otras teclas,
se debe usar la interfaz de bajo nivel.
Boton Derecho
Boton Izquierdo
Boton SELECT
3.2.1 Definición
Esta clase representa a los botones que se visualizan en la pantalla.
Debe ser agregado a un objeto Displayable usando el método addCommand.
Se puede agregar el mismo objeto Command a varios objetos Displayable.
3.2.2 Métodos
• Constructor()
o Definición
public Command(String label,int commandType,int priority)
o Descripción
Crea un comando. Los parámetros son:
o etiqueta: Nombre a mostrar del botón
o tipo: Tipo de Command a representrar
o prioridad: Prioridad que tendrá el botón en pantalla. Esto solo
aplica con botones que tengan el mismo tipo.
Los tipos de botones están definidos por valores de tipo entero y
pueden ser los siguientes:
o Command.BACK: Petición para volver a la pantalla anterior
o Command.CANCEL: Petición para cancelar la acción en curso
o Command.EXIT: Petición para salir de la aplicación
o Command.HELP: Petición para mostrar información de ayuda
o Command.ITEM: Petición para introducir el comando en un “item”
en la pantalla
o Command.OK: Aceptación de una acción por parte del usuario
o Command.STOP: Petición para parar una operación
• getCommandType()
o Definición
public int getCommandType()
o Descripción
Devuelve el tipo de Command.
• getLabel()
o Definición
public String getLabel()
o Descripción
Devuelve la etiqueta del Command.
• getPriority()
o Definición
public int getPriority()
o Descripción
Devuelve la prioridad del objeto Command.
3.3.1 Definición
Esta interfaz se encarga de procesar los eventos que van a ser
generados por los objetos de tipo Command que se encuentra en la pantalla
del dispositivo móvil.
3.3.2 Métodos
• commandAction()
o Definición
protected abstract void commandAction(Command c,
Displayable d)
o Descripción
Este es único método definido para esta interfaz. Cada vez que
creemos una clase que implemente esta interfaz, debemos declarar
este método donde programaremos los procesos que se van a
realizar cuando se presione alguno de los botones. Este método
cuenta con 2 parámetros:
o c: representa al objeto Command que ha realizado la acción.
o d: representa la pantalla donde se encuentra el objeto
Command que realizó la acción. Recuerde que un objeto
Command puede ser agregado a diferentes ventanas.
4. Ejemplos
4.1.1 Enunciado
Construir una aplicación que realice lo siguiente:
• Mostrar una ventana con el título “Configuración” y con las siguientes
propiedades de la pantalla:
o Estilo del borde cuando los controles están resaltados
o Estilo del borde cuando los controles no están resaltados
o Color de fondo
o Numero de colores
o Un valor que indique si soporta colores o no.
o Alto de la pantalla
o Ancho de la pantalla
• Tendrá un botón para salir de la aplicación
• La figura 4-1 indica como deberá verse la pantalla.
4.1.2 Código
/*
*Importar espacios de nombres
**/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public DatosDisplay()
{
/*
Obtiene una referencia de la pantalla, para poder colocar los
diferentes objetos gráficos
*/
pantalla = Display.getDisplay(this);
botonSalir = new Command("Salir", Command.EXIT, 2);
formulario = new Form("Configuracion");
/*
* Inicializacion de variables de tipo StringItem con datos diversos
**/
// Estilo del borte de los controles cuando estan resaltados
StringItem borde = new StringItem("Borde1:",
String.valueOf(pantalla.getBorderStyle(true)));
// Altura de la pantalla
StringItem altura = new StringItem("Altura:",
String.valueOf(formulario.getHeight()));
// Ancho de la pantalla
StringItem ancho = new StringItem("Ancho:",
String.valueOf(formulario.getWidth()));
/*
*Adicion de los objetos de tipo StringItem con los datos
**/
formulario.append(borde);
formulario.append(borde2);
formulario.append(color);
formulario.append(numColores);
formulario.append(esColor);
formulario.append(altura);
formulario.append(ancho);
/*
* Adicion del comando e inicio de la captura de eventos de entrada
**/
formulario.addCommand(botonSalir);
formulario.setCommandListener(this);
}
if (c == botonSalir)
{
// Si es el boton Salir, se realiza la llamada
// usando las funciones destroyApp
// (que de momento esta vacia)
// y notifyDestroyed()
destroyApp(false);
notifyDestroyed();
}
}
}
Resumen
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
http://www.mailxmail.com/curso/informatica/j2me
http://programacion.com/java/tutorial/ags_j2me/
http://leo.ugr.es/J2ME/MIDP/enlaces.htm
http://java.sun.com/javame/reference/apis/jsr118/
UNIDAD DE
APRENDIZAJE
2
SEMANA
MANEJO DE VENTANAS
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
Esta clase se utiliza para mostrar mensajes en toda la pantalla del dispositivo
móvil. Tiene un tiempo de visualización (timeout), luego de lo cual desaparece
(por defecto es 2000 milisegundos), así como un tipo que define su
comportamiento.
4.3. Métodos
4.3.1 Constructor
• Definición
public Alert(String titulo, String mensaje, Image imagen,
AlertType tipoAlerta)
public Alert(String titulo)
• Descripción
Permite construir un control de tipo Alert. Sus parámetros son:
o título: Título a mostrar en la parte superior de la pantalla
o mensaje: Mensaje que se mostrará
o imagen: Imagen que se mostrará. Si no se desea mostrar
ninguna imagen el valor debe ser null.
o tipoAlerta: Es un entero que define el comportamiento que
tendrá el Alert. Este comportamiento depende del dispositivo y
puede consistir en mostrar un sonido, realizar una vibración, etc.
Los valores posibles se indican en la tabla 1-1.
Constante Descripción
AlertType.ALARM Aviso de una petición previa
AlertType.CONFIRMATION Indica la aceptación de una acción
AlertType.ERROR Indica que ha ocurrido un error
AlertType.INFO Indica algún tipo de información
AlertType.WARNING Indica una advertencia
Tabla 1-1. Tipos de Alert
• Ejemplo
El siguiente fragmento crea un Alert de tipo INFO, con el título
“Éxito” y el mensaje “Proceso culminó con éxito”
4.3.2 getImage()
• Definición
public Image getImage()
• Descripción
Devuelve la imagen configurada para la alerta.
4.3.3 getString()
• Definición
public String getString()
• Descripción
Devuelve el mensaje configurado para la alerta.
4.3.4 getString()
• Definición
public String getString()
• Descripción
Devuelve el mensaje configurado para la alerta.
4.3.5 getTimeout()
• Definición
public int getTimeout()
• Descripción
Devuelve el tiempo que se mostrará la alerta (en milisegundos).
4.3.6 getType()
• Definición
public AlertType getType()
• Descripción
Devuelve el tipo de alerta definido para un objeto Alert.
4.3.7 setImage()
• Definición
public void setImage(Image img)
• Descripción
Define la imagen a mostrar en un objeto Alert.
4.3.8 setString()
• Definición
public void setString(String str)
• Descripción
Define el mensaje a mostrar en un objeto Alert.
4.3.9 setTimeout()
• Definición
public void setTimeout(int timeout)
• Descripción
Define el tiempo que se mostrará un objeto Alert (en milisegundos).
Se puede usar la constante Alert.FOREVER para indicar que el Alert no
va a desaparecer automáticamente.
4.3.10 setType()
• Definición
public void setType(AlertType tipo)
• Descripción
Define el tipo de alerta que se mostrará.
5.1. Definición
5.2. Métodos
5.2.1 Constructor
• Definición
public TextBox(String titulo, String textoInicial,
int longitudMaxima, int filtros)
• Descripción
Permite construir un control de tipo TextBox. Sus parámetros son:
o Título: Título a mostrar en la parte superior de la pantalla.
o textoInicial: Texto mostrado al inicio.
o longitudMaxima: Longitud máxima de caracteres
o filtros: Es un entero que define que tipo de texto se va a
ingresar. Este entero puede ser un filtro restrictivo solo (ver tabla
Constante Descripción
TextField.ANY Permite el ingreso de cualquier caracter.
TextField.NUMERIC Permite el ingreso de cualquier número entero.
TextField.PHONENUMBER Permite caracteres válidos sólo para números de teléfono.
TextField.EMAILADDR Permite caracteres válidos para direcciones de correo.
TextField.DECIMAL Permite el ingreso de cualquier número decimal.
TextField.URL Permite caracteres válidos sólo para direcciones URL.
Tabla 2-1. Filtros restrictivos de un TextBox’
Constante Descripción
TextField.PASSWORD Muestra asteriscos en vez del texto realmente ingresado.
TextField.UNEDITABLE No permite la edición del texto.
TextField.SENSITIVE Es un dato sensible y no debe ser guardado en memoria.
TextField.NON_PREDICTIVE No usar el mecanismo de texto predictivo.
TextField.INITIAL_CAPS_WORD Cada palabra comenzará en mayúsculas.
TextField.INITIAL_CAPS_SENTENCE Cada oración comenzará con mayúsculas
Tabla 2-2. Filtros opcionales de un TextBox
• Ejemplo
El siguiente fragmento crea una ventana de texto que permite el
ingreso de una contraseña numérica de máximo 10 dígitos e indica que
es un dato sensible.
private TextBox txt = new TextBox(“Clave”, “”, 10,
TextField.NUMERIC | TextField.PASSWORD | TextField.SENSITIVE);
5.2.2 delete()
• Definición
public void delete(int desplazamiento, int longitud)
• Descripción
Borra caracteres del TextBox, donde:
o desplazamiento: Posición inicial a borrar
o longitud: Cantidad de caracteres a eliminar
5.2.3 getCaretPosition()
• Definición
public int getCaretPosition()
• Descripción
Devuelve la posición del cursor en pantalla.
5.2.4 getChars()
• Definición
public int getChars(char [] datos)
• Descripción
Copia el contenido del TextBox en el arreglo “datos” y devuelve el
número de caracteres copiados.
5.2.5 getMaxSize()
• Definición
public int getMaxSize()
• Descripción
Devuelve el tamaño máximo del TextBox.
5.2.6 getString()
• Definición
public String getString()
• Descripción
Devuelve el contenido del TextBox.
5.2.7 insert()
• Definición
public void insert(char[] datos, int des, int long, int pos)
public void insert(char[] datos, int pos)
• Descripción
Inserta el contenido del arreglo datos en el TextBox.
o datos: arreglo a copiar
o des: posición del arreglo desde donde se copiará
o long: cantidad de caracteres que se copiarán
o pos: posición en el TextBox donde se colocarán los caracteres
5.2.8 setChars()
• Definición
public void setChars(char[] datos, int des, int long)
• Descripción
Reemplaza el contenido del TextBox por el arreglo “datos”.
o datos: arreglo a copiar
o des: posición del arreglo desde donde se copiará
o long: cantidad de caracteres que se copiarán
5.2.9 setMaxSize()
• Definición
public int setMaxSize(int capacidad)
• Descripción
Establece el tamaño máximo del TextBox. Devuelve el tamaño que
realmente se le ha asignado.
5.2.10 setString()
• Definición
public void setString(String texto)
• Descripción
Establece el contenido del TextBox.
5.2.11 size()
• Definición
public int size()
• Descripción
Devuelve el número de caracteres actualmente ingresados.
6. Ejemplos
6.1.1 Enunciado
Construir una aplicación que realice lo siguiente:
• Mostrar una ventana inicial de bienvenida por 2 segundos.
• Luego mostrar una ventana que permita el ingreso de un usuario. Esta
ventana tendrá botones para salir y aceptar.
• Si se pulsa aceptar, mostrar una ventana que permita el ingreso de una
contraseña. Esta ventana tendrá botones para salir, volver y aceptar.
• Si se pulsa aceptar, verificar que el usuario y contraseña sean iguales a
las propiedades “usuario” y “clave” del descriptor. Se deben crear
previamente dichas propiedades. Mostrar una ventana de éxito o error
según sea el caso.
• La figura 3-1 indica como deberá verse la pantalla.
6.1.2 Código
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.Form;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
// Creacion de botones
private Command cmdSalir = new Command("Salir", Command.EXIT, 2);
private Command cmdVolver = new Command("Volver", Command.BACK, 2);
private Command cmdAceptar = new Command("Aceptar", Command.OK, 2);
public InicioSesion()
{
// Agregar botones e indicar la clase que procesara los eventos
txtUsuario.addCommand(cmdSalir);
txtUsuario.addCommand(cmdAceptar);
txtUsuario.setCommandListener(this);
Resumen
La clase TextBox define una ventana que pide el ingreso de un dato, el cual puede
ser de diferentes tipos.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
http://www.mailxmail.com/curso/informatica/j2me
http://programacion.com/java/tutorial/ags_j2me/
http://leo.ugr.es/J2ME/MIDP/enlaces.htm
http://java.sun.com/javame/reference/apis/jsr118/
UNIDAD DE
APRENDIZAJE
2
SEMANA
MANEJO DE LISTAS
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
1.1. Definición
Esta clase nos permite utilizar diferente tipos de lista de opciones en la pantalla
del dispositivo móvil. Puede ser utilizado como una lista de selección, ya sea
única o múltiple, o para la elaboración de un menú con el que interactuará el
usuario de la aplicación. Sus elementos se identifican por un índice o posición que
comienza en cero (0).
1.2. Métodos
1.2.1 Constructor
• Definición
public List(String titulo, int tipo)
public List(String titulo, int tipo, String[] elementos,
Image[] imagenes)
• Descripción
Permite construir un control de tipo List. Sus parámetros son:
o Título: Título a mostrar en la parte superior de la pantalla
o tipo: Dato entero que indica el tipo de lista. Se pueden usar las
constantes de la tabla 1-1
o elementos: arreglo conteniendo la lista inicial de elementos
o imágenes: arreglo del mismo tamaño de “elementos”,
conteniendo sus imágenes, o null si no existieran imágenes
Constante Descripción
List.EXCLUSIVE Permite la selección de sólo un elemento a la vez.
List.MULTIPLE Permite la selección de varios elementos a la vez.
List.IMPLICIT Permite la selección de sólo un elemento a la vez y genera un evento.
Se utiliza para la creación de menús
Tabla 1-1. Tipos de Lista
• Ejemplo
El siguiente fragmento crea una lista exclusiva con 3 elementos
private String astrTipoDoc[] = {“Partida”, “DNI”, “Pasaporte”};
private List lst = new List(“Tipo Documento”, List.EXCLUSIVE,
astrTipoDoc, null);
El siguiente fragmento crea una lista implícita con 3 elementos
private String astrOpciones[] = {“Ingreso”, “Reportes”, “Salir”};
private List lst = new List(“Opciones”, List.IMPLICIT,
astrOpciones, null);
1.2.2 append()
• Definición
public int append(String texto, Image img)
• Descripción
Añade un elemento al final de la lista y devuelve su índice en la lista.
o texto: Elemento a agregar
o img: Imagen del elemento a agregar o null si no existiera
1.2.3 delete()
• Definición
public void delete(int pos)
• Descripción
Elimina el elemento en la posición que se especifica.
1.2.4 deleteAll()
• Definición
public void deleteAll()
• Descripción
Elimina todos los elementos de la lista.
1.2.5 insert()
• Definición
public void insert(int pos, String texto, Image img)
• Descripción
Inserta un elemento en la posición indicada. Todos los elementos
posteriores corren una posición.
o pos: Posición del elemento a agregar
o texto: Elemento a agregar
o img: Imagen del elemento a agregar o null si no existiera
1.2.6 getFont()
• Definición
public Font getFont(int pos)
• Descripción
Devuelve la fuente del elemento en la posición indicada por “pos”.
1.2.7 getImage()
• Definición
public Image getImage(int pos)
• Descripción
Devuelve la imagen del elemento en la posición indicada por “pos”.
1.2.8 getSelectedFlags()
• Definición
public int getSelectedFlags(boolean [] estado)
• Descripción
Llena el arreglo “estado” con el estado de los elementos (true si
fueron seleccionados, false si no) y devuelve el número de elementos
seleccionados. Este método se usa para las listas múltiples.
1.2.9 getSelectedIndex()
• Definición
public int getSelectedIndex()
• Descripción
Obtiene el índice del elemento seleccionado. Este método se usa
para las listas exclusiva e implícita.
1.2.10 getString()
• Definición
public String getString(int pos)
• Descripción
Obtiene el texto del elemento señalado por el parámetro “pos”.
1.2.11 isSelected()
• Definición
public boolean isSelected(int pos)
• Descripción
Devuelve un valor que indica si el elemento señalado por el
parámetro “pos” está seleccionado.
1.2.12 set()
• Definición
public void set(int pos, String texto, Image img)
• Descripción
Modifica un elemento ya existente en la posición indicada.
o pos: Posición del elemento a agregar
o texto: Elemento a agregar
o img: Imagen del elemento a agregar o null si no existiera
1.2.13 setDefaultCommand()
• Definición
public void setDefaultCommand(Command cmd)
• Descripción
Establece el botón que se ejecutará cuando se pulse el botón
SELECT. Se usa al crear un menú con una lista implícita.
1.2.14 setFitPolicy()
• Definición
public void setFitPolicy(int estilo)
• Descripción
Modifica la forma cómo se muestran los elementos con texto muy
largo. El parámetro estilo es un entero que puede usar las constantes
indicadas en la tabla 1-2.
Constante Descripción
List.TEXT_WRAP_OFF Textos que sobrepasan la pantalla son cortados, de manera que todos
los elementos ocupan un renglón.
List.TEXT_WRAP_ON Textos que sobrepasan la pantalla no son cortados, de manera que
los elementos se ven completos en más de un renglón.
List.TEXT_WRAP_DEFAULT Textos que sobrepasan la pantalla se muestran de acuerdo como se
haya definido por defecto en el dispositivo.
Tabla 1-2. Valores para usar con el método serFitPolicy
1.2.15 setFont()
• Definición
public void setFont(int pos, Font fuente)
• Descripción
Cambia la fuente del elemento en la posición “pos” por la fuente
indicada en el parámetro “fuente”. En el capítulo 6 se trata a mayor
detalle los tipos de letra que se pueden manejar desde J2ME.
1.2.16 setSelectedFlags()
• Definición
public void setSelectedFlags(Boolean [] nuevoEstado)
• Descripción
Cambia el estado de los elementos (true si fueron seleccionados,
false si no fuese así) por el que se indica en el arreglo “nuevoEstado”.
Se usa en listas múltiples.
1.2.17 setSelectedIndex()
• Definición
public void setSelectedIndex(int pos, boolean seleccionado)
• Descripción
Cambia el estado del elemento indicado en la posición “pos” por el
que se indica en el parámetro “seleccionado”.
1.2.18 size()
• Definición
public int size()
• Descripción
Devuelve el número de elementos de la lista.
2. Creación de menús
2.1. Consideraciones
Con una lista implícita se pueden crear menús de usuario. Para esto, la lista
tiene un botón implícito llamado SELECT_COMMAND que genera un evento
cuando se pulsa el botón SELECT sobre uno de sus elementos. Este evento es
procesado por el método commandAction como si fuera un objeto Command
convencional.
Eventualmente, se podría dejar de usar el botón por defecto y usar un objeto
Command creado para esto. En ese caso, se debe agregar el botón a la lista con
el método addCommand y establecerlo como botón por defecto con el método
setDefaultCommand.
1. Crear una lista implícita con los elementos correspondientes a las opciones
del menú
private String astrOpciones[] = {“Ingreso”, “Reportes”, “Salir”};
private List lst = new List(“Opciones”, List.IMPLICIT,
astrOpciones, null);
if(lst.getSelectedIndex() == 0)
{
// Poner la logica correspondiente a la opcion 0
}
}
}
3. Ejemplos
3.1.1 Enunciado
Construir una aplicación que realice lo siguiente:
• Mostrar un menú que, al seleccionar una opción, muestre, en un Alert, un
mensaje
• Adicionalmente, debe tener un botón “salir”.
• La figura 3-1 indica cómo deberá verse la pantalla.
3.1.2 Código
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public MenuInicial()
{
pantalla = Display.getDisplay(this); //Creacion de pantallas
menu.insert(0,"Opcion3",null);
menu.insert(0,"Opcion2",null);
menu.insert(0,"Opcion1",null);
menu.addCommand(salir);
menu.setCommandListener(this);
}
Resumen
La clase List se usa para mostrar una lista de selección de datos. Dicha selección
puede ser única o múltiple. También, se utiliza para la creación de menús.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
http://www.mailxmail.com/curso/informatica/j2me
http://programacion.com/java/tutorial/ags_j2me/
http://leo.ugr.es/J2ME/MIDP/enlaces.htm
http://java.sun.com/javame/reference/apis/jsr118/
UNIDAD DE
APRENDIZAJE
2
SEMANA
CONTROLES ADICIONALES
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
1. Clase Image
1.1. Definición
Esta clase nos permite visualizar una imagen. El formato estándar para los
archivos de imagen de los dispositivos móviles es PNG, aunque dependiendo del
equipo se puede trabajar con otros formatos conocidos, como GIF, JPG, etc. No
existe un constructor para una imagen, en lugar de eso se usa el método estático
createImage. Sólo algunas clases, como Alert, List o Form, pueden mostrar una
imagen.
1.2. Métodos
1.2.1 createImage()
• Definición
public static createImage(String archivo)
• Descripción
Crea una imagen con el archivo señalado por el parámetro “archivo”.
Los archivos de imagen deben estar guardados en la carpeta “res” del
proyecto. Dicha carpeta debe tratarse como la carpeta raíz. El método
puede lanzar una excepción, por lo que debe estar dentro de un bloque
try – catch.
• Ejemplo
El siguiente fragmento, crea una imagen con el archivo imagen.png,
el cual se encuentra en la carpeta res.
private Image img = null;
try {
img = Image.createImage(“/imagen.png”);
}
catch(Exception ex) {
}
2. CLASE FONT
2.1. Definición
Los tipos de letra en J2ME son limitados y esta clase nos permite definir uno.
No existe un constructor para una fuente. En lugar de eso, se usa el método
estático getFont. Sólo algunas clases, como List, pueden modificar el tipo de letra
de sus elementos.
2.2. Métodos
2.2.1 getFont()
• Definición
public static getFont(int tipo, int estilo, int tamano)
• Descripción
Crea un tipo de letra con los parámetros indicados. Estos datos son
enteros y están representados por las constantes de las tablas 2-1, 2-2
y 2-3.
• Ejemplo
El siguiente fragmento crea un tipo de letra proporcional, itálica y
pequeña.
private Font fnt = Font.getFont(Font.FACE_PROPORTIONAL,
Font.STYLE_ITALIC, Font.SIZE_SMALL);
Constante Descripción
Font.FACE_MONOSPACE3 Los caracteres tienen el mismo ancho.
Font.FACE_PROPORTIONAL Las dimensiones de los caracteres son proporcionales.
Font.FACE_SYSTEM Tipo de letra definido para el sistema.
Tabla 2-1. Constantes de tipo de letra
Constante Descripción
Font.STYLE_BOLD Resaltado o en “negrita”
Font.STYLE_ITALIC Cursiva o itálica
Font.STYLE_PLAIN Normal
Font.STYLE_UNDERLINED Subrayado
Tabla 2-2. Constantes de estilo de letra
Constante Descripción
Font.SIZE_LARGE Grande
Font.SIZE_MEDIUM Mediano
Font.SIZE_SMALL Pequeño
Tabla 2-3. Constantes de tamaño de letra
3. Clase Ticker
3.1. Definición
3.2. Métodos
3.2.1 Constructor
• Definición
public Ticker(String texto)
• Descripción
Permite construir un Ticker con el texto indicado en el parámetro.
• Ejemplo
El siguiente fragmento, crea un Ticker con el texto “Bienvenido”.
private Ticker ticker = new Ticker(“Bienvenido”);
3.2.2 getString()
• Definición
public String getString()
• Descripción
Devuelve el texto del Ticker.
3.2.3 setString()
• Definición
public void setString(String texto)
• Descripción
Cambia el texto del Ticker.
4. Ejemplos
4.1.1 Enunciado
Modificar la aplicación del capítulo anterior para que realice lo siguiente:
• Mostrar una ventana inicial con una imagen
• Agregar un Ticker al menú con el texto “Seleccione opción”
• Modificar los tipos de letra de las opciones del menú
• La figura 4-1 indica como deberá verse la pantalla.
4.1.2 Código
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
// Ventana de bienvenida
private Alert bienvenida;
// Imagen
private Image imgDuke;
public MenuInicial()
{
pantalla = Display.getDisplay(this); //Creacion de pantallas
menu.insert(0,"Opcion3",null);
menu.insert(0,"Opcion2",null);
menu.insert(0,"Opcion1",null);
// Creación de fuentes
Font fnt0 = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,
Font.SIZE_SMALL);
Font fnt1 = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,
Font.SIZE_MEDIUM);
Font fnt2 = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,
Font.SIZE_LARGE);
// Cambiar las fuentes del menú
menu.setFont(0, fnt0);
menu.setFont(1, fnt1);
menu.setFont(2, fnt2);
// Crear la imagen
try
{
imgDuke = Image.createImage("/duke.png");
}
catch(Exception ex)
{
imgDuke = null;
}
Resumen
La clase Image se usa para mostrar una imagen. El formato estándar de los
archivos imagen para móviles es PNG. Estos archivos deben ser copiados en la
carpeta res del proyecto para poder ser usados.
La clase Font se usa para definir un tipo de letra, el cual puede ser usado para
cambiar la fuente del texto de un control.
La clase Ticker se usa para mostrar un texto de una manera similar a una
marquesina. Un ticker debe ser agregado a un objeto que herede de Displayable
(TextBox, Alert, List, Form, Canvas) para poder ser visto.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas:
http://www.mailxmail.com/curso/informatica/j2me
http://programacion.com/java/tutorial/ags_j2me/
http://leo.ugr.es/J2ME/MIDP/enlaces.htm
http://java.sun.com/javame/reference/apis/jsr118/
UNIDAD DE
APRENDIZAJE
2
SEMANA
MANEJO DE FORMULARIOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
1. CLASE FORM
1.1. Definición
Item
ChoiceGroup DateField
TextField ImageItem
Gauge StringItem
1.2. Métodos
1.2.1 Constructor
• Definición
public Form(String titulo)
public Form(String titulo, Item [] elementos)
• Descripción
Permite crear un control de tipo Form. Sus parámetros son:
o título: Título a mostrar en la parte superior de la pantalla
o elementos: Elementos que se agregarán al formulario
• Ejemplo
El siguiente fragmento crea un formulario con el título “Ingreso”.
private Form frm = new Form(“Ingreso”);
1.2.2 append()
• Definición
public int append(String texto)
public int append(Item item)
public int append(Image imagen)
• Descripción
Agrega un elemento al formulario y devuelve su índice.
o texto: Texto que se agregará al formulario como un control
StringItem
o item: Item que se agregará al formulario
o imagen: Imagen que se agregará al formulario como un control
ImageItem
1.2.3 delete()
• Definición
public void delete(int posicion)
• Descripción
Elimina el elemento del formulario dado por el parámetro “posición”.
1.2.4 deleteAll()
• Definición
public void deleteAll()
• Descripción
Elimina todos los elementos del formulario.
1.2.5 insert()
• Definición
public void insert(int posicion, Item item)
• Descripción
Inserta un objeto de tipo Item en la posición dada por el parámetro.
1.2.6 set()
• Definición
public void set(int posicion, Item item)
• Descripción
Reemplaza el objeto de tipo Item de la posición dada por el
parámetro “posición” con el nuevo objeto “item”.
1.2.7 size()
• Definición
public int size()
• Descripción
Obtiene el número de elementos que contiene el formulario.
1.2.8 setItemStateListener()
• Definición
public void setItemStateListener(ItemStateListener listener)
• Descripción
Establece la clase que escuchará los eventos de cambio de estado
de los objetos de tipo Item insertados en un formulario. Ver el punto 5
para más detalle sobre acerca de este tipo de eventos.
2. Clase StringItem
2.1. Definición
La clase StringItem es una clase similar a una etiqueta, la cual podrá ser
insertada en un formulario. Esta clase también permite simular un botón o
hyperlink. Para más detalle sobre como realizar esto último, ir al capítulo 10.
2.2. Métodos
2.2.1 Constructor
• Definición
public StringItem(String etiqueta, String texto)
public StringItem(String etiqueta, String texto,
int apariencia)
• Descripción
Permite construir un control de tipo StringItem. Sus parámetros son:
o etiqueta: Texto a mostrar en la parte izquierda del control, a
manera de título
o texto: Texto a mostrar en la parte derecha del control
o apariencia: Dato entero que define cómo se mostrará el control
La tabla 2-1 indica las constantes definidas para este valor.
Constante Descripción
Item.PLAIN Texto plano
Item.HYPERLINK Enlace. Ir al capítulo 10 para más detalle
Item.BUTTON Botón. Ir al capítulo 10 para más detalle
2.2.2 getAppearanceMode()
• Definición
public int getAppearanceMode()
• Descripción
Devuelve la apariencia del control StringItem.
2.2.3 getText()
• Definición
public String getText()
• Descripción
Devuelve el texto del control StringItem.
2.2.4 setFont()
• Definición
public void setFont(Font font)
• Descripción
Define un tipo de letra para el control StringItem.
2.2.5 setText()
• Definición
public void setText(String texto)
• Descripción
Define el nuevo texto del control StringItem.
3. Clase TextField
3.1. Definición
Esta clase nos permite crear objetos de tipo caja de texto dentro de un
formulario. Es similar al objeto TextBox, con la diferencia que pueden existir varios
objetos de tipo TextField al mismo tiempo en un solo formulario.
3.1 Métodos
3.1.1 Constructor
• Definición
public TextField(String titulo, String textoInicial,
int longitudMaxima, int filtros)
• Descripción
Permite construir un control de tipo TextField. Sus parámetros son:
o título: Título a mostrar en la parte superior de la pantalla.
o textoInicial: Texto mostrado al inicio.
o longitudMaxima: Longitud máxima de caracteres
o filtros: Es un entero que define que tipo de texto se va a
ingresar. Este entero puede ser un filtro restrictivo solo (ver tabla
Constante Descripción
TextField.ANY Permite el ingreso de cualquier caracter.
TextField.NUMERIC Permite el ingreso de cualquier número entero.
TextField.PHONENUMBER Permite caracteres válidos sólo para números de teléfono.
TextField.EMAILADDR Permite caracteres válidos para direcciones de correo.
TextField.DECIMAL Permite el ingreso de cualquier número decimal.
TextField.URL Permite caracteres válidos sólo para direcciones URL.
Tabla 2-1. Filtros restrictivos de un TextField
Constante Descripción
TextField.PASSWORD Muestra asteriscos en vez del texto realmente ingresado.
TextField.UNEDITABLE No permite la edición del texto.
TextField.SENSITIVE Es un dato sensible y no debe ser guardado en memoria.
TextField.NON_PREDICTIVE No usar el mecanismo de texto predictivo.
TextField.INITIAL_CAPS_WORD Cada palabra comenzará en mayúsculas.
TextField.INITIAL_CAPS_SENTENCE Cada oración comenzará con mayúsculas
Tabla 2-2. Filtros opcionales de un TextField
• Ejemplo
El siguiente fragmento, crea una ventana de texto que permite el
ingreso de una contraseña numérica de máximo 10 dígitos, e indica que
es un dato sensible.
private TextField txf = new TextField(“Clave”, “”, 10,
TextField.NUMERIC | TextField.PASSWORD | TextField.SENSITIVE);
3.1.2 delete()
• Definición
public void delete(int desplazamiento, int longitud)
• Descripción
Borra caracteres del TextField, donde:
o desplazamiento: Posición inicial a borrar
o longitud: Cantidad de caracteres a eliminar
3.1.3 getCaretPosition()
• Definición
public int getCaretPosition()
• Descripción
Devuelve la posición del cursor en pantalla.
3.1.4 getChars()
• Definición
public int getChars(char [] datos)
• Descripción
Copia el contenido del TextField en el arreglo “datos” y devuelve el
número de caracteres copiados.
3.1.5 getMaxSize()
• Definición
public int getMaxSize()
• Descripción
Devuelve el tamaño máximo del TextField.
3.1.6 getString()
• Definición
public String getString()
• Descripción
Devuelve el contenido del TextField.
3.1.7 insert()
• Definición
public void insert(char[] datos, int des, int long, int pos)
public void insert(char[] datos, int pos)
• Descripción
Inserta el contenido del arreglo datos en el TextField.
o datos: arreglo a copiar
o des: posición del arreglo desde donde se copiará
o long: cantidad de caracteres que se copiarán
o pos: posición en el TextField donde se colocarán los caracteres
3.1.8 setChars()
• Definición
public void setChars(char[] datos, int des, int long)
• Descripción
Reemplaza el contenido del TextField por el arreglo “datos”.
o datos: arreglo a copiar
o des: posición del arreglo desde donde se copiará
o long: cantidad de caracteres que se copiarán
3.1.9 setMaxSize()
• Definición
public int setMaxSize(int capacidad)
• Descripción
Establece el tamaño máximo del TextField. Devuelve el tamaño que
realmente se le ha asignado.
3.1.10 setString()
• Definición
public void setString(String texto)
• Descripción
Establece el contenido del TextField.
3.1.11 size()
• Definición
public int size()
• Descripción
Devuelve el número de caracteres actualmente ingresados.
4. Clase ChoiceGroup
4.1. Definición
Esta clase nos permite crear listas de selección que podrán ser incrustados en
un formulario, tal como lo hacía el objeto List.
4.2. Métodos
4.2.1 Constructor
• Definición
public ChoiceGroup(String etiqueta, int tipo)
public ChoiceGroup(String etiqueta, int tipo,
String[] elementos, Image[] imagenes)
• Descripción
Permite crear un control de tipo ChoiceGroup. Sus parámetros son:
o etiqueta: Etiqueta que se mostrará arriba del control
o tipo: Dato entero que indica el tipo de lista. Se pueden usar las
constantes de la tabla 4-1
o elementos: arreglo conteniendo la lista inicial de elementos
Constante Descripción
ChoiceGroup.EXCLUSIVE Permite la selección de sólo un elemento a la vez.
ChoiceGroup.MULTIPLE Permite la selección de varios elementos a la vez.
ChoiceGroup.POPUP Permite la selección de sólo un elemento a la vez y se muestra como
una lista desplegable.
Tabla 4-1. Constantes de tipos de ChoiceGroup
• Ejemplo
El siguiente código crea un ChoiceGroup exclusivo con 3 elementos
private String astrTipoDoc[] = {“Partida”, “DNI”, “Pasaporte”};
private ChoiceGroup lst = new ChoiceGroup(“Tipo Documento”,
ChoiceGroup.EXCLUSIVE, astrTipoDoc, null);
4.2.2 append()
• Definición
public int append(String texto, Image img)
• Descripción
Añade un elemento al final de la ChoiceGroup y devuelve su índice.
o texto: Elemento a agregar
o img: Imagen del elemento a agregar o null si no existiera
4.2.3 delete()
• Definición
public void delete(int pos)
• Descripción
Elimina el elemento en la posición que se especifica.
4.2.4 deleteAll()
• Definición
public void deleteAll()
• Descripción
Elimina todos los elementos de la ChoiceGroup.
4.2.5 insert()
• Definición
public void insert(int pos, String texto, Image img)
• Descripción
Inserta un elemento en la posición indicada. Todos los elementos
posteriores corren una posición.
o pos: Posición del elemento a agregar
o texto: Elemento a agregar
o img: Imagen del elemento a agregar o null si no existiera
4.2.6 getFont()
• Definición
public Font getFont(int pos)
• Descripción
Devuelve la fuente del elemento en la posición indicada por “pos”.
En el capítulo 6, se trata a mayor detalle los tipos de letra que se
pueden manejar desde J2ME.
4.2.7 getImage()
• Definición
public Image getImage(int pos)
• Descripción
Devuelve la imagen del elemento en la posición indicada por “pos”.
4.2.8 getSelectedFlags()
• Definición
public int getSelectedFlags(boolean [] estado)
• Descripción
Llena el arreglo “estado” con el estado de los elementos (true si
fueron seleccionados, false si no) y devuelve el número de elementos
seleccionados. Este método se usa para los controles de tipo
ChoiceGroup múltiples.
4.2.9 getSelectedIndex()
• Definición
public int getSelectedIndex()
• Descripción
Obtiene el índice del elemento seleccionado. Este método se usa
para la controles de tipo ChoiceGroup exclusivo o popup.
4.2.10 getString()
• Definición
public String getString(int pos)
• Descripción
Obtiene el texto del elemento señalado por el parámetro “pos”.
4.2.11 isSelected()
• Definición
public boolean isSelected(int pos)
• Descripción
Devuelve un valor que indica si el elemento señalado por el
parámetro “pos” está seleccionado.
4.2.12 set()
• Definición
public void set(int pos, String texto, Image img)
• Descripción
Modifica un elemento ya existente en la posición indicada.
o pos: Posición del elemento a agregar
o texto: Elemento a agregar
o img: Imagen del elemento a agregar o null si no existiera
4.2.13 setFitPolicy()
• Definición
public void setFitPolicy(int estilo)
• Descripción
Modifica la forma cómo se muestran los elementos con texto muy
largo. El parámetro estilo es un entero que puede usar las constantes
indicadas en la tabla 4-2.
Constante Descripción
ChoiceGroup.TEXT_WRAP_OFF Textos que sobrepasan la pantalla son cortados, de manera
que todos los elementos ocupan un renglón.
ChoiceGroup.TEXT_WRAP_ON Textos que sobrepasan la pantalla no son cortados, de manera
que los elementos se ven completos en más de un renglón.
ChoiceGroup.TEXT_WRAP_DEFAULT Textos que sobrepasan la pantalla se muestran de acuerdo
como se haya definido por defecto en el dispositivo.
Tabla 1-2. Valores para usar con el método serFitPolicy
4.2.14 setFont()
• Definición
public void setFont(int pos, Font fuente)
• Descripción
Cambia la fuente del elemento en la posición “pos” por la fuente
indicada en el parámetro “fuente”. En el capítulo 6, se trata, con mayor
detalle, los tipos de letra que se pueden manejar desde J2ME.
4.2.15 setSelectedFlags()
• Definición
public void setSelectedFlags(Boolean [] nuevoEstado)
• Descripción
Cambia el estado de los elementos (true si fueron seleccionados,
false si no es así) por el que se indica en el arreglo “nuevoEstado”. Se
usa en controles de tipo ChoiceGroup múltiples.
4.2.16 setSelectedIndex()
• Definición
public void setSelectedIndex(int pos, boolean seleccionado)
• Descripción
Cambia el estado del elemento indicado en la posición “pos” por el
que se indica en el parámetro “seleccionado”.
4.2.17 size()
• Definición
public int size()
• Descripción
Devuelve el número de elementos de la ChoiceGroup.
5.1. Consideraciones
5.2. Implementación
4. Indicarle al objeto Form el objeto que procesará los eventos usando el método
setItemStateListener
frm.setItemStateListener(this);
6. Ejemplos
6.1.1 Enunciado
Construir una aplicación que realice lo siguiente:
• Mostrar una ventana con el título “Datos vivienda”, que permita ingresar
los siguientes datos:
• Tipo vía: Avenida, Calle o Pasaje
• Nombre vía: Dato alfanumérico, 100 caracteres como máximo
• Número: Dato numérico, 5 dígitos como máximo
• Tipo vivienda: Casa, piso, departamento, habitación
• Sub Número: Dato numérico, 5 dígitos como máximo. Solo se
muestra si el tipo de vivienda no es Casa
• La aplicación tendrá dos botones: uno para salir y otro para mostrar una
ventana que muestre los datos que se han ingresado.
• La figura 6-1 indica cómo deberá verse la pantalla.
6.1.2 Código
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.ChoiceGroup;
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.Image;
import javax.microedition.lcdui.ImageItem;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.ItemStateListener;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public DatosVivienda()
{
// Agregar controles
// El control de txfSubNumero no se agrega en el constructor.
// Este control se agregara solo si se selecciona un elemento
// diferente de “Casa”
frmVivienda.append(chgTipoVia);
frmVivienda.append(txfNombreVia);
frmVivienda.append(txfNumero);
frmVivienda.append(chgTipoVivienda);
// Agregar botones
frmVivienda.addCommand(cmdAceptar);
frmVivienda.addCommand(cmdSalir);
// Mostrar el Alert
dsp.setCurrent(altMensaje);
}
else if (c == cmdSalir)
{
// Salir de la aplicacion
destroyApp(false);
notifyDestroyed();
}
}
Resumen
La clase Form se usa como contenedor de objetos de tipo Item. De este modo,
permite la creación de ventanas para el ingreso de múltiples datos.
La clase StringItem es una sub clase de Item. Permite crear controles similares a
las etiquetas dentro de un formulario. También, pueden ser usadas para simular un
botón o hyperlink dentro de un formulario.
Las clases TextField y ChoiceGroup son subclases de Item. Son muy similares a
TextBox y List, con la diferencia que están dentro de un formulario.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
http://www.mailxmail.com/curso/informatica/j2me
http://programacion.com/java/tutorial/ags_j2me/
http://leo.ugr.es/J2ME/MIDP/enlaces.htm
http://java.sun.com/javame/reference/apis/jsr118/
UNIDAD DE
APRENDIZAJE
2
SEMANA
10
TEMARIO
ACTIVIDADES PROPUESTAS
1. Clase DateField
1.1. Definición
Esta clase nos permite crear objetos de tipo caja de texto especializadas en el
ingreso de valores de tipo fecha y hora.
1.2. Métodos
1.2.1 Constructor
• Definición
public DateField(String etiqueta, int modo)
public DateField(String etiqueta, int modo, TimeZone tz)
• Descripción
Permite crear un control de tipo DateField. Sus parámetros son:
o etiqueta: Etiqueta que se mostrará en la parte superior del
control
o modo: Dato entero que define el tipo de dato que se va a
ingresar. Se puede usar las constantes de la tabla 1-1
o tz: Zona horaria del dato que se va a ingresar
Constante Descripción
DateField.DATE Permite la inserción de valores de tipo Fecha.
DateField.TIME Permite insertar valores de tipo Hora
DateField.DATE_TIME Permite insertar valores de tipo Fecha y Hora.
Tabla 1-1. Constantes para el modo de ingreso de un DateField
1.2.2 getDate()
• Definición
public Date getDate()
• Descripción
Devuelve el dato ingresado, de tipo java.util.Date.
1.2.3 getInputMode()
• Definición
public int getInputMode()
• Descripción
Devuelve el modo de ingreso (ver tabla 1-1).
1.2.4 setDate()
• Definición
public void setDate(Date d)
• Descripción
Inicializa o modifica el valor del control con el valor de “d”.
1.2.5 setInputMode()
• Definición
public void setInputMode(int modo)
• Descripción
Cambia el modo de ingreso (ver tabla 1-1).
2. Clase Gauge
2.1. Definición
Esta clase nos permite crear objetos similares a indicadores de proceso o barra
de progreso. Es usado para indicar la cantidad de procesamiento que está
realizando la aplicación. Existen los siguientes tipos de Gauge:
2.1.1 Gauge Interactivo:
Puede ser modificado por el usuario. Tiene un valor máximo, y el valor actual
está entre 0 y el valor máximo.
2.1.2 Gauge no interactivo:
Puede ser modificado sólo por la aplicación. Puede ser a su vez:
• Gauge con rango definido:
Tiene un valor máximo, y el valor actual está entre 0 y el valor máximo. Es
usado como barra de estado de un proceso que esta actualizándose
constantemente y del cual se conoce su valor final.
• Gauge indefinido incremental:
No tiene valor máximo. Es usado como barra de estado de un proceso
que esta actualizándose constantemente pero no se conoce su valor final.
• Gauge indefinido continuo:
No tiene valor máximo. Es usado como barra de estado de un proceso
que no esta actualizándose constantemente y no se conoce su valor final,
es decir, sólo se sabe cuándo empieza y cuándo termina.
2.2. Métodos
2.2.1 Constructor
• Definición
public Gauge(String etiqueta, boolean interactivo,
int valorMax, int valorInicial)
• Descripción
Permite crear un control de tipo Gauge. Sus parámetros son:
o etiqueta: Etiqueta que se mostrará en la parte superior del
control
o interactivo: Indica si el usuario puede o no modificar el valor del
control.
o valorMax: Valor máximo del Gauge. Sus valores oscilarían entra
cero (0) y valorMax. Se puede indicar que el control no tiene
valor máximo usando la constante Gauge.INDEFINITE
o valorInicial: Valor inicial del Gauge. Si el valor máximo es
Gauge.INDEFINITE, el valor inicial debe ser uno de los indicados
en la tabla 2-1.
Constante Descripción
Gauge.INCREMENTAL_IDLE Estado ocupado o finalizado de un Gauge incremental
Gauge.INCREMENTAL_UPDATING Estado de actualización de un Gauge incremental
Gauge.CONTINUOUS_RUNNING Estado ocupado o finalizado de un Gauge continuo
Gauge.CONTINUOUS_IDLE Estado de actualización de un Gauge continuo
Tabla 2-1. Valores posibles para el valor inicial de un Gauge
• Ejemplo
El siguiente código crea un Gauge interactivo que va de 0 a 100:
private Gauge gauProgreso = new Gauge(“Progreso”, true, 100, 0);
2.2.2 getValue()
• Definición
public int getValue()
• Descripción
Devuelve valor actual de la barra de progreso. Si es un Gauge
indefinido, puede devolver algunos de los valores de la tabla 2-1.
2.2.3 setValue()
• Definición
public void setValue(int valor)
• Descripción
Cambia el valor actual de la barra de progreso. Si es un Gauge
indefinido, debe cambiarse por algunos de los valores de la tabla 2-1.
2.2.4 setMaxValue()
• Definición
public void setMaxValue(int valor)
• Descripción
Cambia el valor máximo de la barra de progreso. Si se desea crear
un Gauge indefinido, el valor debe ser la constante Gauge.INDEFINITE.
3. Clase ImageItem
3.1. Definición
3.2. Métodos
3.2.1 Constructor
• Definición
public ImageItem(String etiqueta, Image img, int trazado,
String textoAlterno)
public ImageItem(String etiqueta, Image img, int trazado,
String textoAlterno, int apariencia)
• Descripción
Permite crear un control de tipo ImageItem. Sus parámetros son:
o etiqueta: Texto a mostrar en la parte superior del control
o img: Imagen creada previamente
o trazado: Valor entero que define la alineación en la pantalla. Es
igual a una de las constantes de la tabla 3-1, opcionalmente
combinada con una o varias de las constates de la tabla 3-2,
usando el operador barra vertical (“|”)
o textoAlterno: Texto que se mostrará si la imagen no pudiera ser
mostrada.
o apariencia: Valor entero que indica el modo en que se ve la
imagen. Es igual a una de las constantes de la tabla 3-3.
• Ejemplo
El siguiente fragmento crea un control ImageItem centrado:
Constante Descripción
Item.LAYOUT_DEFAULT Alineación por defecto.
Item.LAYOUT_CENTER Centrado.
Item.LAYOUT_LEFT Alineado a la izquierda.
Item.LAYOUT_RIGHT Alineado a la derecha.
Tabla 3-1. Valores obligatorios del trazado
Constante Descripción
Item.LAYOUT_NEWLINE_AFTER Inserta una nueva línea después de mostrar la imagen.
Item.LAYOUT_NEWLINE_BEFORE Inserta una nueva línea antes de mostrar la imagen.
Tabla 3-2. Valores opcionales del trazado
Constante Descripción
Item.PLAIN Imagen plana
Item.HYPERLINK Enlace. Ir al punto 5 para más detalle
Item.BUTTON Boton. Ir al punto 5 para más detalle
Tabla 3-3. Valores obligatorios de la apariencia
3.2.2 getAppearanceMode()
• Definición
public int getAppearanceMode()
• Descripción
Devuelve el valor entero que define la apariencia (tabla 3-3).
3.2.3 getImage()
• Definición
public Image getImage()
• Descripción
Devuelve la imagen contenida en el control.
3.2.4 getAltText()
• Definición
public String getAltText()
• Descripción
Devuelve el texto alterno contenido en el control.
3.2.5 setImage()
• Definición
public void setImage(Image img)
• Descripción
Cambia la imagen por la que se especifica en “img”.
4.1. Consideraciones
4.2. Implementación
3. Crear tantos objetos Command como botones se deseen utilizar. Estos objetos
deben ser de tipo Command.Item.
private Command cmdAceptar = new Command("Aceptar", Command.ITEM, 2);
private Command cmdNuevo = new Command("Nuevo", Command.ITEM, 2);
5. Modificación de la apariencia
5.1. Consideraciones
5.2.1 getMinimumHeight()
• Definición
public int getMinimumHeight()
• Descripción
Devuelve el alto mínimo de un control.
5.2.2 getMinimumWidth()
• Definición
public int getMinimumWidth()
• Descripción
Devuelve el ancho mínimo de un control.
5.2.3 getPreferredHeight()
• Definición
public int getPreferredHeight()
• Descripción
Devuelve el alto actual de un control.
5.2.4 getPreferredWidth()
• Definición
public int getPreferredWidth()
• Descripción
Devuelve el ancho actual de un control.
5.2.5 setPreferredSize()
• Definición
public void setPreferredSize(int ancho, int alto)
• Descripción
Modifica el ancho y alto de un control. Tomar en cuenta que:
o Si ancho < getMinimumWidth(), ancho = getMinimumWidth()
o Si alto < getMinimumHeight(), alto = getMinimumHeight()
o Si alto o ancho = -1, no se modifica.
5.3.1 getLayout()
• Definición
public int getLayout()
• Descripción
Devuelve un valor entero que define el trazado del control en el
formulario.
5.3.2 setLayout()
• Definición
public void setLayout(int trazado)
• Descripción
Cambia el trazado del control por el valor entero definido en
“trazado”. Este valor se define de la combinación de diferentes
Constante Descripción
Item.LAYOUT_LEFT Alineación a la izquierda
Item.LAYOUT_RIGHT Alineación a la derecha
Item.LAYOUT_CENTER Alineación al centro
Item.LAYOUT_DEFAULT Alineación por defecto
Item.LAYOUT_EXPAND Expandir a todo lo ancho
Item.LAYOUT_SHRINK Comprimir horizontalmente al mínimo
Tabla 5-1. Constantes de alineación horizontal
Constante Descripción
Item.LAYOUT_BOTTOM Alineación hacia abajo
Item.LAYOUT_TOP Alineación hacia arriba
Item.LAYOUT_VCENTER Alineación centrada verticalmente
Item.LAYOUT_VEXPAND Expandir a todo lo alto
Item.LAYOUT_VSHRINK Comprimir verticalmente al mínimo
Tabla 5-2. Constantes de alineación vertical
Constante Descripción
Item.LAYOUT_NEWLINE_AFTER Insertar nueva linea después de mostrar el control
Item.LAYOUT_NEWLINE_BEFORE Insertar nueva linea antes de mostrar el control
Item.LAYOUT_2 Utiliza las politicas de alineación de MIDP 2.0, que, entre
otras cosas, permite poner varios controles en un mismo
renglón.
Tabla 5-3. Constantes de alineación - Otras
6. Ejemplos
6.1.1 Enunciado
Construir una aplicación que realice lo siguiente:
• Mostrar un formulario con el título “Nuevo Cliente” y que permita ingresar
los siguientes datos:
o Nombres (Alfanumérico de 40 caracteres)
o Tipo de documento (DNI o RUC)
o Número de documento (Numérico de 11 dígitos)
o Fecha de nacimiento.
o Tipo de negocio (kiosko o bodega)
o Decuento (usar un control Gauge)
• El control de tipo de negocio debe tener un botón “Nuevo Tipo” que carga
una ventana con un mensaje.
• Se debe simular tener un botón “Grabar” dentro del formulario.
• Adicionalmente, debe tener un botón “Salir”
• La figura 6-1 indica cómo deberá verse la pantalla.
6.1.2 Código
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.ChoiceGroup;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.DateField;
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.ItemCommandListener;
import javax.microedition.lcdui.ItemStateListener;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
// Creación de botones
private Command cmdSalir = new Command("Salir", Command.EXIT, 2);
private Command cmdGrabar = new Command("Grabar", Command.ITEM, 2);
private Command cmdNuevoTipo = new Command("Nuevo Tipo", Command.ITEM, 2);
public DatosCliente() {
/*
Modifica el alineamiento
*/
// El control chgTipoDocumento se contraen para ir en la misma línea
chgTipoDocumento.setLayout(Item.LAYOUT_SHRINK | Item.LAYOUT_2);
txfDocumento.setLayout(Item.LAYOUT_SHRINK | Item.LAYOUT_2);
if(c == cmdSalir)
{
destroyApp(false);
notifyDestroyed();
}
}
Resumen
La clase Gauge es una subclase de Item que adopta la forma de una barra de
estado, que puede o no ser modificada por el usuario.
La clase ImageItem es similar a una clase Image, con la diferencia de estar dentro
del formulario. También, puede ser usada para simular un botón o hyperlink dentro
de un formulario.
Desde un objeto de tipo Item, también se pueden controlar las pulsaciones del
teclado utilizando la interfaz ItemCommandListener.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas:
http://www.mailxmail.com/curso/informatica/j2me
http://programacion.com/java/tutorial/ags_j2me/
http://leo.ugr.es/J2ME/MIDP/enlaces.htm
http://java.sun.com/javame/reference/apis/jsr118/
UNIDAD DE
APRENDIZAJE
3
SEMANA
11
ALMACENAMIENTO DE DATOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
TEMARIO
ACTIVIDADES PROPUESTAS
1. Introducción
2. Clase RecordStore
2.1. Definición
2.2. Métodos
2.2.1 openRecordStore()
• Definición
public static RecordStore openRecordStore(String nombre,
boolean crear)
public static RecordStore openRecordStore(String nombre,
boolean crear, int modo, boolean editar)
public static RecordStore openRecordStore(String nombre,
String vendedor, String midletSuite)
• Descripción
Permite crear un RecordStore. Sus parámetros son:
o nombre: Nombre del RecordStore
o crear: Dato lógico que indica si el RecordStore será creado en
caso no existiera
o modo: Dato entero que puede tener los valores indicados en la
tabla 2-1.
Constante Descripción
RecordStore.AUTHMODE_ANY Acceso desde cualquier MIDlet Suite
RecordStore.AUTHMODE_PRIVATE Acceso desde el MIDlet Suite creador
Tabla 2-1. Constantes de modo de acceso a un RecordStore
2.2.2 deleteRecordStore()
• Definición
public static void deleteRecordStore(String nombre)
• Descripción
Elimina el RecordStore especificado.
2.2.3 listRecordStores()
• Definición
public static String [] listRecordStores()
• Descripción
Devuelve un arreglo con los nombre de los RecordStores
disponibles.
2.2.4 addRecord()
• Definición
public int addRecord(byte [] datos, int inicio, int longitud)
• Descripción
Permite agregar un nuevo registro al RecordStore abierto. Para
ingresar un registro, este debe estar en forma de arreglo de bytes y se
pasara la posición inicial desde donde se insertará el dato y la cantidad
de bytes que ingresarán en el registro. El método devolverá el
identificador del registro ingresado.
2.2.5 setRecord()
• Definición
public void setRecord(int id, byte [] datos, int inicio,
int longitud)
• Descripción
Permite modificar el registro identificado con el parámetro “id” en el
RecordStore abierto. Para esto, el registro debe ingresar en forma de
arreglo de bytes y se pasará la posición inicial desde donde se insertará
el dato y la cantidad de bytes que ingresarán en el registro.
2.2.6 deleteRecord()
• Definición
public void deleteRecord(int id)
• Descripción
Elimina el registro identificado con el valor parámetro “id”.
2.2.7 getRecord()
• Definición
public byte [] getRecord(int id)
• Descripción
Devuelve el registro identificado con el valor parámetro “id”.
2.2.8 closeRecordStore()
• Definición
public void closeRecordStore()
• Descripción
Cierra el RecordStore.
2.2.9 getNumRecords()
• Definición
public int getNumRecords()
• Descripción
Devuelve la cantidad de registros que se encuentra almacenados en
el RecordStore.
2.2.10 getSize()
• Definición
public int getSize()
• Descripción
Retorna el tamaño de memoria utilizado por el RecordStore.
2.2.11 getSizeAvailable()
• Definición
public int getSizeAvailable()
• Descripción
Retorna el tamaño de memoria disponible.
3. Ejemplos
3.1.1 Enunciado
Construir una aplicación que realice lo siguiente:
• Mostrar un menú con el título “Agenda” y las siguientes opciones:
o Agregar, que carga una ventana para agregar nuevos registros
o Buscar, que carga una ventana para buscar y eliminar registros por su
identificador
• La ventana “Agregar” debe permitir el ingreso de 3 datos:
o Nombre (Alfanumérico, 50 caracteres)
o Email (correo electrónico, 50 caracteres)
o Teléfono (teléfono, 14 dígitos)
Además debe tener 3 botones:
o Registrar: Que grabará el registro en un RecordStore, mostrando en
una ventana el resultado de la operación y el identificador del registro
o Menú: Que regresa al menú inicial
o Próximo: Que limpia el valor de los controles
• La ventana “Buscar” debe permitir el ingreso de 1 dato:
o Identificador (Numérico, 3 dígitos)
Además debe tener 3 botones:
o Eliminar: Que eliminará el registro en el RecordStore usando el
identificador ingresado, mostrando en una ventana el resultado de la
operación
o Menú: Que regresa al menú inicial
o Buscar: Que busca el registro en el RecordStore usando el
identificador ingresado, mostrando el valor del registro en cada control,
o mostrando un mensaje indicando que el registro no existe
• La figura 3-1 indica como deberá verse la pantalla.
3.1.2 Código
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.Form;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.ItemCommandListener;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import javax.microedition.rms.RecordStoreNotOpenException;
// Creacion de menu
private List lstMenu = new List("Agenda", List.IMPLICIT,
new String [] {"Agregar", "Buscar", "Salir"}, null);
// Creacion de botones
private Command cmdMenu = new Command("Menu", Command.BACK, 2);
private Command cmdRegistrar = new Command("Registrar", Command.OK, 2);
private Command cmdProximo = new Command("Proximo", Command.OK, 2);
private Command cmdEliminar = new Command("Eliminar", Command.CANCEL, 2);
private Command cmdBuscar = new Command("Buscar", Command.CANCEL, 2);
public Agenda() {
// Para procesamiento de eventos del men
lstMenu.setCommandListener(this);
{
// Grabacion de un registro
try
{
// Se crea una cadena con los valores de todos los campos
String strRegistro = txfNombre.getString() + DELIMITADOR
+ txfEmail.getString() + DELIMITADOR
+ txfTelefono.getString();
try
{
// Se obtiene el identificador ingresado
int idRegistro = Integer.parseInt(txfId.getString());
altMensaje.setType(AlertType.INFO);
}
else
{
altMensaje.setString("Se produjo un error ");
altMensaje.setType(AlertType.ERROR);
}
dsp.setCurrent(altMensaje);
}
}
}
Resumen
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas:
http://www.mailxmail.com/curso/informatica/j2me
http://programacion.com/java/tutorial/ags_j2me/
http://leo.ugr.es/J2ME/MIDP/enlaces.htm
http://java.sun.com/javame/reference/apis/jsr118/
UNIDAD DE
APRENDIZAJE
3
SEMANA
12
TEMARIO
ACTIVIDADES PROPUESTAS
1. Estrategia de almacenamiento
Al diseñar la forma de almacenar los datos en un RecordStore, tomar en cuenta
que los datos se almacenan en forma de arreglo de bytes. No existen los tipos de
datos conocidos en una base de datos.
Al grabar los registros se sugiere:
• Convertir los datos a String;
• Concatenar todos los datos, separándolos por un delimitador constante;
• El valor de dicho delimitador es arbitrario, pero es necesario asegurarse que dicho
delimitador no exista en los elementos;
• El dato de tipo String que se haya obtenido se convierte a arreglo de bytes con el
método getBytes(), y dicho valor será el que finalmente se grabe en el
RecordStore.
Al leer los datos, realizar la operación inversa:
• Obtener los datos como arreglo de bytes y convertirlos en String
• Dividir los datos de acuerdo al delimitador constante
• Cada dato obtenido se convierte al tipo que corresponda
2. Clase RecordEnumeration
2.1. Definición
2.2. Creación
Donde:
• rf: Referencia a un filtro. Usado para recorrer la lista filtrada. Si es null, se
recorrerá el RecordStore sin ningun filtro, es decir, se recorrerá toda la lista.
2.3. Métodos
2.3.1 hasNextElement()
• Definición
public bolean hasNextElement()
• Descripción
Devuelve verdadero si existe un elemento siguiente, falso si no
existe, es decir, si se ha llegado al final del RecordStore.
2.3.2 hasPreviousElement()
• Definición
public boolean hasPreviousElement()
• Descripción
Devuelve verdadero si existe un elemento anterior, falso si no existe,
es decir, si se ha llegado al comienzo del RecordStore.
2.3.3 nextRecord()
• Definición
public byte [] nextRecord()
• Descripción
Devuelve un arreglo de bytes conteniendo el siguiente registro en el
RecordStore.
2.3.4 nextRecordId()
• Definición
public int nextRecordId()
• Descripción
Devuelve un identificador del siguiente registro en el RecordStore.
2.3.5 previousRecord()
• Definición
public byte [] previousRecord()
• Descripción
Devuelve un arreglo de bytes conteniendo el registro anterior del
RecordStore.
2.3.6 previousRecordId()
• Definición
public int previousRecordId()
• Descripción
Devuelve un identificador del registro anterior del RecordStore.
3. Ejemplos
3.1.1 Enunciado
Construir una aplicación que realice lo siguiente:
• Mostrar un formulario con el título “Agregar cita” y que permita ingresar los
siguientes datos:
o Fecha y hora
o Detalle de la cita (Alfanumérico, 100 caracteres)
o Tipo, que puede ser uno de los siguientes: Amigos, Familia, Trabajo,
Personal
Adicionalmente, debe tener 3 botones:
o Salir: para salir de la aplicación
o Agregar: para agregar la cita a un RecordStore y mostrar un mensaje
con el resultado de la operación
o Ver Lista: Para mostrar una lista de los registros ingresados
• La lista de los registros ingresados debe tener dos botones:
o Volver: para regresar a la ventana inicial
o Eliminar: Para eliminar los registros seleccionados y mostrar un
mensaje con el resultado de la operación
• La figura 3-1 indica cómo deberá verse la pantalla.
3.1.2 Código
Archivo AgendaRMS.java
import java.util.Date;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.ChoiceGroup;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.DateField;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.ItemCommandListener;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordStore;
public AgendaRMS() {
// Controles del formulario
stiAgregar.addCommand(cmdAgregar);
stiAgregar.setItemCommandListener(this);
stiAgregar.setDefaultCommand(cmdAgregar);
stiSalir.addCommand(cmdSalir);
stiSalir.setItemCommandListener(this);
stiSalir.setDefaultCommand(cmdSalir);
frm.append(dtfCita);
frm.append(txfItem);
frm.append(chgTipoCita);
frm.append(stiSalir);
frm.append(stiAgregar);
frm.addCommand(cmdVerLista);
frm.setCommandListener(this);
// Controles de la lista
lst.addCommand(cmdEliminar);
lst.addCommand(cmdVolver);
lst.setCommandListener(this);
}
{
RecordStore rs = null;
try
{
rs = RecordStore.openRecordStore("Agenda", true);
// <FECHAHORA><D><DETALLE><D><TIPO>
String strRegistro = String.valueOf(dtfCita.getDate().getTime())
+ DELIMITADOR + txfItem.getString()
+ DELIMITADOR + chgTipoCita.getSelectedIndex();
System.out.println(strRegistro);
if(lst.isSelected(i))
{
// Obtiene el identificador del registro y lo borra
String strRegistro = lst.getString(i);
String strIdRegistro = strRegistro.substring(0,
strRegistro.indexOf(":"));
int idRegistro = Integer.parseInt(strIdRegistro);
System.out.println(idRegistro);
rs.deleteRecord(idRegistro);
contador ++;
}
}
}
catch(Exception ex)
{
}
finally
{
cerrarRecordStore(rs);
}
return contador;
}
Archivo CitaBean.java
import java.util.Calendar;
import java.util.Date;
}
public long getId()
{
return this.id;
}
return String.valueOf(calendar.get(Calendar.DAY_OF_MONTH))
+ "/" + String.valueOf(calendar.get(Calendar.MONTH))
+ "/" + String.valueOf(calendar.get(Calendar.YEAR))
+ " " + strHora
+ ":" + strMinuto;
}
Resumen
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas:
http://www.mailxmail.com/curso/informatica/j2me
http://programacion.com/java/tutorial/ags_j2me/
http://leo.ugr.es/J2ME/MIDP/enlaces.htm
http://java.sun.com/javame/reference/apis/jsr118/
UNIDAD DE
APRENDIZAJE
3
SEMANA
13
TEMARIO
ACTIVIDADES PROPUESTAS
Interfaz RecordFilter
3.2. Definición
Es una interfaz usada para crear clases que definan un criterio de filtro. Dicho
criterio puede ser usado al recorrer un RecordStore.
3.3. Implementación
Ejemplo:
Este código filtra todos los registros que comiencen por “A”.
4. Interfaz RecordComparator
4.1. Definición
4.2. Creación
Constante Descripción
RecordComparator.PRECEDES Si el primer registro va antes que el segundo
RecordComparator.FOLLOWS Si el primer registro va después que el segundo
RecordComparator.EQUIVALENT Si ambos registros son equivalentes
Tabla 2-1. Constantes devueltas por el método compare
Ejemplo:
5. Ejemplos
5.1.1 Enunciado
Modificar la aplicación del capítulo anterior para que realice lo siguiente:
5.1.2 Código
Archivo AgendaRMS.java
import java.util.Date;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.ChoiceGroup;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.DateField;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.ItemCommandListener;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordStore;
public AgendaRMS() {
// Controles del formulario
stiAgregar.addCommand(cmdAgregar);
stiAgregar.setItemCommandListener(this);
stiAgregar.setDefaultCommand(cmdAgregar);
stiSalir.addCommand(cmdSalir);
stiSalir.setItemCommandListener(this);
stiSalir.setDefaultCommand(cmdSalir);
frm.append(dtfCita);
frm.append(txfItem);
frm.append(chgTipoCita);
frm.append(stiSalir);
frm.append(stiAgregar);
frm.addCommand(cmdVerLista);
frm.addCommand(cmdVentanaBusqueda);
frm.setCommandListener(this);
// Controles de la lista
lst.addCommand(cmdEliminar);
lst.addCommand(cmdVolver);
lst.setCommandListener(this);
dsp.setCurrent(alt, frm);
}
else
{
Alert alt = new Alert("Error", "Datos no validos", null,
AlertType.INFO);
dsp.setCurrent(alt,frm);
}
}
else if(c == cmdSalir)
{
destroyApp(false);
notifyDestroyed();
}
else if(c == cmdBuscar)
{
buscarRegistros();
}
}
System.out.println(strRegistro);
Archivo CitaBean.java
import java.util.Calendar;
import java.util.Date;
return cerosIzquierda(String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)))
+ "/" + cerosIzquierda(String.valueOf(calendar.get(Calendar.MONTH)+1))
+ "/" + String.valueOf(calendar.get(Calendar.YEAR))
+ " " + cerosIzquierda(String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)))
+ ":" + cerosIzquierda(String.valueOf(calendar.get(Calendar.MINUTE)));
Archivo ComparadorFiltro.java
import javax.microedition.rms.RecordComparator;
import javax.microedition.rms.RecordFilter;
Resumen
Usar la interfaz RecordFilter para crear clases que implementen un criterio de filtro,
el cual luego podrá ser usado al recorrer un RecordStore
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
http://www.mailxmail.com/curso/informatica/j2me
http://programacion.com/java/tutorial/ags_j2me/
http://leo.ugr.es/J2ME/MIDP/enlaces.htm
http://java.sun.com/javame/reference/apis/jsr118/
UNIDAD DE
APRENDIZAJE
3
SEMANA
14
TEMARIO
• Conectividad HTTP:
o Clase Connector
o Clase HTTPConnection
o Clase InputStream
o Clase OutputStream
ACTIVIDADES PROPUESTAS
1. Introducción
J2ME proporciona un conjunto de clases que pueden ser usados por los MIDlets
para poder comunicarse con cualquier punto de una red a la cual el dispositivo móvil
esté conectado. Generalmente, la red a la que nos conectamos es Internet, y los
puntos en la red son sitios web con quienes podemos comunicarnos usando los
protocolos http/HTTPS.
A continuación, se dan algunos ejemplos del uso de las comunicaciones en
aplicaciones J2ME:
• Validación de usuario y clave antes de ingresar a la aplicación
• Lectura de datos guardados en una base de datos central
• Envío de los datos ingresados en un RecordStore para ser grabados en una base
de datos central
Un aspecto importante, cuando se construye una aplicación de este tipo, es que
la parte correspondiente a la comunicación va siempre en un segundo hilo o proceso.
Esto es porque este tipo de conexión es generalmente lento, y podrían bloquear el
equipo si se usa un solo hilo o proceso. Asimismo, tomar en cuenta que las
conexiones deben cerrarse al finalizar la aplicación.
2. Clase Connector
2.1. Definición
Clase usada para crear los objetos de tipo Connection, que son las que se
usarán para conectarse.
2.2. Métodos
2.2.1 open()
• Definición
public static Connection open(String url)
public static Connection open(String url, int modo)
public static Connection open(String url, int modo,
boolean timeout)
• Descripción
Permite crear un objeto de tipo Connection. Sus parámetros son:
o url: Url del sitio a donde se desea conectarse
o modo: Modo de conexión. Los valores posibles se pueden ver en
la tabla 1-1
Constante Descripción
Connection.READ Solo lectura
Connection.WRITE Solo escritura
Connection.READ_WRITE Lectura y escritura
Tabla 1-1. Modos de conexión
3. Clase Connection
3.1. Definición
Clase que manipula la conexión con el sitio de red. De esta interfaz, heredan
varias sub interfaces según el protocolo. De este modo, para conectarse con un
sitio usando el protocolo http, se usara la interfaz HTTPConnection.
4. Clase HTTPConnection
4.1. Definición
4.2. Métodos
4.2.1 close()
• Definición
public void close()
• Descripción
Cierra la conexión.
4.2.2 getLength()
• Definición
public long getLength()
• Descripción
Obtiene la longitud de la respuesta del sito web.
4.2.3 getRequestMethod()
• Definición
• Descripción
Obtiene el método de comunicación con el sitio web. Los métodos
están datos por las constantes HTTPConnection.GET y
HTTPConnection.POST.
4.2.4 getRequestProperty()
• Definición
public String getRequestMethod(String propiedad)
• Descripción
Obtiene el valor de una propiedad de la consulta HTTP.
4.2.5 getResponseCode()
• Definición
public int getResponseCode()
• Descripción
Obtiene el codigo de respuesta del sitio web. La lista de valores es
grande. A continuación, algunos de ellos:
o HTTPConection.HTTP_OK: Conexión correcta
o HTTPConection.HTTP_NOT_FOUND: Sitio no encontrado
o HTTPConection.HTTP_FORBIDDEN: Sitio prohibido
o HTTPConection.HTTP_INTERNAL_ERROR: Error interno
4.2.6 openInputStream()
• Definición
public InputStream openInputStream()
• Descripción
Obtiene un objeto de tipo InputStream, necesario para leer los datos
del sitio web.
4.2.7 openOutputStream()
• Definición
public OutputStream openOutputStream()
• Descripción
Obtiene un objeto de tipo OutputStream, necesario para escribir los
datos hacia el sitio web.
4.2.8 setRequestMethod()
• Definición
public void setRequestMethod(String metodo)
• Descripción
Modifica el método de comunicación por el sitio web. Los métodos
están dados por las constantes HTTPConnection.GET y
HTTPConnection.POST.
4.2.9 setRequestProperty()
• Definición
public void setRequestMethod(String propiedad, String valor)
• Descripción
Cambia el valor de una propiedad de la consulta HTTP.
5. Clase InputStream
5.1. Definición
5.2. Métodos
5.2.1 close()
• Definición
public void close()
• Descripción
Cierra el flujo de entrada.
5.2.2 read()
• Definición
public int read()
public int read(byte [] datos)
public int read(byte [] datos, int inicio, int longitud)
• Descripción
Lee los datos de respuesta del sitio web. En el primer caso,
devuelve un entero leído del sitio web. En los otros casos, los bytes
leídos se guardan en el arreglo “datos” y se devuelve la cantidad de
bytes. Sus parámetros son:
o datos: Arreglo que contendrá los datos leídos
o inicio: Índice en el arreglo donde se comenzarán a grabar los
datos
6. Clase OutputStream
6.1. Definición
6.2. Métodos
6.2.1 close()
• Definición
public void close()
• Descripción
Cierra el flujo de salida.
6.2.2 read()
• Definición
public void write(int dato)
public void write(byte [] datos)
public void write(byte [] datos, int inicio, int longitud)
• Descripción
Escribe los datos al sitio web. En el primer caso, escribe el dato
entero especificado. En los otros casos, se escribirán los bytes del
arreglo “datos”. Sus parámetros son:
o datos: Arreglo que contendrá los datos que van a ser escritos
o inicio: Indice en el arreglo donde se comienzan los datos que
van a ser escritos
o longitud: Cantidad de bytes en el arreglo que van a ser escritos
7. Ejemplos
7.1.1 Enunciado
Construir una aplicación que realice lo siguiente:
• Mostrar un formulario con el título “Login” y que permita ingresar los
siguientes datos:
o Usuario (alfanumérico, 10 caracteres)
7.1.2 Código
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
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.Item;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public InicioSesionHTTP()
{
frm.append(txfUsuario);
frm.append(txfClave);
frm.append(stiResultado);
frm.addCommand(cmdAceptar);
frm.addCommand(cmdSalir);
frm.setCommandListener(this);
}
}
System.out.println("fin");
}
catch(Exception ex)
{
// Mostrar los datos devueltos
stiResultado.setText("Error: " + ex.toString());
System.out.println("Error: " + ex.toString());
}
finally
{
// Cerrar la conexion
if (http != null)
{
try
{
http.close();
}catch(Exception ex)
{}
}
}
}
}
Resumen
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
http://www.mailxmail.com/curso/informatica/j2me
http://programacion.com/java/tutorial/ags_j2me/
http://leo.ugr.es/J2ME/MIDP/enlaces.htm
http://java.sun.com/javame/reference/apis/jsr118/