Artigo Java Magazine 46 - Programação Java EE: Parte 3

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (0)  (0)

Conheça a API de interface de usuário da MIDP, e comece a explorar técnicas de programação e características de desempenho de dispositivos limitados, além de ver como utilizar mais uma ferramenta, o NetBeans Mobility Pack.

Esse artigo faz parte da revista Java Magazine edição 46. Clique aqui para ler todos os artigos desta edição

Atenção: por essa edição ser muito antiga não há arquivo PDF para download.Os artigos dessa edição estão disponíveis somente através do formato HTML. 

Programação Java ME

Parte 3: programando com a LCDUI, e mais

 

Conheça a API de interface de usuário da MIDP, e comece a explorar técnicas de programação e características de desempenho de dispositivos limitados, além de ver como utilizar mais uma ferramenta, o NetBeans Mobility Pack.

 

Osvaldo Pinali Doederlein

 

Nesta terceira parte do mini-curso de programação para Java ME/MIDP1, nosso fogo muda para codificação e APIs. Começamos explorando uma das necessidades fundamentais de qualquer aplicação: a interface com o usuário.

As aplicações Micro Edition também necessitarão de outras coisas como estruturas de dados, I/O, threads e por aí vai. Mas como estamos supondo que o leitor já tem conhecimentos de programação em Java SE, a idéia é focar no que é novo ou diferente no Java ME. Como já vimos nas partes anteriores, diversas APIs do Java ME diferem das tradicionais APIs do Java SE, mas essas diferenças variam:

·         Há algumas APIs que foram simplificadas para caber nos dispositivos (ex.: coleções). Isso exige que aprendamos a contornar algumas limitações. Por exemplo, como a java.util do MIDP não tem coleções Set, podemos usar uma Hashtable2 com a chave igual ao valor.

·         Outras APIs, totalmente novas, oferecem funcionalidades ”verticais”, específicas à necessidade dos dispositivos. Um bom exemplo é a WMA (Wireless Messaging API), que permite enviar mensagens SMS/MMS.

·         Finalmente, há APIs que têm correspondente na Java SE, mas foram totalmente reprojetadas para a plataforma Java ME, seja devido ao tamanho excessivo da API da Java SE, seja por causa da inadequação do seu design às especificidades dos dispositivos ME.

 

As APIs de interface gráfica (GUI) pertencem à terceira categoria. Iniciantes em Java ME muitas vezes reclamam – precisava mesmo de um API novinha, que dá mais trabalho para aprender e não permite reusar nenhum código do Java SE? Infelizmente, precisava. Pelo critério do tamanho, as APIs de GUI do Java SE são grandes demais: somando AWT, Java 2D, Swing e acessórios, temos um toolkit que é maior do que alguns runtimes Java ME inteiros3!

E pelo critério de design, a Swing também é inadequada: por exemplo, ela pressupõe que todos os componentes serão desenhados por código Java, faz double buffering de tudo, possui um sistema de look-and-fells sofisticado, uma arquitetura MVC robusta. Essas e outras características tornam a Swing extremamente flexível e poderosa. Mas também a tornam pesada para dispositivos com CPU fraca, RAM apertada e JVMs menos avançadas.

 

O projeto MicroMandel

Para exercitar a programação de GUIs com a API LCDUI, o ideal é um projeto combinando dois tipos de código: telas do tipo “formulário” de entrada/saída de dados convencionais, usando componentes tais como checkbox, texto editável, menus etc.; e telas “desenhadas”, aplicando as APIs gráficas de baixo nível: desenho de linhas,textos,polígonos;uso de preenchimentos etc.

Quem lê esta coluna há anos talvez lembre que seu autor gosta de gráficos fractais. Aproveitei esta oportunidade para reciclar o meu modesto gerador de gráficos de Mandelbrot (já apresentado na Edição 19, no artigo “Matemática em Java”.) Vamos então construir uma aplicação com duas telas. A primeira é um formulário de entrada de dados, onde poderemos visualizar e opcionalmente alterar os parâmetros iniciais do gráfico. A segunda tela faz a exibição do gráfico.

Para construir esta aplicação, inicialmente utilizaremos o NetBeans com o Mobility Pack, conjunto que se destaca pelo seu suporte avançado para Java ME. O NetBeans permite criar GUIs MIDP de forma visual, sendo ideal para muitos tipos de aplicações centradas em formulários.

