Simplificar a Classe Command

6 respostas
F

Ae pessoal estou começando um projeto para Vendas(aquele história cliente, produto, pedidos, etc). Só que qdo apresentei as primeira linhas de código o coordenador de projetos me fez a seguinte proposta:

“Porque vc não faz um método que cria esse botões de ação? Tipo um addMenu(“downloads”) e ele já aparecer lá no menu opções do celular. Assim vc tiraria essa duplicação de linhas”

Duplicação que ele fala é que não precisaria instanciar outro objeto na mão para fazer a opção “Iniciar”, como exemplifica abaixo.

Command cmdDownload = new Command("Downloads", Command.SCREEN, 1);
Command cmdIniciar = new Command("Iniciar", Command.SCREEN, 2);

addCommand(cmdDownload);
addCommand(cmdIniciar);
setCommandListener(this);

Minha dúvida é a seguinte como fasso agora qdo essa opção receber uma evento…tem lá o CommandAction ele recebe um comand, aí fasso um switch perguntando qual opção foi assionada…mas nesse caso de cria um método para adicionar as opções “não” vou ter o controle dos nomes de objetos…abaixo segue como penso que ficaria o método addMenu:

public void addMenu(String opcao)
{
Command cmdOpcao = new Command(opcao, Command.SCREEN, 1);
addCommand(cmdOpcao);
setCommandListener(this);

6 Respostas

Rodrigo_Vieira_Pinto

Cara, nesse caso vc tem que fazer um método que receba como parâmetro uma cópia de Command. No programa principal Crie um objeto Command e instancie ele com o retorno do método.

É mais ou menos assim:

public Command metodo (Command c)

{

…linhas de codigo para criar os tratadores de eventos e outras coisas mais

return c;

}
public static void main(String args[])

{

Command com = metodo(com);

}

Dessa forma vc vai precisar criar tudo o que um Command precisa apenas uma vez. Fiz isso para criar uma barra de menu com todos os menuItens e funcionou.

F

Opa valeu! Deu quase tudo certo! :smiley:

O problema agora é qdo executo um evento…tenho uma classe chamada OpcaoMenu.

public class OpcaoMenu extends Form implements CommandListener

/**TEM ESSE MÉTODO. Que adiciona menu na tela do tipo SCREEN */
public void addMenuOpcoes(String opcao, int prioridade)
    {
        Command cmdComando = new Command(opcao, Command.SCREEN, prioridade);

        addCommand(cmdComando);
        setCommandListener(this);
    }

/** E este outro que deveria receber o command pegar a prioridade dele e efetuar uma determinada ação de uma classe. */

public void verificaOpcao(Command c)
    {
        switch (c.getPriority())
        {
            case 1:
                Alert a = new Alert("tarara");
                a.setTimeout(Alert.FOREVER);
                display.setCurrent(a);
                break;
        }
    }

tenho outra classe chama Main.

public class Main extends MIDlet implements CommandListener

/** Esse que insere Objetos. O metodo addMenuCancelar adicio opcçoes do tipo Command.CANCEL*/
public void init()
    {
        main.addMenuOpcoes("Troca de Senha", 2);
        main.addMenuCancelar("Login", 1);
    }


/** E este que deveria pegar os eventos. Ve se o evento disparado foi um Command.SCREEN se sim efetuar a acao da classe OpcaoMenu(OpcaoMenu main).*/
    public void commandAction(Command c, Displayable ds)
    {
        if (c.getCommandType() == Command.SCREEN)
        {
            main.verificaOpcao(c);
        } else
        {
            Alert a = new Alert("Erro no commandAction");
            a.setTimeout(Alert.FOREVER);
            display.setCurrent(a);
        }
    }

Só que não está pegando os eventos disparados!

Será que alguém poderia me ajudar?

P

vc não está fazendo nada para tratar dos eventos, pelo que eu olhei no teu código até agora vc só adicionou os command a tela, ou mostra um Alert se o tipo do Command não é um Screen

F

Fiz esse commandAction na classe main, só que ele não aparece o ALERT…não sei o que está acontecendo…

VC disse que não estava fazendo nada para tratar os eventos!! Mas o commandAction não está fazendo isso??

public void commandAction(Command c, Displayable ds)
    {
        try
        {
            if (c.getCommandType() == Command.SCREEN)
            {
                Alert a = new Alert("Tá certo");
                a.setTimeout(Alert.FOREVER);
                display.setCurrent(a);
            } else
            {
                Alert a = new Alert("Erro no commandAction");
                a.setTimeout(Alert.FOREVER);
                display.setCurrent(a);
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
P

tá certo desculpa… deveria mostrar o Alert mesmo… vc setou o commandListener para a tela em que o command foi inserido?

F

Acho q entendi o erro mas não to conseguindo resolve-lo…o seguindo eu não to setando o commandListener para a classe q tem o comando q é para ser executado…

minha classe OpcaoMenu

public class OpcaoMenu extends Form implements CommandListener{

public void addMenuOpcoes(String opcao, int prioridade)
    {
        Command cmdComando = new Command(opcao, Command.SCREEN, prioridade);

        addCommand(cmdComando);
//AKI É Q  O ERRO TO PASSANDO PARA O COMMANDLISTENER OS COMANDOS DESTA CLASSE.... QUE DEVERIA SER DE OUTRA CLASSE.
        setCommandListener(this);
    }
}

só que tem que passar um commandListener de argumento para o set…só q não to conseguindo fazer isso…

instancio o objeto OpcaoMenu eu outra classe e chama o metodo addMenuOpcoes…

public class Main extends MIDlet implements CommandListener

public Main()
    {
        super();
        main = new OpcaoMenu();
        display = main.getDisplay();
        display = Display.getDisplay(this);
        main.setTitle("Login");
        init();
    }

 public void init()
    {
//PELO O Q VC ME DISSE DEVERIA ENTÃO PASSAR COMO ARGUMENTO DESTE MÉTODO O COMMANDLISTENER DESTA CLASSE PARA NA CLASSE OPCAOMENU ELE SABER Q É PARA ACIONAR O COMMANDACTION DA CLASSE MAIN
        main.addMenuOpcoes("Troca de Senha", 1);
        main.addMenuCancelar("Login", 2);

        main.addTextFieldNumerico("Código do Vendedor", 6);
        main.addTextFieldNumerico("Senha", 4);
    }
}

é isso mesmo? se for como passo isso como argumento?

Criado 15 de setembro de 2004
Ultima resposta 16 de set. de 2004
Respostas 6
Participantes 3