Problema com Command

package hello;

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

public class HelloMIDlet extends MIDlet implements CommandListener {

    private Command sair; // The exit command
    private Command entrar;
    private Display display;     // The display for this MIDlet
    private Form form = null;

    public HelloMIDlet() {
        display = Display.getDisplay(this);
        sair = new Command("Sair", Command.EXIT, 0);
        entrar = new Command("Entrar",Command.ITEM, 0);
    }

    public void startApp() {
        if(form == null){
            form = new Form("Estudo J2ME");
            TextField cUsuario = new TextField("Usuário:", "", 10, TextField.PLAIN);
            TextField cSenha = new TextField("Senha:", "", 10, TextField.PASSWORD);
            StringItem bEntrar = new StringItem("", "Entrar", StringItem.BUTTON);

            form.append(cUsuario);
            form.append(cSenha);
            form.append(bEntrar);
            
            bEntrar.addCommand(entrar);

            form.addCommand(sair);
            form.setCommandListener(this);
            display.setCurrent(form);
        }
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

    public void commandAction(Command c, Displayable s) {
        if(c == entrar){
            Alert alert = new Alert("TESTE!!!");
            display.setCurrent(alert);
        }
        if(c == sair){
            destroyApp(false);
            notifyDestroyed();
        }
    }

}

Erro:

[code]TRACE: <at java.lang.NullPointerException: 0>, Exception caught in Display class
java.lang.NullPointerException: 0

  • javax.microedition.lcdui.Display$ChameleonTunnel.callItemListener(), bci=57
  • com.sun.midp.chameleon.layers.SoftButtonLayer.processCommand(), bci=57
  • com.sun.midp.chameleon.layers.SoftButtonLayer.soft2(), bci=173
  • com.sun.midp.chameleon.layers.SoftButtonLayer.softPress(), bci=36
  • com.sun.midp.chameleon.layers.SoftButtonLayer.pointerInput(), bci=142
  • com.sun.midp.chameleon.CWindow.pointerInput(), bci=76
  • javax.microedition.lcdui.Display$DisplayEventConsumerImpl.handlePointerEvent(), bci=19
  • com.sun.midp.lcdui.DisplayEventListener.process(), bci=296
  • com.sun.midp.events.EventQueue.run(), bci=179
  • java.lang.Thread.run(), bci=11
    [/code]

Estou começando na J2ME… Estou usando o JAVA ME PLATFORM SDK 3.0

Alguém poderia me ajudar?

Notas:

  1. Command normalmente é adicionado a Form, não a StringItem

  2. Nunca se chama destroyApp, pois quem vai chamar é o AMS do celular, não a aplicação.

Então como fica para adicionar um evento a um botão por exemplo!
Ou ainda como faz para fechar… o SDK auto-gerou o close!

[quote=dcbasso]Então como fica para adicionar um evento a um botão por exemplo!
Ou ainda como faz para fechar… o SDK auto-gerou o close![/quote]

As respostas já foram dadas. Denovo:

  1. Quem trata evento é o form, não o botão, por isto o addCommand no Form.

  2. Não precisa do destroyApp, basta o notifyDestroyed, pois se vc leu o javadoc, lá diz que ele sinalizará ao AMS que o mesmo pode destruir a aplicação

