Foro de elhacker.net

Programación => Java => Mensaje iniciado por: o__Near__o en 11 Julio 2011, 01:22 am



Título: LLamar los Metodos de un Midlet desde otra clase
Publicado por: o__Near__o en 11 Julio 2011, 01:22 am
Hola... estoy haciendo una aplicacion movil utilizando el NetBeans, mi duda es la siguiente: he estado investigando mucho sobre como utilizar los metodos de una clase en otra y si mas no me equivoco es de esta forma :


Código:
nombreClase x = new nombreClase();
x.metodo();

siempre y cuando se encuentren en el mismo paquete sino habria que importarlo. Ahora yo estoy intentando hacer justamente eso de esta forma y mis clases estan en el mismo paquete.

Código:
//clase 1

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

public class AplicacionMovil extends MIDlet implements CommandListener
{
    public void startApp()
    {
       //mi codigo para iniciar
    }

    public void ingreso()
    {
       //codigo de ingreso
    }

    public void pauseApp()
    {    }

    public void destroyApp(boolean unconditional)
    {
        notifyDestroyed();
    }

     public void commandAction(Command c, Displayable d)
    {
        //las condiciones del command
     }
}

//clase 2

import javax.microedition.lcdui.*;

public class clasedos implements CommandListener
{
     public clasedos()
    {
        //codigo de clasedos
    }

     public void commandAction(Command c, Displayable d)
    {
       //aca estableco mi condicion de que si presiono la tecla "confirmar" haga por
       //decir esto:
       if(c.getLabel().equals("Confirmar"))
        {
                    AplicacionMovil fin = new AplicacionMovil();
                    fin.ingreso();
        }
    }
}

///////////////////////////////////////

pero no hace lo que esta en ingreso().  En la documentacion del NetBeans al momento de desplegarse su informacion tras colocar el punto(.) despues de fin sale Javadoc No se ha encontrado.

Me gustaria saber si la forma en la que estoy tratando de llamar a ingreso() es la correcta o si le falta algo para que sea llamado ingreso() desde la clase 2. Gracias de antemano por sus respuestas


Título: Re: LLamar los Metodos de un Midlet desde otra clase
Publicado por: Valkyr en 11 Julio 2011, 03:01 am
Que no salga ninguna información de JavaDoc sería lógico si no tienes el método comentado con JavaDoc. ¿Con la expresión "no hace lo que está en ingreso()" te refieres a que no ejecuta correctamente el código que está en ingreso() o que da error el compilador como si ese método no existiese?

Lo que haces está bien, creas un objeto de tipo AplicacionMovil y aplicas un método de esa clase, no tiene más misterio. Pon el código de ingreso o depuralo tu mismo y nos cuentas.

Saludos.


Título: Re: LLamar los Metodos de un Midlet desde otra clase
Publicado por: o__Near__o en 11 Julio 2011, 03:11 am
hola gracias por responder, bueno esto es lo que esta en ingreso()

Código:
public Form ingreso()
    {
        titulo = new Form("Conectarse");

        usuario = new TextField("Usuario          :" ,"" , 5, TextField.ANY);
        contraseña = new TextField("Contraseña    :" ,"" , 5, TextField.PASSWORD);

        ingresar = new Command("Ingresar" ,Command.OK, 1);
        cancelar = new Command("Cancelar" ,Command.EXIT, 2);
       
        titulo = new Form("Conectarse");

        titulo.append(usuario);
        titulo.append(contraseña);

        titulo.addCommand(cancelar);
        titulo.addCommand(ingresar);

        titulo.setCommandListener(this);
       
        return titulo;

    }

bueno se entiende que antes ya he creado a Form titulo;TextField usuario, contraseña;...

al inicio del programa se ejecuta normal lo que esta en inicio, como veran es un login, y ya tengo mi menu al que se ingresa, solo que al momento que deseo volver del menu al login de esa forma, es decir con :

Código:
public void commandAction(Command c, Displayable d)
 {
       if(c.getLabel().equals("Confirmar"))
        {
                    AplicacionMovil fin = new AplicacionMovil();
                    fin.ingreso();
        }
 }


no vuelve al login, por tanto no se ejeuta denuevo lo que esta en ingreso() :S.
no se que es lo que este malpor que de la misma forma deseaba terminar el programa llamando al destroyApp{} , asi:  fin.destroyApp(true);