Vamos apresentar as etapas e as telas do NetBeans, mas o artigo não é exclusivo para usuários deste IDE. Mostraremos também o código gerado, que poderá ser usado com qualquer IDE com suporte a Java ME. Portanto, este artigo da série é “otimizado” para o NetBeans mas é “portável” para outros IDEs. (Ao final desta parte encerramos a cobertura de IDEs, que já contemplou o Eclipse na edição anterior. A partir do próximo artigo, falaremos só de APIs e técnicas de programação.)

 

Instalando o NetBeans e o Mobility Pack

Para este artigo, utilizei o NetBeans 5.5. Você precisará baixar e executar, na seqüência, os instaladores do IDE e o Mobility Pack. (Quando o NetBeans 6.0 estiver pronto, deverá haver um novo instalador unificado em nbi.netbeans.org.)

O CLDC Mobility Pack 5.54 irá instalar uma cópia do Sun Wireless Toolkit (WTK) 2.2 no diretório do seu usuário do sistema operacional. Por exemplo, no Windows, isso fica em %USERPROFILE%\.netbeans\<versão>\emulators\wtk22_win\emulator\wtk22, onde USERPROFILE geralmente aponta para C:\Documents and Settings\<usuário>. Mas vamos ignorar isso e usar o WTK 2.5, que é muito superior. Há duas opções:

l        Faça o download e instalação do WTK 2.5 (veja links) e, no NetBeans, vá em Tools>Java Platform Manager>Add Platform; escolha o tipo Java Micro Edition Platform Emulator e selecione o WTK 2.5, que será automaticamente detectado. Pelo mesmo processo, você poderá também instalar versões do WTK customizadas para  seu celular, incluídas no SDK para Java ME do fornecedor (Nokia, Motorola, SonyEricson etc.)

·         Em Tools>Update Center, selecione o Java ME Platform SDK Catalog, e será fornecida a opção do WTK 2.5. O Update Center fará o download do WTK, lançará seu instalador, e após a instalação, abrirá o Platform Manager já detectando o novo WTK; bastará confirmar.

 

Uma vez instalado o WTK, no mesmo diálogo Java Platform Manager, pode-se ir na aba Tools and Extensions e acionar as opções:

·         Open Preferences: Executa o utilitário prefs do WTK.

·         Open Utilities: Executa o utilitário utils do WTK.

·         Use WTK Extensions: Memory Monitor, Network Monitor e Profiler: Ativam cada uma destas ferramentas de monitoria e diagnóstico do WTK, quando o emulador for lançado.

Veja a edição anterior para detalhes sobre estes utilitários.

 

Criando o projeto

Comece com New Project>Mobile>Mobile Application. No diálogo Name and Location, entre com o nome do projeto – “MicroMandel” – e o seu diretório. Em Default Platform Selection, escolha Emulator Platform = SunJava™ Wireless Toolkit 2.5 for CLDC, Device Configuration = CLDC-1.1 (é o default), e Device Profile = MIDP-2.0. Aceite os defaults para todas as demais opções e finalize a criação do projeto.

O assistente de criação de projetos irá nos presentear com um projeto MIDP que já possui uma hello.HelloMidlet completa, com um helloForm que exibe a clássica mensagem “Hello, wolrd!”, e um comando (opção de menu) que permite finalizar a MIDlet. É uma boa idéia começar já executando Run Project para verificar se toda a sua configuração está correta. Vendo que funcionou, podemos apagar o pacote hello e começar a criar a nossa própria MIDlet.

Antes de iniciar o desenvolvimento, vamos examinar a página de propriedades do projeto, onde você verá muitas opções específicas para Java ME. A categoria Platform é a mais importante. Além das opções já informadas no assistente de criação de projetos, podemos ativar individualmente vários packages (APIs) opcionais. Por default, praticamente todas estas APIs vêm ativadas, mas isso não é uma boa idéia. O melhor é deixar ativadas somente aquelas que o projeto realmente precisará. Isso reduz o risco de utilizarmos por acidente alguma API não planejada (ex.: via auto-completamento do editor ou reuso de código).

Lembre que quanto mais APIs opcionais você usar, menor será a porcentagem de dispositivos do mercado capazes de rodar a sua aplicação. Para o nosso projeto, só precisamos das APIs da CLDC e do MIDP, portanto podemos desativar todos os check-boxes Optional Packages, como na Figura 1.

