Posts

Variables de Caracteres, char

En java también existen las variables tipo char, como en el c de toda la vida. Son variables que contienen un único caracter alfabético o especial.

/**
* ValoresCaracteres
* Clase que muestra la declaración de variables de caracteres
*
* Para compilar:
*   javac ValoresCaracteres.java
*
* Para ejecutarlo:
*   java ValoresCaracteres
*/
 
 
/**
* clase ValoresCaracteres
* Muestra la declaración de booleanos: son variables que solo
* pueden contener un caracter, encerrado en comillas simples
* por ejemplo 'a'  
*
* @author Pello Altadill
*/
public class ValoresCaracteres {
    
    /**
    * main
    * Función principal
    * esta función es la que se inicia directamente al ejecutar el programa
    */
    public static void main (String args[])
    {
        // Solo pueden ser true o false
        char caracter = 'A';
        char ultima = 'z';
        
        // Los especiales comienzan por \
        char nuevaLinea = '\n';
        char tabulacion = '\t';
        char retornoCarro = '\r';
        char comillaSimple = '\'';
        char contrabarra = '\\';
        char dobleComillas = '\"';
        char formFeed = '\f';
        
        // Vamos a probar a mostrarlos por pantalla: concatenamos con +
        System.out.println("Primera letra " + caracter + " y última: " + ultima);
 
        System.out.println("Con la \\ usamos caracteres especiales");
        System.out.println("Que parezca un \"accidente\" ");
        
        System.out.println("Vamos a saltar \n y ahora otra vez: " + nuevaLinea);
        System.out.println(tabulacion + " Vamos a ver: " + nuevaLinea + " y ahora \r");
    }
}

 


Variables Reales

Así se manejan las variables numéricas de números reales. Atención a las constantes float.

/**
* ValoresReales
* Clase que muestra la declaración de variables numéricas <b>de coma flotante</b>
*
* Para compilar:
*   javac ValoresReales.java
*
* Para ejecutarlo:
*   java ValoresReales
*/
 
 
/**
* clase ValoresReales
* Muestra la declaración de tipos numéricos reales o de coma flotante:
*  float   : real precisión simple, 4 bytes
*  double  : real precisión doble, 4 bytes
*
* @author Pello Altadill
*/
public class ValoresReales {
    
    /**
    * main
    * Función principal
    * esta función es la que se inicia directamente al ejecutar el programa
    */
    public static void main (String args[])
    {
        // En los tipos reales debemo usar un . en lugar de , para las decimales
        float temperatura;
        // Al asginar valor le ponemos la F para distinguir del tipo double
        float peso = 78.9F;
 
        double saldoCuentaCorriente = 3423343.43D;
        // Los valores altos se pueden abreviar:
        // esto sería 4.6 multiplicado por 10 elevado a 9.
        double masaJupiter = 4.6E+9D;
        
        
        // Vamos a probar a mostrarlos por pantalla: concatenamos con +
        System.out.println("Tu peso es : " + peso + ", y tu saldo: " + saldoCuentaCorriente);
 
        System.out.println("La masa de Jupiter: " + masaJupiter);
    }
}


Variables Numéricas enteras

Este es un ejemplo de declaración de variables numéricas

/**
* ValoresEnteros
* Clase que muestra la declaración de variables numéricas enteras
*
* Para compilar:
*   javac ValoresEnteros.java
*
* Para ejecutarlo:
*   java ValoresEnteros
*/
 
// Librería necesaria para trabajar con la entrada/salida
import java.io.*;
 
/**
* clase ValoresEnteros
* Muestra la declaración de tipos numéricos enteros básicos:
*  byte   : 1 byte
*  short  : entero corto, 2 bytes
*  int    : enter, 4 bytes
*  long   : entero largo, 8 bytes
*
* @author Pello Altadill
*/
public class ValoresEnteros {
    
