CLASE PRINCIPAL
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Atlas;
// Importo las librerías necesarias para trabajar
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
/**
* @author glop
*/
public class midletAtlas extends MIDlet implements CommandListener {
private Display pantalla; // Display, pantalla del midlet.
private Form contenedor; // Form, contenedor donde se cargan los diferentes elementos.
private List continentes; // Lista implícita de continentes. Se genera un evento al elegir un continente.
private Command siguiente; // Comando que solicita la siguiente pantalla. Se utiliza en la pantalla de presentacion.
private Command probar; // Comando que comienza la aplicación después de las instrucciones.
private Command terminar; // Comando salir
private Command verPaises; // Comando que permite ver los países del continente elegido
private Command volverContinentes; // Comando que permite volver al menú de continentes
private Command volverContinente; // Comando que permite volver al continente con la descripción y la lista de países
private Command adios;
private ChoiceGroup paises; // Lista de selección de países.
private continentes continente; // Objecto de la clase continentes.
private Alert vacio;
public midletAtlas() throws IOException {
pantalla = Display.getDisplay(this); // Se indica a la pantalla que utilice la pantalla del midlet
presentacion(); // Llama al método presentacion(). Éste presenta la aplicación y su autor.
}
// Método que implementa un formulario con el título de la aplicación, su autor y una imagen.
private void presentacion() throws IOException {
contenedor = new Form(""); // Formulario sin título
contenedor.append("Tarea 3 -- Midlet Mensajero"); // Se añade texto
Image imag = Image.createImage("imagenes/java.png"); // Se crea una imagen
ImageItem elemento= new ImageItem ("", imag, ImageItem.LAYOUT_CENTER, ""); // La imagen se pasa a un ImageItem para
// definir algunos detalles
contenedor.append(elemento); // Se añade el ImageItem
contenedor.append("Gabriel López Marcos"); // Se añade texto
// Se añaden los comandos que tendrá la pantalla
terminar = new Command("Terminar",Command.EXIT,0);
siguiente = new Command("Siguiente",Command.OK,1);
contenedor.addCommand(terminar);
contenedor.addCommand(siguiente);
contenedor.setCommandListener(this); // Se asigna el oyente
pantalla.setCurrent(contenedor); // La pantalla activa es ésta.
}
// Método que implementa una formulario con las instrucciones de la aplicación
private void instrucciones() {
contenedor = new Form("Instrucciones"); // Se crea el formulario con título
// Se añaden las instrucciones
contenedor.append("La aplicación ofrece una lista de continentes, pulsa el botón central para elegir uno de ellos\n"
+ "En la pantalla aparecerá el nombre del continente elegido, una imagen del mismo y 5 países para elegir\n"
+ "los países se pueden elegir de forma múltiple, elige los que quieras ver y pulsa el botón 'ver países'\n"
+ "En la pantalla aparecerán los países elegidos junto a una imagen.\n"
+ "Puedes volver atrás en cualquier momento a través de los botones de navegación superiores.");
// Se añaden los comandos que tendrá la pantalla
terminar = new Command("Terminar", Command.EXIT,0);
probar = new Command("Probar",Command.OK,1);
contenedor.addCommand(terminar);
contenedor.addCommand(probar);
contenedor.setCommandListener(this); // Se asigna el oyente
pantalla.setCurrent(contenedor); // La pantalla activa es ésta.
}
// Método que implementa una lista con los continente para elegir
private void verContinentes() {
continentes = new List("Continentes",List.IMPLICIT); // Se crea una lista implícita. Cuando se elija un continente,
// Desencadenará un evento
// Se añaden los continentes
continentes.insert(0, "Europa", null);
continentes.insert(1, "África", null);
continentes.insert(2, "Asia", null);
continentes.insert(3, "América", null);
continentes.insert(4, "Oceanía", null);
// Se añade el comando que tendrá la pantalla
terminar = new Command("Terminar", Command.EXIT,1);
continentes.addCommand(terminar);
continentes.setCommandListener(this); // Se asigna el oyente
pantalla.setCurrent(continentes); // La pantalla activa es ésta.
}
// Inicio de la aplicación
public void startApp() {
// La pantalla activa al inicio de la aplicación, y si vuelve del estado de pausa, es siempre el contenido del contenedor.
// Recordemos que el contenedor es un form donde voy añadiendo lo que necesito en cada momento.
pantalla.setCurrent(contenedor);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
// Método que carga un continente concreto. En éste caso América.
// Se carga la descripción y se añaden los países completos. De este modo, el objeto está instanciado para recuperar
// los datos en cualquier momento.
private void cargaAmerica() throws IOException {
continente = new continentes(); // Instancia vacía del objeto continente.
continente.setNombre("América"); // Asigno el nombre
// Asigno una descripción
continente.setDescripcion("América es el segundo continente más grande del planeta, después de Asia."
+ " Ocupa gran parte del hemisferio occidental de la Tierra. Se extiende desde el océano Glacial Ártico"
+ " por el norte hasta el Cabo de Hornos por el sur, en la confluencia de los océanos Atlántico y Pacífico,"
+ " los cuales a su vez delimitan al continente por el este y el oeste, respectivamente.");
// Asigno una imagen. Llamo al método redimensionar que me devuelve la imagen con la proporción adecuada
continente.setImagen(redimensionar(Image.createImage ("imagenes/america.png")));
// Añado los países. Introduzco la posición que ocupan en el array, el nombre y la ruta de la imagen correspondiente.
continente.addPais(0, "Bahamas", "imagenes/bahamas.png");
continente.addPais(1, "Belice", "imagenes/belice.png");
continente.addPais(2, "Costa Rica", "imagenes/costarica.png");
// Ya tengo el objeto continente con los datos que necesito. Ahora creo un form donde se incluirán.
contenedor = new Form(continente.getNombre()); // Creo el form con el nombre del continente.
contenedor.append(continente.getImagen()); // Añado la imagen.
contenedor.append(continente.getDescripcion()); // Añado la descripción.
paises= new ChoiceGroup ("Algunos países:", Choice.MULTIPLE); // Añado un ChoiceGroup de países del continente.
for (int c=0;c<continente.paises.length;c++) { // Recorro todos el array de países y se los agrego al ChoiceGroup
paises.append(continente.nombrePais(c), null);
}
contenedor.append(paises); // Añado el Choice al formulario
// Añado los comandos que tendrá la aplicación
volverContinentes = new Command("Volver", Command.BACK,0); // Este comando estará situado en la parte superior.
verPaises = new Command("Ver países", Command.OK,1); // Comando que lanza la pantalla de países. Con los países elegidos.
contenedor.addCommand(volverContinentes);
contenedor.addCommand(verPaises);
contenedor.setCommandListener(this); // Asigno el oyente
pantalla.setCurrent(contenedor); // La pantalla activa es ésta.
}
// Carga del continente Europa
private void cargaEuropa() throws IOException {
continente = new continentes();
continente.setNombre("Europa");
continente.setDescripcion("Europa es uno de los continentes que forman el supercontinente euroasiático,"
+ " situado entre los paralelos 36º y 70º de latitud norte. De forma convencional y por motivos históricos"
+ " es considerada un continente, tras la delimitación realizada por el geógrafo ruso Vassili Tatichtchev"
+ " quien deseaba señalar la pertenencia de Rusia a Europa y no a Asia.");
continente.setImagen(redimensionar(Image.createImage ("imagenes/europa.png")));
continente.addPais(0, "Chipre", "imagenes/chipre.png");
continente.addPais(1, "Georgia", "imagenes/georgia.png");
continente.addPais(2, "Letonia", "imagenes/letonia.png");
contenedor = new Form(continente.getNombre());
contenedor.append(continente.getImagen());
contenedor.append(continente.getDescripcion());
paises= new ChoiceGroup ("Algunos países:", Choice.MULTIPLE);
for (int c=0;c<continente.paises.length;c++) {
paises.append(continente.nombrePais(c), null);
}
contenedor.append(paises);
volverContinentes = new Command("Volver", Command.BACK,0);
verPaises = new Command("Ver países", Command.OK,1);
contenedor.addCommand(volverContinentes);
contenedor.addCommand(verPaises);
contenedor.setCommandListener(this);
pantalla.setCurrent(contenedor);
}
// Carga del continente África
private void cargaAfrica() throws IOException {
continente = new continentes();
continente.setNombre("África");
continente.setDescripcion("África es el tercer continente (después de Asia y América) del mundo por extensión"
+ " territorial. Limita al norte con el mar Mediterráneo, al oeste con el océano Atlántico, al sur con"
+ " la conjunción de los océanos Atlántico e Índico y al este con el mar Rojo y el océano Índico.");
continente.setImagen(redimensionar(Image.createImage ("imagenes/africa.png")));
continente.addPais(0, "Burundi", "imagenes/burundi.png");
continente.addPais(1, "Chad", "imagenes/chad.png");
continente.addPais(2, "Etiopía", "imagenes/etiopia.png");
contenedor = new Form(continente.getNombre());
contenedor.append(continente.getImagen());
contenedor.append(continente.getDescripcion());
paises= new ChoiceGroup ("Algunos países:", Choice.MULTIPLE);
for (int c=0;c<continente.paises.length;c++) {
paises.append(continente.nombrePais(c), null);
}
contenedor.append(paises);
volverContinentes = new Command("Volver", Command.BACK,0);
verPaises = new Command("Ver países", Command.OK,1);
contenedor.addCommand(volverContinentes);
contenedor.addCommand(verPaises);
contenedor.setCommandListener(this);
pantalla.setCurrent(contenedor);
}
// Carga del continente Asia
public void cargaAsia() throws IOException {
continente = new continentes();
continente.setNombre("Asia");
continente.setDescripcion("Asia o continente asiático es el continente más extenso y poblado de la Tierra"
+ " que, con cerca de 44 millones de km², supone el 8,70% del total de la superficie terrestre"
+ " y el 29,45% de las tierras emergidas y, con 4.200.000.000 de habitantes, el 60% de la población mundial.");
continente.setImagen(redimensionar(Image.createImage ("imagenes/asia.png")));
continente.addPais(0, "Birmania", "imagenes/birmania.png");
continente.addPais(1, "Corea del Norte", "imagenes/coreanorte.png");
continente.addPais(2, "Israel", "imagenes/samoa.png");
contenedor = new Form(continente.getNombre());
contenedor.append(continente.getImagen());
contenedor.append(continente.getDescripcion());
paises= new ChoiceGroup ("Algunos países:", Choice.MULTIPLE);
for (int c=0;c<continente.paises.length;c++) {
paises.append(continente.nombrePais(c), null);
}
contenedor.append(paises);
volverContinentes = new Command("Volver", Command.BACK,0);
verPaises = new Command("Ver países", Command.OK,1);
contenedor.addCommand(volverContinentes);
contenedor.addCommand(verPaises);
contenedor.setCommandListener(this);
pantalla.setCurrent(contenedor);
}
// Carga del continente Oceanía
public void cargaOceania() throws IOException {
continente = new continentes();
continente.setNombre("Oceanía");
continente.setDescripcion("Oceanía es un continente insular de la Tierra constituido por la plataforma"
+ " continental de Australia, las islas de Nueva Guinea, Nueva Zelanda y los archipiélagos coralinos"
+ " y volcánicos de Melanesia, Micronesia y Polinesia.");
continente.setImagen(redimensionar(Image.createImage ("imagenes/oceania.png")));
continente.addPais(0, "Australia", "imagenes/australia.png");
continente.addPais(1, "Nauru", "imagenes/nauru.png");
continente.addPais(2, "Samoa", "imagenes/samoa.png");
contenedor = new Form(continente.getNombre());
contenedor.append(continente.getImagen());
contenedor.append(continente.getDescripcion());
paises= new ChoiceGroup ("Algunos países:", Choice.MULTIPLE);
for (int c=0;c<continente.paises.length;c++) {
paises.append(continente.nombrePais(c), null);
}
contenedor.append(paises);
volverContinentes = new Command("Volver", Command.BACK,0);
verPaises = new Command("Ver países", Command.OK,1);
contenedor.addCommand(volverContinentes);
contenedor.addCommand(verPaises);
contenedor.setCommandListener(this);
pantalla.setCurrent(contenedor);
}
// Control de los comandos utilizados
public void commandAction(Command c, Displayable d) {
if (c == siguiente) { // Control del comando siguiente. Se usa en la pantalla de presentación
instrucciones();
}
if (c == probar) { // Control del comando probar. Se usa en la pantalla de instrucciones
verContinentes();
}
if (c == terminar) { // Control del comando terminar. Se usa en varias pantallas.
creditos();
if (c == adios) {
destroyApp (true);
notifyDestroyed ();
}
}
if (c==List.SELECT_COMMAND) { // Control de los eventos producidos por la lista implícita de los continentes.
int indice = continentes.getSelectedIndex();
try {
switch(indice) { // Según el índice, carga el continente que se elija
case 0:
cargaEuropa();
break;
case 1:
cargaAfrica();
break;
case 2:
cargaAsia();
break;
case 3:
cargaAmerica();
break;
case 4:
cargaOceania();
break;
}
} catch (IOException ex) {
}
}
if (c == volverContinentes) { // Control del comando volverContinente. Se usa para volver a la lista de continentes.
pantalla.setCurrent(continentes);
}
if (c == verPaises) { // Control del comando verpaises. Se usa para ver una pantalla con los países elegidos
try {
cargarPaises(continente); // Llama al método que carga los países solicitados
} catch (IOException ex) {
}
}
if (c==volverContinente) { // Control del comando volverContinente. Se usa para salir de la pantalla de países
// y volver a la del continente padre.
pantalla.setCurrent(contenedor);
}
if (c == adios) {
pantalla.setCurrent(null);
}
}
// Método que carga los países en función de continente elegido. En el momento en que se llame este método, el objeto
// continente ya estará instanciado con los datos que corresponda.
public void cargarPaises(continentes continente) throws IOException {
int npaises=0; // Variable que almacena el total de paises que se eligieron mostrar
Form contenedor_paises = new Form(continente.getNombre()); // Se crea el form con el nombre del continente.
for (int co=0;co<paises.size();co++) { // Se recorre el array de países. Un array bidimensional que almacena
// el nombre y la imagen.
if (paises.isSelected(co)) { // Sólo nos interesan los países que se marcaron.
contenedor_paises.append(continente.paises[co][0]); // Añado el nombre
// Añado la imagen. Ésta estará ya proporcionada a la pantalla ya que llamo al método redimensionar.
contenedor_paises.append(redimensionar(Image.createImage(continente.paises[co][1])));
npaises ++; // Se suma un nuevo elemento
}
}
if (npaises==0) { // Si no se seleccionó ningún país, aparece un alerta y la pantalla activa es dicha alerta.
vacio= new Alert ("No se eligieron países", "Pulse aceptar para"
+ " volver al continente", null, AlertType.INFO);
vacio.setTimeout (Alert.FOREVER);
pantalla.setCurrent(vacio);
} else { // Si se seleccionaron países los añado al form.
// Añado los comandos que tendrá la pantalla.
volverContinente = new Command("Volver", Command.BACK,1); // El botón estará ubicado en la parte superior.
contenedor_paises.addCommand(volverContinente);
contenedor_paises.setCommandListener(this); // Asigno el oyente
pantalla.setCurrent(contenedor_paises); // La pantalla activa es ésta.
}
}
public void creditos() {
contenedor = new Form ("Créditos");
contenedor.append("Tarea realizada por:\n"
+ "Gabriel López Marcos\n"
+ "para DAM\n"
+ "8/Agosto/2013");
adios = new Command("Adiós",Command.OK,0);
contenedor.addCommand(adios);
contenedor.setCommandListener(this);
pantalla.setCurrent(contenedor);
}
// Método que devuelve una imagen proporcionada a la pantalla desde una imagen tomada por parámetro
private Image redimensionar(Image imagen) {
int anchoImagenOriginal = imagen.getWidth(); // Se toma el ancho de la imagen original
int altoImagenOriginal = imagen.getHeight(); // Se toma el alto de la imagen original
int anchoPantalla = Display.getDisplay(this).getCurrent().getWidth(); // Se toma el ancho de la pantalla
if (anchoImagenOriginal<anchoPantalla) { // Si la imagen es más estrecha, no hace falta redimensionar
return imagen; // La retornamos tal cual
}
Image imagenTemporal = Image.createImage(anchoPantalla, altoImagenOriginal); // Se crea una imagen temporal con las
// medidas de nuestra imagen.
Graphics g = imagenTemporal.getGraphics(); // Utilizo la clase graphics
int ratio = (anchoImagenOriginal << 16) / anchoPantalla; // Se calcula el nuevo ratio
int pos = ratio/2;
//Bucle de redimensión horizontal
for (int x = 0; x < anchoPantalla; x++) {
g.setClip(x, 0, 1, altoImagenOriginal);
g.drawImage(imagen, x - (pos >> 16), 0, Graphics.LEFT | Graphics.TOP);
pos += ratio;
}
// La nueva imagen tiene un ancho ajustado a la pantalla
Image imagenRedimensionada = Image.createImage(anchoPantalla, anchoPantalla);
g = imagenRedimensionada.getGraphics();
ratio = (altoImagenOriginal << 16) / anchoPantalla;
pos = ratio/2;
// Bucle de redimensión vertical
for (int y = 0; y < anchoPantalla; y++) {
g.setClip(0, y, anchoPantalla, 1);
g.drawImage(imagenTemporal, 0, y - (pos >> 16), Graphics.LEFT | Graphics.TOP);
pos += ratio;
}
return imagenRedimensionada; // Retorna la imagen redimensionada
}
}
CLASE CONTINENTES
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Atlas;
// Importo las clases necesarias para trabajar
import java.io.IOException;
import javax.microedition.lcdui.Image;
/**
* Objeto continente
* @author glop
*/
public class continentes {
private String nombre; // Variable que almacena el nombre del continente.
private String descripcion; // Variable que almacena la descripción del continente.
private Image imagen; // Variable que almacena la imagen con continente.
// Array bidimensional que almacena los paises pertenecientes al continente. De los países se almacena el nombre y
// la ruta de la imagen asociaciada. De ahí la necesidad de utilizar un array de este tipo.
String[][] paises;
// Instancia el objeto vacío
public continentes() {
nombre="";
descripcion="";
paises = new String[3][2]; // Se inicializa el objeto con 5 filas y dos columnas.
}
// Metodo que asigna el nombre.
public void setNombre(String nomb) {
this.nombre = nomb;
}
// Método que asigna la descripción.
public void setDescripcion(String descrip) {
this.descripcion = descrip;
}
// Método que asigna la imagen.
public void setImagen(Image imag) {
this.imagen = imag;
}
// Método que devuelve el nombre.
public String getNombre() {
return this.nombre;
}
// Método que devuelve la descripción.
public String getDescripcion() {
return this.descripcion;
}
// Método que devuelve la imagen
public Image getImagen() {
return this.imagen;
}
// Método que añade un nuevo país al array bidimensional de países.
// Requiere la posición, el nombre del país y la ruta de la imagen asociada.
public void addPais(int posicion,String nombpais, String rutaimg) throws IOException {
paises[posicion][0] = nombpais;
paises[posicion][1] = rutaimg;
}
// Devuelve el nombre del país, indicando la posición dentro del array.
// Se utiliza en los bucles for cuando se recorre el array de países.
public String nombrePais(int posicion) {
return paises[posicion][0].toString();
}
// Devuelve la imagen del país, indicando la posición dentro del array.
// Se utiliza en los bucles for cuando se recorre el array de países.
public Image imagen(int posicion) throws IOException {
Image imag=null;
imag = Image.createImage(paises[posicion][1]); // Crea una imagen a partir de la ruta almacenada en el array
return imag;
}
}