Título: Re: LLamar los Metodos de un Midlet desde otra clase
Publicado por: Valkyr en 11 Julio 2011, 14:34 pm
¿Has probado a depurarlo? Es decir, ver si sigue el orden que tu crees que sigue el programa. ¿Te has asegurado que el if cumple la condición? y en caso de que hayas hecho todo esto y no encuentres nada raro comentanoslo.


Título: Re: LLamar los Metodos de un Midlet desde otra clase
Publicado por: o__Near__o en 12 Julio 2011, 00:51 am
Nuevamente gracias por responder. Volviendo al tema perdona la ignorancia, pero ¿a que te refieres con depurarlo?. La condicion del if si cumple, aca solo coloque la parte que me interesaba mostrarles pero maso menos completo esta es la clase opciones(he reducido parte del codigo asegurandome de que funcione igual) es asi:
Código:
import javax.microedition.lcdui.*;

public class opciones implements CommandListener //--Mi clase Opciones
{
    private List lista, listasalir;
    private Display pantalla;
    private TextField usuario, contraseña;

    public opciones(Display pantalla)
    {
        this.pantalla = pantalla;

        lista = new List("BANCO X" , Choice.IMPLICIT);
        lista.append("Consulta tu saldo",null);
        lista.append("Tranferencias de dinero",null);
        lista.append("Tipo de cambio", null);
        lista.append("Ayuda", null);
        lista.append("Salir", null);

        Command seleccionar = new Command("Aceptar", Command.ITEM, 2);
        lista.setSelectCommand(seleccionar);

        Command cancelar = new Command("Cancelar", Command.BACK, 1);
        lista.setSelectCommand(cancelar);

        lista.setCommandListener(this);

        pantalla.setCurrent(lista);
    }

    public void opcionesRetorno()
    {
        lista = new List("Banco X" , Choice.IMPLICIT);
        lista.append("Consulta tu saldo", null);
        lista.append("Transferencias de dinero", null);
        lista.append("Tipo de cambio", null);
        lista.append("Ayuda", null);
        lista.append("Salir", null);

        Command seleccionar = new Command("Aceptar", Command.ITEM, 2);
        lista.setSelectCommand(seleccionar);

        Command cancelar = new Command("Cancelar", Command.BACK, 1);
        lista.setSelectCommand(cancelar);

        lista.setCommandListener(this);

        pantalla.setCurrent(lista);
    }

    public void salir()
    {
        listasalir = new List("¿Realmente desea salir?", Choice.IMPLICIT);

        listasalir.append("Cerrar Seción", null);
        listasalir.append("Continuar", null);

        Command aceptar = new Command("Confirmar", Command.OK,2);
        listasalir.addCommand(aceptar);

        Command cancelar = new Command("Volver", Command.BACK,1);
        listasalir.addCommand(cancelar);

        listasalir.setCommandListener(this);

        pantalla.setCurrent(listasalir);
    }

    public void commandAction(Command c, Displayable d)//--Aca el commandAction
    {  
        int opcion, opcionx;

        if( c.getLabel().equals("Aceptar"))
        {
            opcion = lista.getSelectedIndex();
            opcion = opcion+1;

            switch(opcion)
            {
                //aca solo hay "case" para que me envien a las opciones que he creado
                //y estan en clases distintas
            }
        }
        else if(c.getLabel().equals("Cancelar"))
        {
            salir();
        }

       if(c.getLabel().equals("Confirmar"))//Al cumplir la condicion que haga lo que
                                                          //esta en dentro del if
        {
            opcionx = listasalir.getSelectedIndex();
            opcionx = opcionx + 1;

            switch(opcionx)
            {
               case 1://al ingresar al caso 1 deberia ejecutarse ingreso()
                    AplicacionMovil fin = new AplicacionMovil();
                    fin.ingreso();
                    break;

                case 2://al ingresar al caso 2 me envia a opcionesRetorno(esto si ocurre)
                           //entonces la condicion del if si se esta cumpliendo
                    opcionesRetorno();
                    break;
            }
        }
        else if(c.getLabel().equals("Volver"))
        {
            opcionesRetorno();
        }  
    }
}

lo importante esque al momento de ingresar al caso 1 no me envia a ingreso() .He reducido un poco el codigo del Midlet (asegurandome que de todas formas se ejecute) para mostrarselos y tambien saber si afecta el que no haya creado constructor a la clase AplicacionMovil.
Nota : El hilo es solo para mostrar una imagen, eso funciona normal