    /**
    * main
    * Función principal
    * esta función es la que se inicia directamente al ejecutar el programa
    */
    public static void main (String args[])
    {
        // Declaración de variables: tipo nombre;
        byte dias;
        short contador;
        
        // Declaración y asignación de valor
        // tipo nombre = valor inicial;
        short resultado = 42;
        
        // Declaración de varias variables del mismo tipo
        short codigo, edad, media;
        
        // Declaración y asignación a varias a la vez:
        int i, j, k;
        
        i = j = k = 0;
        
        // El tipo long
        long sueldoFutbolista = 23489343;
        long valorGoogle = 666000666;
        
        // Vamos a probar a mostrarlos por pantalla: concatenamos con +
        System.out.println("El sentido de la vida es: " + resultado);
 
        System.out.println("El sueldo de un futbolista medio es: " + sueldoFutbolista);
    }
}

 


Javajutsu: Argumentos por consola en java

Vamos a ver cómo se recogen argumentos por la línea de comandos. Se hace igual que en c

/**
* Argumentos
* Clase que muestra cómo recoger argumentos de la línea de comandos
*
* Para compilar:
*   javac Argumentos.java
*
* Para ejecutarlo:
*   java Argumentos argumento
*/
 
// Librería necesaria para trabajar con la entrada/salida
import java.io.*;
 
/**
* clase Argumentos
* Muestra cómo recoger parámetros de la linea de comandos
* es decir, cuando ejecutamos el programa:
*   java Argumentos ejemplo_de_argumento
* tras el nombre del programa podemos poner lo que queramos como
* parámetro. Para recoger los valores usaremos la variable args[]
*
* @author Pello Altadill
*/
public class Argumentos {
    
    /**
    * main
    * Función principal
    * esta función es la que se inicia directamente al ejecutar el programa
    */
    public static void main (String args[])
    {
        // Vamos a suponer que nos han pasado algún argumento,
        // Los argumentos los recoge automáticamente la variable
        // args[]. El primer argumento sería args[0], el segundo args[1], etc...
        
        System.out.println("¡Hola Mundo! me has pasado: " + args[0]);
        // Lo pasariamos así:
        //   C:\jdk>java Argumentos blablabla
        // ATENCIÓN, si NO le pasamos nada el programa casca con una excepción
    }
}


JavaJutsu

Bueno, llegó la hora de darle al java. A lo largo de las siguientes entradas iremos conociendo este lenguaje y algunas herramientas de desarrollo.

Empezaremos con los simple, con las manos desnudas, editor, compilador y línea de comandos. Y poco a poco iremos conociendo las herramientas de poder

/**
* HolaMundo
* Clase que simplemente muestra un mensaje por pantalla
*
* Para compilar:
*   javac HolaMundo.java
*
* Para ejecutarlo:
*   java HolaMundo
*/


    

Las referencias
Una referencia es otra forma de acceder a un dato, una especie de alias. Cualquier operacion sobre una referencia afectara a ese dato al que hace referencia.

<?xml version="1.0"?>
<!-- NOTA: Asegúrate de que el fichero lo editas en utf-8 -->
<!-- NOTA: conviene hacer clean y luego compilar -->
<!-- Para generar: ant [tarea] o ant -buildfile [fichero.xml] [tarea] -->
<project name="build.xml de ejemplo" default="pasartest" basedir=".">

    <property name="dir.src" value="src"/>
    <property name="dir.build" value="build"/>
    <property name="dir.dist" value="dist"/>

    <!-- Genera los directorios de salida: ant preparar -->
    <target name="preparar" description="Crea los directorios">
        <mkdir dir="${dir.build}"/>
        <mkdir dir="${dir.dist}"/>
    </target>

    <!-- Elimina todo lo creado: ant clean -->
    <target name="clean" description="Elimina todos los ficheros generados">
        <delete dir="${dir.build}"/>
        <delete dir="${dir.dist}"/>
    </target>

    <!-- Compilación, primero hace la tarea preparar: ant compilar -->
    <target name="compilar" depends="preparar" description="Compilar todo.">
        <javac srcdir="${dir.src}" destdir="${dir.build}"/>
    </target>
    
    <!-- Establece el classpath -->
    <path id="classpath.proyecto">
        <pathelement path="${dir.build}"/>
    </path>

    <!-- Ejecuta los test unitarios -->
    <target name="pasartest" depends="compilar" description="Ejecutar test junit">
        <junit printsummary="on"
            fork="false"
            haltonfailure="false"
            failureproperty="tests.failed"
            showoutput="true">

            <classpath refid="classpath.proyecto"/>
            <formatter type="brief" usefile="false"/>
            
            <batchtest>
                <fileset dir="${dir.src}">
                    <include name="**/Test*.java"/>
                </fileset>
            </batchtest>
        </junit>
    
        <fail if="tests.failed">
                !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                ATENCIÓN. HAN CASCADO ALGUNOS TESTS.
                ECHA UN OJO A LOS RESULTADOS.
                !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        </fail>
    </target>

    <!-- Genera un fichero jar, depende de la tarea compile: ant jar -->
    <target name="jar" depends="compilar" description="Genera un fichero jar en el directorio 'dist'.">
        <jar jarfile="${dir.dist}/proyecto.jar" basedir="${dir.build}"/>
    </target>
    