  1. Ta tudo bem mudei para o command ser na form… porém o botão nem tem função de botão! Ele até ficou como um label, um texto normal ali!
    A sei lá… o conceito é um tanto diferente… para mim mudar a tela apenas com outro form?

Esqueça essa sua stringItem, use apenas o Command, e na sua classe, implemente a interface commandListener, e lá trate os eventos dos seus commands.

Então eu mato os botões de tela, e uso aquele menuzinho lá em baixo, no rodapé!
Isso???

[quote=dcbasso]Então eu mato os botões de tela, e uso aquele menuzinho lá em baixo, no rodapé!
Isso???[/quote]

Isso, mas se quiser um botão extremamente simples, faça com CustomItem.

Hummm, entendi!
Vou tentar fazer fazer um botão com CustoItem…

Então para o sistema com, digamos LOGIN, CADASTRO e CONSULTA eu teria que gerar 3 forms, e dar um display.setCurrent(FORM*);
Seria assim o conceito para desenvolver?

[quote=dcbasso]Hummm, entendi!
Vou tentar fazer fazer um botão com CustoItem…

Então para o sistema com, digamos LOGIN, CADASTRO e CONSULTA eu teria que gerar 3 forms, e dar um display.setCurrent(FORM*);
Seria assim o conceito para desenvolver?[/quote]

A princípio sim!

!

Leia mais tutorias na Internet. Vc está errando no básico do básico.

[quote=dcbasso]Estou tentando criar uma Form dentro de uma class, para cada form ficar separada e poder ser criada a hora que for ser usada…
Isso dá para fazer?

Eu tentei fazer isso e não deu certo: public class Login extends Form implements CommandListener

Grato pela força pessoal![/quote]

Mas o que não deu certo?
Adivinhar não é uma virtude que tenho :lol:

[quote=j0nny][quote=dcbasso]Estou tentando criar uma Form dentro de uma class, para cada form ficar separada e poder ser criada a hora que for ser usada…
Isso dá para fazer?

Eu tentei fazer isso e não deu certo: public class Login extends Form implements CommandListener

Grato pela força pessoal![/quote]

Mas o que não deu certo?
Adivinhar não é uma virtude que tenho :lol: [/quote]

Opa deixa eu ver aqui… na realidade, o Boone falou algo meio certo, mas o lance é que tem pouco tutorial avançado sobre ME… mto coisa que só mostra uma telinha HELLO WORLD e boa…

o erro é: Cannot Find Symbol na linha supra citada.

[quote=dcbasso][quote=j0nny][quote=dcbasso]Estou tentando criar uma Form dentro de uma class, para cada form ficar separada e poder ser criada a hora que for ser usada…
Isso dá para fazer?

Eu tentei fazer isso e não deu certo: public class Login extends Form implements CommandListener

Grato pela força pessoal![/quote]

Mas o que não deu certo?
Adivinhar não é uma virtude que tenho :lol: [/quote]

Opa deixa eu ver aqui… na realidade, o Boone falou algo meio certo, mas o lance é que tem pouco tutorial avançado sobre ME… mto coisa que só mostra uma telinha HELLO WORLD e boa…

o erro é: Cannot Find Symbol na linha supra citada.[/quote]

Bom, o erro é básico, vc digitou algo errado!

Acho que não dá para extender Form, nem Screen!

Como vc quer tutorial avançado se o básico vc tropeça ?
No Javadoc diz que Form não é final, logo, vc pode extender perfeitamente.

Ta ta, vi o erro!
Faltou um Super("");
Poderia ter falado! Simples de resolver!

Dá sim para adicionar um command ao StringItem, e é até bem simples. Vou usar seu código para mostrar como:

package hello;

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

//você implementa o ItemCommandListener também.
public class HelloMIDlet extends MIDlet implements ItemCommandListener,ItemCommandListener {
    private Command sair; // The exit command
    private Command entrar;
    private Display display;     // The display for this MIDlet
    private Form form = null;

    public HelloMIDlet() {
        display = Display.getDisplay(this);
        sair = new Command("Sair", Command.EXIT, 0);
        entrar = new Command("Entrar",Command.ITEM, 0);
    }

    public void startApp() {
        if(form == null){
            form = new Form("Estudo J2ME");
            TextField cUsuario = new TextField("Usuário:", "", 10, TextField.PLAIN);
            TextField cSenha = new TextField("Senha:", "", 10, TextField.PASSWORD);
            StringItem bEntrar = new StringItem("", "Entrar", StringItem.BUTTON);

            form.append(cUsuario);
            form.append(cSenha);
            form.append(bEntrar);
             
            //retira esta linha: bEntrar.addCommand(entrar);   

            //adiciona estas linhas
            Command entrar = new Command("Entrar", Command.ITEM, 1);
            bEntrar.setDefaultCommand(entrar);
            item.setItemCommandListener(this);
    
            form.addCommand(sair);
            form.setCommandListener(this);
            display.setCurrent(form);
        }
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

//acrescenta este método
    public void commandAction(Command c, Item item) {
        System.out.println("voilaaaaa!!!!");
       //aqui você trata o comando

    }

    public void commandAction(Command c, Displayable s) {
        if(c == entrar){
            Alert alert = new Alert("TESTE!!!");
            display.setCurrent(alert);
        }
        if(c == sair){
            destroyApp(false);
            notifyDestroyed();
        }
    }

}

Valeu edwagner, vou testar!