Código:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class AplicacionMovil extends MIDlet implements CommandListener//--Clase
                                                                                              //AplicacionMovil
{
    private Form titulo;
    private Display pantalla;
    private TextField usuario, contraseña;
    private Command ingresar, cancelar;

    boolean b = false;
    private int xtiempo;
    
    public void startApp()//--El startApp, con lo que iniciara mi Midlet
    {
        if(b)
        {
            pantalla = null;
            xtiempo = 0;
        }
        else
        {
            pantalla = Display.getDisplay(this);
            b = true;

           new Thread
           (
               new carga(pantalla, 1000)//clase que hereda al canvas para mostrar una
                                                    //imagen por un segundo
               {
                     public void execute()
                    {
                                pantalla.setCurrent(ingreso());//--Se ejecuta ingreso()
                     }
                }
           ).start();
        }
    }

    public Form ingreso()
    {
        titulo = new Form("Conectarse");

        usuario = new TextField("Usuario          :" ,"" , 5, TextField.ANY);
        contraseña = new TextField("Contraseña    :" ,"" , 5, TextField.PASSWORD);

        ingresar = new Command("Ingresar" ,Command.OK, 1);
        cancelar = new Command("Cerrar" ,Command.EXIT, 2);
        
        titulo = new Form("Conectarse");

        titulo.append(usuario);
        titulo.append(contraseña);

        titulo.addCommand(cancelar);
        titulo.addCommand(ingresar);

        titulo.setCommandListener(this);
        
        return titulo;

    }

    public void pauseApp()
    {    }

    public void destroyApp(boolean unconditional)
    {
        notifyDestroyed();
    }

    public void validarUsuario(String nombre, String contraseña)
    {
        if( nombre.equals("A") && contraseña.equals("a"))
        {            
                new opciones(pantalla);//envia a la clase opciones que arriba mostre
        }
        else
        {
            reingreso();
        }
    }

    public void reingreso()
    {
      Alert error = new Alert("Datos Incorrectos" ,"\nVuelva a ingresar sus datos"
                                , null, AlertType.ERROR) ;
      error.setTimeout(Alert.FOREVER);
      pantalla.setCurrent(error);
    }

    public void commandAction(Command c, Displayable d)//--El commandAction
    {
       xtiempo = 0;

       if(c.getLabel().equals("Cerrar"))
       {
         destroyApp(true);
       }
       else if(c.getLabel().equals("Ingresar"))//--Me envia a validarUsuario
       {
            validarUsuario(usuario.getString(), contraseña.getString());
       }
    }
}

gracias de antemano por sus respuestas


Título: Re: LLamar los Metodos de un Midlet desde otra clase
Publicado por: Valkyr en 12 Julio 2011, 01:59 am
En esta parte del código

Código
  1. pantalla.setCurrent(ingreso());

dices que sí te funciona, y sin embargo luego, donde dices que no funciona haces esto:

Código
  1. fin.ingreso();

¿No deberías hacer algo así:

Código
  1. pantalla.setCurrent(fin.ingreso());
?

Supongo que de esa forma cambiaría el aspecto de la pantalla (que es lo por que tu dices que no funciona) y funcionaría. Tampoco tengo mucha idea porque no he programado nada para dispositivos móviles, pero creo que los tiros deben ir por ahí.


Con depurarlo me refiero a usar un Debugger, sirve para ir avanzando poco a poco en la ejecución del programa y ver que comportamiento sigue. Puedes ver que valores toman las variables, insertar puntos de ruptura para que el programa se detenga y poder reanudarlo a partir de él, etc. En wikipedia hay una descripción por si te interesa: http://es.wikipedia.org/wiki/Depurador

Saludos y espero que sea eso!


Título: Re: LLamar los Metodos de un Midlet desde otra clase
Publicado por: o__Near__o en 13 Julio 2011, 22:10 pm
gracias por la respuesta, pero lamentablemente no soluciono mi problema, no se cual sera la falla.Gracias por la informacion sobre el depurador, se que el Netbeans tiene su herramienta para depurar pero no se como utilizarla, pero ahi investigare por que al parecer sera la unica forma de solucionar mi problema, gracias por responder ;D