</project>


Este midlet tiene varias partes:

  1. Por un lado está el Midlet o aplicación para el móvil
  2. Una clase tipo Canvas para hacer los gráficos
  3. Una clase hilo que se utiliza para que el canvas pinte una y otra vez con pausas.

/*
 * RandomCircles
 * Midlet que usa una pantalla de tipo Canvas para crear gráficos
 */
package hello;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;

public class InfiniteCircles extends MIDlet implements CommandListener {
    private Command exitCommand;
    private Display pantalla;
    private CanvasForInfinite screen;
    private Repainter repintar;

    public InfiniteCircles () {
        // Tomamos la pantalla
       pantalla = Display.getDisplay(this);

       // Creamos el comando para salir
        exitCommand = new Command("Exit", Command.EXIT, 2);

        // Asociamos a Screen nuestro Canvas especial
        screen = new CanvasForInfinite();

        // Establecemos el comando para salir
        screen.addCommand(exitCommand);
        screen.setCommandListener(this);
        repintar = new Repainter(pantalla,screen);
    }

    /**
     * startApp
     * se ejecuta al inicio de la aplicación
     */
    public void startApp() throws MIDletStateChangeException {
        // Establecemos el formulario en la pantalla
        pantalla.setCurrent(screen);
        repintar.start();
    }

    /**
     * pauseApp
     * se ejecuta en caso de pausar la aplicación
     */
    public void pauseApp() {
    }

    /**
     * destroyApp
     * se ejecuta al terminar la aplicación
     */
    public void destroyApp(boolean unconditional) {
    }

    public void commandAction(Command c, Displayable s) {
      if (c == exitCommand) {
         destroyApp(false);
          notifyDestroyed();
     }
    }
}

class CanvasForInfinite extends Canvas  {

    // Dentro de canvas debe existir esta función
    public void paint(Graphics g) {
        // Declaramos variables para coordenadas, anchura, altura y radio
        int x,y,w,h,r,maxx, maxy;
        // Variable para generar números aleatorios
        Random rnd = new Random();

        maxx= maxy = x = y = w = h = r = 0;

        maxx = this.getWidth();
        maxy = this.getHeight();
        //try {

        for (int i = 0;i<5;i++)
        {
            // Establecemos color (r,g,b)
            g.setColor( rnd.nextInt(255),  rnd.nextInt(255), rnd.nextInt(255));
           //g.drawArc(rnd.nextInt(maxx), rnd.nextInt(maxy), maxx/2, maxy/2, 0, 360);

           // Para hacer estrellas
           //g.drawArc(rnd.nextInt(maxx), rnd.nextInt(maxy), 1, 1, 0, 360);
           g.drawArc(rnd.nextInt(maxx), rnd.nextInt(maxy), rnd.nextInt(4), rnd.nextInt(4), 0, 360);


             // dibujamos un arco, completo: 360

            //g.drawArc(rnd.nextInt(maxx), rnd.nextInt(maxy), rnd.nextInt(), rnd.nextInt(), 0, 360);
        }
            //g.drawString("Epa", 0, 0, Graphics.HCENTER | Graphics.TOP);
            //g.drawString("Vamos",(getWidth() / 2),0 Graphics.HCENTER | Graphics.TOP);
  /*
   } catch (InterruptedException iex) {
            g.drawString("Excepción: " + iex.getMessage(), 0, 0, Graphics.HCENTER | Graphics.TOP);
        }
  */
        }
}

 

//
// Y ahora la clase tipo runnable, es decir, un thread que se ejecuta en paralelo al midlet.
// Sacada de las demos de sun

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

package hello;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;

/**
 * Class periodically repainting the canvas with all the balls.
 */