Acione agora New>Visual MIDlet. Em Name & Location, entre com “MicroMandel” como nome da MIDlet e da classe e ”mandel” para o pacote. O NetBeans criará uma classe mandel.MicroMandel que estende a classe MIDlet e define implementações vazias dos métodos starApp(), pauseApp() e destroyApp(). Esses métodos de ciclo de vida permitem executar tarefas de inicialização ou de encerramento. Também existirão métodos initialize(), getDisplay() e exitMidlet(). Você não tem liberdade total de editar esses métodos (especificamente, as linhas em cinza), porque são controlados pelo editor visual. Para quem já usou o editor de GUIs AWT/Swing do NetBeans (Matisse), é a mesma idéia.

 

Figura 1. Propriedades do projeto MIDP.

 

Criando o fluxo de navegação

No cabeçalho do editor da classe MicroMandel, você verá três botões de modo de edição:

  • Souce permite editar o código-fonte;
  • Screen Design edita a tela visualmente (deverá aparecer uma tela vazia);
  • Flow Design edita, também visualmente, o fluxo de navegação entre múltiplas telas (deverá aparecer apenas uma figura de um celular, intitulada Mobile Device).

 

Já sabemos que a aplicação terá duas telas, então vamos criá-las. No modo Flow Design, vá na Pallete e selecione Screens/Form. Clique numa área vazia do editor visual para criar o form, que será nomeado form1. Renomeie-o (janela Properties, Instance name) para formParams. Crie um segundo form chamado formFractal.

No formParams, após  usuário definir os parâmetros, teremos um comando (opção ativada por um menu do dispositivo) que fará a transição para o formFractal. Para criar este comando, clique em Pallete>Commands>Ok Command e depois clique sobre a figura do formParams. Vai aparecer um quadradinho com o rótulo “Ok” do lado. Crie também, no formParams, um comando do tipo Exit, e no formFractal, um botão do tipo Back; veja a Figura 2.

Agora você pode fazer as conexões entre eventos e pontos de entrada/saída de telas, que definem o fluxo de navegação. Clique no quadradinho Start Point do Mobile Device, e arraste uma seta até o quadradinho sem identificação à esquerda do formParams. Da mesma forma, ligue formParams / OK ao ponto de entrada de formFractal; formParams / Exit ao Exit Point do Mobile Device; e formFractal / Back também ao ponto de entrada de formParams. Arraste as figuras do Mobile Device e dos forms de maneira a deixar o diagrama mais claro (isto não terá efeito no código).

Ao criarmos comandos, o NetBeans gera variáveis com nomes como okCommand1, o que pode ser confuso se tivermos muitos comandos. Também irá gerar rótulos como “Exit”, apropriados apenas para um GUI em inglês. Clicando em cada comando/seta e usando a janela de propriedades, edite seus Instance Name para paramsOkCommand, paramsExitCommand e fractalBackCommand, e os rótulos (Label) para “Fractal”, “Sair” e “Voltar”. Feito isto, você terá algo como a Figura 3.

O diagrama de fluxo é bastante intuitivo, portanto só vamos resumir seus elementos e conceitos:

·         A tela formParams será exibida assim que a aplicação for iniciada, e terá dois comandos. O comando paramOkCommand (“Sair”) encerra a aplicação, e o comando paramExitcommand (“Fractal”) faz a transição para a tela formFractal.

·         A tela formFractal, que só é exibida ao acionar formParams / “Fractal”, possui apenas um comando paramFractalBack (“Voltar”), que faz a aplicação retornar à tela formParams.

 

Para ver esta navegação em ação, você pode executar novamente a MIDlet. Na tela correspondente ao formParams, por exemplo, você deverá ver o comando “Sair” associado ao botão superior esquerdo do celular emulado, e o comando “Fractal” associado ao botão esquerdo direito.

 

Este tutorial tem uma abordagem prática, sendo orientado pelo editor visual e pelo código. Mas no quadro, “Examinando a LCDUI” você pode ver os conceitos e a estrutura básica desta API de uma forma mais direcionada.

 

Analisando o código

"

A exibição deste artigo foi interrompida :(
Este post está disponível para assinantes MVP

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?