Problema com Command

23 respostas
dcbasso
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:
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

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

Alguém poderia me ajudar?

23 Respostas

P

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.

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!

P

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!

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

dcbasso
  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?
j0nny

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.

dcbasso

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

j0nny

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

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

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?

j0nny

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?

A princípio sim!

dcbasso

!

P

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

j0nny

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!

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

dcbasso

j0nny:
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!

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

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.

j0nny

dcbasso:
j0nny:
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!

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

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.

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

dcbasso

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

P

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.

dcbasso

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

E

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();
        }
    }

}
dcbasso

Valeu edwagner, vou testar!

dcbasso

Funcionou! Bem bacana…
Valeu mesmo, dá para colocar um botão agora…

P

Ninguém disse que não dá…o que foi dito que não é comum, sendo o padrão, no Form.

dcbasso

boone:
edwagner:

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

Ninguém disse que não dá…o que foi dito que não é comum, sendo o padrão, no Form.

O padrão form é aquele que vocês passaram!
Quando ou qual padrão é usado o TAL BOTAO…

E

boone:

Ninguém disse que não dá…o que foi dito que não é comum, sendo o padrão, no Form.

Depende, se você for fazer uma calculadora, por exemplo, ou qualquer outro aplicativo que precise de botões para interagir com o usuário este é um bom jeito.

Criado 14 de abril de 2010
Ultima resposta 14 de abr. de 2010
Respostas 23
Participantes 4