public class Repainter implements Runnable {

    /* target display */
    private Display display;
    /* canvas to repaint */
    private Canvas canvas;
    /* whether the repainting is stopped */
    private boolean stop;

    /**
     * Creates a new instance of repainter.
     *
     * @param display Target display
     * @param canvas  Canvas to repaint
     */
    public Repainter (Display display, Canvas canvas) {
        this.display = display;
        this.canvas = canvas;
    }

    /**
     * Starts the repainter
     */
    public void start () {
        stop = false;
        run ();
    }

    /**
     * Stops the repainter
     */
    public void stop () {
        stop = true;
    }

    /**
     * Actual repainting process being performed serially with actual display
     * updates.
     */
    public void run () {

        if (stop) {
            return;
        }

        try {
            // avoid insane repainting
            Thread.sleep (5);
        }
        catch (InterruptedException e) {
            // Never mind
        }

        canvas.repaint ();
        display.callSerially (this);
    }
}
 


Ejemplo de un midlet que saca datos de la red, en concreto haciendo peticiones a una URL.

package hello;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
import javax.microedition.io.*;

/**
 * @author luser
 */
public class HttpRequestTest extends MIDlet implements CommandListener {
    private Command exitCommand, goCommand, backCommand;
private Display display;
private Form locationScreen;
private Form resultScreen;
private TextField urlField;
private StringItem itemResultado;

    /**
     * HttpRequestTest
     * constructor
     */
    public HttpRequestTest ()
    {
        // Pillamos la pantalla para el MIDlet
        display = Display.getDisplay(this);

        // Creamos comandos esenciales
        exitCommand = new Command("Exit", Command.EXIT, 2);
        goCommand = new Command("Go", Command.OK, 2);
        backCommand = new Command("Back", Command.BACK, 2);

        // Formulario para tomar la URL
        locationScreen = new Form("Indica una URL destino");
        urlField = new TextField("url", "http://localhost/Test.txt", 25, TextField.ANY);
        locationScreen.append(urlField);

        // Comandos salida y continuar
        locationScreen.addCommand(exitCommand);
        locationScreen.addCommand(goCommand);
        locationScreen.setCommandListener(this);

        // Creamos la pantalla de resultado
        resultScreen = new Form("URL data:");
        itemResultado = new StringItem("", "");

        resultScreen.append(itemResultado);
    
        // Metemos los comandos para volver
        resultScreen.addCommand(backCommand);
        resultScreen.setCommandListener(this);
    }

    /**
     * startApp
     * se ejecuta al inicio de la aplicación
     */
    public void startApp() {


        // Establecemos el formulario en la pantalla
        display.setCurrent(locationScreen);
    }

   /**
     * pauseApp
     * se ejecuta en caso de pausar la aplicación
     */
    public void pauseApp() {
    }

    /**
     * destroyApp
     * se ejecuta al terminar la aplicación
     */
    public void destroyApp(boolean unconditional) {
    }

      /**
     * commandAction
     * captura los comandos.
     */
    public void commandAction(Command c, Displayable s) {
        String html = "";

        if (c == exitCommand) {
        destroyApp(false);
        notifyDestroyed();
        }
        else if (c == goCommand) {
        // Llamamos a la función que saca los datos
            html = getData(urlField.getString());
             display.setCurrent(resultScreen);
             itemResultado.setText(html);
        }else if (c == backCommand) {
            // Volvemos al inicio
            display.setCurrent(locationScreen);
        }
       
      }

    /**
     * getData
     * Solicita una URL y devuelve un String con el resultado
     */
       private String getData(String url) {
            StreamConnection conn = null;
            InputStream in = null;
            StringBuffer data = new StringBuffer();
            
            try {
            // Abrimos la conexión así de fácil
            conn = (StreamConnection)Connector.open(url);

            // Sacamos un InoutStream de la conexión
            in = conn.openInputStream();

            // Vamos leyendo caracteres y los metemos en un string
            int ch;
            while (((char)(ch = in.read()) != '\003') && (ch != -1) )
            {     
             data.append((char)ch);
            }

            // Si está vacío, msg al canto con alert
            if (data.toString().equals(""))
            {
             display.setCurrent(new Alert("Url","En esa URL no retornó nada.", null,AlertType.ERROR));
            }

            return data.toString();

            } catch (IOException e) {
             return "La conexión no se pudo establecer:" + e.getMessage();
            }
        }
}
 


El conversor de ptas,euros y dolares algo mejorado. Campos que solo admiten números,choices, alertas, dos formularios, etc..

*
 * Conversor
 * Midlet que convierte monedas en dos formularios
 */
package hello;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;


public class Conversor extends MIDlet implements CommandListener {
    private Command exitCommand, goCommand, backCommand;
    private Display pantalla;
    private Form formDatos;
    private TextField cantidad;
    private ChoiceGroup tipoCambio;
    private Form formResultado;
    private StringItem resultado;
    private Alert errorMsg;

    /**
     * Conversor
     * Constructor del Midlet, inicializa todo
     */
    public Conversor() {
        // Get the Display object for the MIDlet
        pantalla = Display.getDisplay(this);
        // Creamos los tres comandos
        exitCommand = new Command("Salir", Command.EXIT, 2);
        goCommand = new Command("Convertir", Command.OK, 2);
        backCommand = new Command("Atrás", Command.BACK, 2);

        // Creamos el primer formulario
        formDatos = new Form("Introducir cantidad");
        // En la cantidad aceptamos solo enteros. Para cualquier
        // otra cosa pondriamos TextField.ANY
        cantidad = new TextField("Cantidad", "", 15, TextField.NUMERIC);


        formDatos.append(cantidad);

        String[] cambios = { "€ a pta","pta a €","€ a $","$ a €" };
        tipoCambio = new ChoiceGroup("Tipo de cambio", List.EXCLUSIVE,cambios, null);
        formDatos.append(tipoCambio);
        
        // Ponemos los comandos para el primer formulario
        formDatos.addCommand(exitCommand);
        formDatos.addCommand(goCommand);
        formDatos.setCommandListener(this);

        // Creamos la pantalla para el resultado
        formResultado = new Form("Resultado al cambio");
        resultado = new StringItem("Resultado:\n", "");
        formResultado.append(resultado);
        

        // Establecemos los comandos para volver atrás y salir
        formResultado.addCommand(backCommand);
        formResultado.addCommand(exitCommand);
        formResultado.setCommandListener(this);
    }

    /**
     * startApp
     * iniciop del Midlet
     */
    public void startApp() throws MIDletStateChangeException {
        pantalla.setCurrent(formDatos);
    }

    /**
     * pauseApp
     * se invoca si se hace una pausa en la aplicación
     */
    public void pauseApp() {
    }

    /**
     * destroyApp
     * Se invoca al destruir la aplicación
     */
    public void destroyApp(boolean unconditional) {
    }

    /**
     * commandAction
     * handler para todos los eventos
     */
    public void commandAction(Command c, Displayable s) {
        if (c == exitCommand) {
            destroyApp(false);
            notifyDestroyed();
        }
        else if (c == goCommand) {
            // si no se han metido datos, sacamos un alert y ponemos el foco
            if (cantidad.getString().trim().equals(""))
            {
                errorMsg = new Alert("Atención","Introduce algo en el campo cantidad",null,AlertType.WARNING);
               pantalla.setCurrent(errorMsg, formDatos);
               return;
            }
            
            // Hacemos el cálculo
           resultado.setText((calcular(Double.parseDouble(cantidad.getString()),tipoCambio.getSelectedIndex()) )) ;

            pantalla.setCurrent(formResultado);
        }
        else if (c == backCommand)
        {
            // Hacemos limpia de la pantalla inicial
            cantidad.setString("");
            
            // Volvemos al inicio
             pantalla.setCurrent(formDatos);
        }
    }

    private String calcular (double cantidad, int tipo)
    {
        String result = "";
        switch (tipo)
        {
                case 0 :
                           result = cantidad +"€ = "+ (cantidad*166.386) +"ptas";
                           break;
                case 1 :
                           result = cantidad +"ptas = "+ (cantidad/166.386) +"€";
                           break;
                case 3 :
                           result = cantidad +"€ = "+ (cantidad*1.2) +"$";
                           break;
                case 4 :
                           result = cantidad +"$ = "+ (cantidad/1.2) +"€";
                           break;
                default:
                            break;
    }
        return result;
    }

}

subscribe via RSS