livro java me

145
Java ME Autor: Ricardo da Silva Ogliari

Upload: ricardo-ogliari

Post on 10-Mar-2016

232 views

Category:

Documents


0 download

DESCRIPTION

Esboço de livro sobre programação com a plataforma Java ME.

TRANSCRIPT

Java ME

Java MEAutor: Ricardo da Silva Ogliari19Listagem 1: MIDlet bsica exemplificando Ciclo de Vida.

23Liistagem 2: Cdigo para mostrar um objeto Form ao usurio.

28Listagem 3: Classe que usa um Command do tipo EXIT.

31Listagem 4: Construtores da classe Alert.

33Listagem 5: Cdigo necessrio para gerar um TextBox.

35Listagem 6: Classe que manipula o componente TextBox.

38Listagem 7: Classe que manipula o componente List.

42Listagem 8: Trecho de cdigo da classe ExForm que implementa a ItemStateListener.

48Listagem 9: Trecho de cdigo da classe ExStringItem que apresenta a forma de utilizao do item.

53Listagem 10: Trecho de cdigo da classe ExTextField que apresenta a forma de utilizao do TextField.

54Listagem 11: Trecho de cdigo que apresenta a criao de configurao dos dois componentes DateField DATE_TIME.

59Listagem 12: Classe de exemplo de uso do componente DateField.

63Listagem 13: Classe de exemplo de uso do componente DateField.

65Listagem 14: Exemplo de uso do Gauge interativo.

66Listagem 15: Exemplo de uso do Gauge com Thread.

68Listagem 16: Exemplo de uso da classe Spacer.

70Listagem 17: Midlet que faz uso da classe CustomItem

73Listagem 18: Classe que herda diretamente de CustomItem.

73Listagem 19: Mtodo paint da classe que herda diretamente de CustomItem

85Listagem 20: Uso primrio da classe Canvas

87Listagem 21: Utilizao de retngulos

88Listagem 22: Configurando full screen mode no Canvas.

90Listagem 23: Desenho de linhas no Canvas

91Listagem 24: Desenho de arcos no Canvas

92Listagem 25: Desenho de linhas no Canvas

95Listagem 26: Desenho uma imagem no Canvas

97Listagem 27: Desenho uma imagem no Canvas

100Listagem 28: Mtodos para captura de eventos de ponteiro.

104Listagem 29: Mtodo para abrir um Record Store.

104Listagem 30: Mtodos para fechar e deletar um Record Store.

105Listagem 31: Mtodos de insero, atualizao e remoo de registros em um Record Store.

106Listagem 32: Mtodos de insero, atualizao e remoo de registros em um Record Store.

106Listagem 33: Enumerando registros de um Record Store.

107Listagem 34: Enumerando registros de um Record Store.

107Listagem 35: Enumerando registros de um Record Store.

109Listagem 36: Ordenando registros de um Record Store.

110Listagem 37: Recuperando registros de um Record Store.

Figura 1: Arquitetura da plataforma Java ME.11Figura 2: Tela principal da IDE NetBeans.14Figura 3: Primeiro passo na criao de um novo projeto Java ME no NetBeans.15Figura 4: Segundo passo na criao de um novo projeto Java ME no NetBeans.16Figura 5: Terceiro passo na criao de um novo projeto Java ME no NetBeans.16Figura 6: Quarto e ltimo passo na criao de um novo projeto Java ME no NetBeans.17Figura 7: Ciclo de vida de uma aplicao Java ME.19Figura 8: rvore de classes para interface grfica em aplicaes Java ME. Imagem retirada de < http://www.javaworld.com/javaworld/jw-11-2003/jw-1107-wireless.html?page=2>.25Figura 9: Command EXIT no emulador de celular amplamente conhecido.27Figura 10: Command EXIT em um dispositivo com teclado QWERTY, presente em alguns smartphones e PDAs (Personal Digital Assistant).27Figura 11: Classes pertencentes que herdam de Screen. Imagem retirada de < http://www.devx.com/wireless/Article/21262/1954>.29Figura 12: Alert somente com ttulo.30Figura 13: Alert gerado com o construtor de quatro parmetros.30Figura 14: Exemplo do componente TextBox.33Figura 15: Tela resultante da Listagem 5.36Figura 16: Lista inicial.39Figura 17: Lista aps a execuo do mtodo lsMain.delete(2).39Figura 18: Lista aps a execuo do mtodo lsMain.insert.39Figura 19: Lista aps a execuo do mtodo lsMain.set(1, "Pera", null).39Figura 20: Lista aps a execuo do mtodo lsMain.append("Maa", null).39Figura 21: Lista aps a execuo do mtodo lsMain.setFont().39Figura 22: Itens presentes na MIDP 2.0 que podem ser usados dentro de um objeto da classe Form. Retirado de: http://www.devx.com/wireless/Article/21262/195443Figura 23: ChoiceGroup e seus tipos.44Figura 24: ChoiceGroup Popup selecionado.44Figura 25: ChoiceGroup Popup selecionado no emulador do SGH-X800 da Samsung.45Figura 26: Exemplos de StringItem no emulador do WTK da Sun47Figura 27: Exemplos de StringItem no emulador do Nokia 6165.47Figura 28: Exemplos de TextField no emulador do Motorola RAZR50Figura 29: Exemplos de TextField no emulador do WTK da Sun50Figura 30: Exemplos de TextField com um campo tipo PASSWORD51Figura 31: Exemplos de componente DateField DATE e DATE_TIME.54Figura 32: Exemplos de DateField no emulador da Srie 80 da Nokia.55Figura 33: Exemplos de edio de um componente DateField no emulador da Srie 80 da Nokia.56Figura 34: Exemplos do componente DateField no emulador do aparelho LG 160.56Figura 35: Exemplo de edio do componente DateField (modo DATE) no emulador do aparelho LG 160.57Figura 36: Exemplo de edio do componente DateField (modo DATE_TIME) no emulador do aparelho LG 160.57Figura 36: Exemplo de edio da hora do componente DateField no emulador da Sun.58Figura 37: Exemplo de edio da data do componente DateField no emulador da Sun.58Figura 37: Exemplo de ImageItem no emulador da Srie 80 dos telefones celulares da Nokia.63Figura 38: Exemplo de interao com ImageItem no emulador da Srie 80 da Nokia63Figura 39: Exemplo de ImageItem no emulador do LG LX260.63Figura 40: Exemplo de interao com o ImageItem no emulador do LG LX260.63Figura 40: Exemplo de Gauge no emulador da Sun. StringItem selecionado.67Figura 41: Exemplo de Gauge no emulador do aparelho Sanyo MM-5600.67Figura 42: Exemplo de utilizao do Gauge no emulador do LG 325.68Figura 43: Classe de exemplo de Gauge, com a linha que adiciona o componente ao Form comentada.68Figura 44: Exemplo de Canvas sem fullscreen.76Figura 45: Exemplo de Canvas sem fullscreen.79Figura 46: Exemplo de Canvas com fullscreen.79Figura 47: Exemplo de Canvas com fullscreen executando em um aparelho Sony Ericsson W380.80Figura 48: Sistema de coordenadas da Graphics.81Figura 49: Exemplo de estilos de linha na classe Graphics.84Figura 50: Uso primitivo da Canvas.86Figura 51: Uso de retngulos na Canvas.88Figura 52: Uso de retngulos na Canvas em uma tela full screen mode.88Figura 53: Uso de linhas no Canvas.90Figura 54: Uso de arcos no Canvas.91Figura 55: Ponto de ncora RIGHT usado de forma inadequada.93Figura 56: Ponto de ncora LEFT usado de forma adequada.93Figura 57: Ponto de ncora LEFT usado de forma adequada.94Figura 58: Desenho de imagem em Canvas.95Figura 59: Exemplo de teclado no formato ITU-T.98Figura 60: Aparelho celular Nokia N-95 8GB.99Figura 61: RMS e sua ligao com MIDlets.101Figura 62: Record Store.102

71.Introduo

92. A linguagem Java e suas plataformas

113. Java ME Conceitos Iniciais

134. Java ME Ambiente de produo

185. Ciclo de vida de uma MIDlet

216. Display e Displayable

247. Interface Grfica

268. Command e CommandListener

299. Interface Grfica de Alto Nvel

299.1 Alert

329.2 TextBox

369.3 List

4010. Interface Grfica de Alto Nvel Form

4210.1 Itens

4310.2 ChoiceGroup

4610.3 StringItem

4910.4 TextField

5310.5 DateField

5910.5 ImageItem

6310.6 Gauge

6710.7 Spacer

6910.8 CustomItem

6910.8.1 Modos de Interao

6910.8.2 Traversal

6910.8.3 Aplicao Exemplo

7711. Interface grfica de baixo nvel - Canvas

7711.1 Canvas

7811.2 Modos de Operao

8011.3 Graphics

8411.4 Estilo de Linha

8512. Interface grfica de baixo nvel Programando

8612.1 Desenhando retngulos

8912.2 Desenhando linhas

9012.3 Desenhando arcos

9212.4 Ponto de ncora

9412.5 Desenhando Textos

9412.6 Desenhando Imagens

9713. Interface grfica de baixo nvel - Interao com o usurio

9713.1 Interao com eventos de teclado

9913.1 Interao com eventos de ponteiro

10114. Armazenamento de dados

10314.1 Gerenciando os Record Stores do dispositivo

10414.2 Inserindo, atualizando e detelando registros

10614.3 Enumerando registros

10614.3 Criando filtros na enumerao de registros

10814.4 Ordendo os registros

10914.5 Recuperando registros

1. Introduo

A computao mvel ganhou destaque nos ltimos anos, o conceito de mobilidade vem sendo empregado nos mais diversos ramos da sociedade, e, alm disso, das mais variadas formas possveis. O telefone celular um dos grandes responsveis por este acontecimento, hoje em dia, metade da populao mundial tem um aparelho, em alguns pases da Europa, o nmero destes dispositivos ultrapassou a quantidade de habitantes. O modo de vida das pessoas foi afetado drasticamente, a forma de conviver e existir na sociedade tambm sofrer alteraes profundas.

A computao mvel vem sendo a grande menina dos olhos das grandes empresas, todo mundo quer oferecer seus servios em pequenos dispositivos, quer a fidelizao de seus clientes, levando sua marca at onde eles esto. Vrios termos ganharam vida com o advento da computao mvel, dentre os quais podemos citar:

Mbile Payment e Mobile Commerce: a forma tradicional de compra e venda de mercadorias est se tornando obsoleta, depois do E-Commerce, a nova onda o Mobile Commerce, ou seja, o processo de aquisio de qualquer mercadoria pode ser feito diretamente pelo seu dispositivo mvel. O termo celular-carteira o exemplo mais claro desse termo.

Mobile TV: a televiso analgica criada a algumas dcadas atrs tambm vai virar pea de museu, seu sinal est sendo convergido para digital, sendo assim, ele pode ser capturado por dispositivos mveis.

Mobile Banking: a maioria das operaes bancrias comuns, como extrato, consulta de saldo e transferncia de valores entre contas bancrias, j possvel com dispositivos mveis. J possvel negociar papis em bolsa de valores em telefones celulares atravs do Mobile Broker. Mobile Learning: direciona o processo de aprendizado para pequenos dispositivos. Existem sistemas em 3D que simulam aos usurios a visita a museus, conhecendo as obras e sua histria. Mobile Marketing: o marketing est enraizado na sociedade h vrios anos, agora, essa rea comea a mirar os dispositivos mveis. inegvel que estes aparelhos atingem um nmero muito grande de pessoas, ou seja, o foco do marketing.

Alm das reas citadas anteriormente, a mobilidade atingiu vrias outras reas de conhecimento. Os dispositivos mveis, liderados pelos telefones celulares ultrapassaram faz tempo o nmero de computadores pessoais, e a tendncia, continuar o crescimento. A computao mvel faz parte de um conceito maior, chamado de computao ubqua. Este termo foi cunhado por Mark Weiser, pregando o uso da computao de forma inconsciente, fazendo com que a tecnologia se adapte aos seres humanos, e no o que acontece hoje. Para usarmos um notebook, por exemplo, sentamos na frente dele, se quisermos sair do cmodo onde estamos e ir at a cozinha, ou levamos o notebook junto ou vamos parar de trabalhar. A computao ubqua traria a computao para a cozinha de forma automtica, percebendo a mudana no ambiente e se adaptando a ela. Porque falei da computao ubqua? Isso porque ela no existe sem a computao mvel. Para haver ubiqidade deve necessariamente existir a mobilidade.O leitor deve estar ciente do surgimento dos automveis com Bluetooth, que podem ler mensagens SMS (Short Message Service) para o motorista, automveis que estacionam sozinhos, ou ainda, que adaptam os faris dependendo da direo que o carro est seguindo, e assim por diante. A indstria automobilstica um exemplo da fuso de tecnologias, e a computao mvel o grande motor disso, existe equipamento que apresenta maior convergncia de tecnologia como o telefone celular?

Ficar indiferente a isso simplesmente suicdio, para empresas a falncia, para desenvolvedores um atraso na carreira. Hoje em dia a diversas opes, diferente do que acontecia a menos de uma dcada atrs. Hoje podemos usar Symbian C++, Brew, SuperWabba, Java ME e uma diversidade de tecnologias para a produo de aplicativos mveis. Cada uma delas tem seus pontos positivos e negativos, porm, indiscutivelmente, a plataforma Java ME da linguagem Java domina o mercado em relao aos telefones celulares no momento que este texto foi escrito.

Sendo assim, o objetivo deste trabalho demonstrar a plataforma Java ME, com foco em programao para a configurao CLDC. Desde sua parte bsica at reas mais avanadas que julga-se indispensveis em um futuro prximo, como Bluetooth e mtodos de posicionamento geogrfico.2. A linguagem Java e suas plataformas

A linguagem Java surgiu comercialmente em 1995 direcionada a qualquer produtor eletrnico, por isso a idia da mquina virtual e seus bytecodes. Porm, o boom da internet fez com que o Java tivesse sucesso inicial com os chamados Applets, aplicativos que permitiam que pginas web ganhassem dinamicidade.

A linguagem cresceu rapidamente, com o passar dos anos seu uso foi se tornando extremamente segmentado, surgindo a idia de diviso da linguagem em plataformas. Com isso, a linguagem teve seu foco direcionado a reas distintas, obtendo sucesso diferenciado em cada uma delas. Atualmente, existem basicamente trs plataformas: Java Standart Edition: direcionada a computadores pessoais, foi a primeira a aparecer e tambm conta com o maior conjunto de APIs (Application Program Interface).

Java Enterprise Edition: para ambientes servidores, um conjunto de componentes. Podemos citar alguns deles, como: JSP (Java Servlet Page), Servlets, Java Beans e Enterprise Java Beans.

Java Micro Edition: a mais nova da famlia. Com o advento dos pequenos dispositivos, esta plataforma foi criada. Atende desde cartes inteligentes (smartcard) at Set Tob Box e PDAs ultra modernos. Porm, nos telefones celulares que seu uso mais difundido.Como o objetivo principal deste trabalho no ensinar a linguagem Java, mas a plataforma Java ME, no se tratado nenhum aspecto da linguagem aqui.3. Java ME Conceitos Iniciais

A plataforma Java ME amplamente conhecida na programao para telefones celulares, porm, seu uso muito mais amplo e sua gama de aparelhos extensa. Assim como na histria da linguagem Java, a plataforma Java ME tambm sofreu algumas divises para se adaptar aos diferentes tipos de plataforma em que executada.Essa diviso chamada de configurao (Configuration). Ela define questes de baixo nvel, como a mquina virtual Java. As configuraes existentes so: CDC (Connected Device Configuration) e CLDC (Connected Limited Device Configuration). Os perfis (Profile) representam uma nova separao, levando em conta parmetros de alto nvel, como APIs para a interface de usurio por exemplo. Nesta categoria podemos citar: Foundation Profile, Personal Basis Profile e Personal Profile para CDC e MIDP (Mbile Information Device Profile) e IMP (Information Module Profile - Next Gen (IMP-NG)) para a CLDC. A arquitetura da Java ME pode ser encontrada na Figura 1.

Figura 1: Arquitetura da plataforma Java ME.

Na Figura 1, encontramos a arquitetura da plataforma Java ME, que encontrada acima do sistema operacional do dispositivo mvel. A configurao e o perfil foi dissertado no pargrafo anterior, porm, agora veremos onde se encaixam os pacotes opcionais.

A idia do Java ME foi atingir os dispositivos limitados no que diz respeito a capacidade de processamento e armazenamento, porm, a tecnologia est evoluindo rapidamente, e a Java ME teve que se adaptar. Sendo assim, so criados periodicamente pacotes opcionais para serem usados junto com a configurao padro, direcionados aos aparelhos que suportam caractersticas especiais, como suporte a imagens SVG (Scalable Vector Graphics) e sua SVG API, ou ainda, suporte a dados georeferenciados, e a Java Location API. Alm disso, existem muitas outras funcionalidades que no so caractersticas bsicas de todos os dispositivos, como multimdia, internacionalizao, pagamento eletrnico, dentre outros, por isso existem os pacotes opcionais, impedindo que a Java ME fique presa aos equipamentos low-end e permitindo sua utilizao segmentada para os high-end.

O Java ME pode ser direcionada a diversos tipos de equipamentos, porm, neste texto iremos focar o desenvolvimento para a configurao CLDC e seu perfil MIDP, muito usado em telefones celulares. Aplicativos desse porte so frequentemente chamados de MIDlets. Porm, os cdigos apresentados aqui que no apresentam interface grfica podem ser portados para o perfil IMP da CLDC, isso porque, este perfil se equivale ao MIDP, apenas no possui interface grfica com o usurio.

4. Java ME Ambiente de produo

Por ambiente de produo entendem-se as ferramentas necessrias para codificar, empacotar e distribuir uma aplicao Java ME. Por se tratar de uma plataforma da linguagem Java, as opes existentes hoje so extensas, diversas APIs fornecem at mesmo wizards para o desenvolvimento, porm, aqui veremos a parte de codificao, at mesmo para incentivar o entendimento do cdigo fonte de cada componente especfico.Ferramentas conhecidas como IDEs (Integrated development environment) fornecem ao desenvolvedor maneiras prticas e rpidas de codificar e empacotar uma aplicao. Neste trabalho ser utilizada a IDE NetBeans (http://www.netbeans.org/), ferramenta de cdigo aberto e grtis. Porm, se o leitor se sentir mais seguro utilizando outra IDE se sua preferncia sinta-se a vontade.

Na produo deste contedo, o NetBeans est na verso 6.1 Release Candidate. Na pgina oficial da IDE possvel baixar uma verso pr-configurada especialmente para a plataforma Java ME. Se o leitor preferir uma verso mais antiga, talvez seja necessrio a instalao do Mobilite Pack, necessrio para o desenvolvimento em Java ME. A Figura 2 apresenta a tela principal do NetBeans.

Figura 2: Tela principal da IDE NetBeans.

O crculo vermelho indica a barra superior, com as opes comuns como salvar, abrir, fechar, configuraes, dentre outros. O crculo verde traz os componentes que podem ser inseridos em uma MIDlet. O crculo azul est sobre a listagem dos projetos anexados a IDE. A rea mais importante est marcada com o crculo preto, que representa a tela de codificao, onde todas as coisas acontecem de verdade. Para criar um projeto Java ME basta ir ao menu File ->New Project. Uma tela conforme a Figura 3 aparecer na tela. A opo Mobility marcada, na parte direita existem algumas opes, porm, para criao de uma MIDlet, a opo MIDP Application deve ser marcada. O prximo passo e clicar no boto Next.

Figura 3: Primeiro passo na criao de um novo projeto Java ME no NetBeans.

O segundo passo consiste em definir o nome e a localizao do projeto. O campo Project Name: define o nome do projeto. Em Project Location especifica-se a localizao onde o novo projeto ser armazenado, e, a sua pasta, definida no campo Project Folder. A caixa de seleo Set as Main Project define o novo projeto como o principal (se a caixa ficar marcada), isso significa, que o NetBeans ir executar as operaes de compilar e emular este projeto. Em Create Hello MIDlet define-se que o NetBeans criar automaticamente uma classe que ser uma MIDlet bsica. Neste texto no ser trabalhado esta parte, julga-se necessrio o conhecimento do cdigo como um todo, posteriormente, o leitor pode navegar por estas guas facilmente, isso porque, ter conhecimento amplo do Java ME.

Figura 4: Segundo passo na criao de um novo projeto Java ME no NetBeans.

Posteriormente (Figua 5), necessrio configurar a verso da CLDC e da MIDP que sero usadas no projeto. Alm do emulador e do dispositivo que ser usado. Perceba que a verso que est marcada o Sun Wireless Toolkit, da Sun Microsystem. Infelizmente essa ferramenta no condiz inteiramente com a realidade de alguns telefones celulares. Aconselha-se o uso de emuladores dos prprios fabricantes, possibilitando assim um exame mais apurado de como o aplicativo se comportar.

Figura 5: Terceiro passo na criao de um novo projeto Java ME no NetBeans.

O Device a ser escolhido referente ferramenta de emulao que est marca em Emulator Platform. A escolha da verso da CLDC e da MIDP de suma importncia no desenvolvimento de uma MIDlet, isso porque, a escolha pode restringir a abrangncia da soluo desenvolvida. A CLDC 1.0 no possui suporte nativo a nmeros em ponto flutuante, se for necessrio, deve ser usada uma API separada, como a MathFP por exemplo. Essa a principal diferena entre a CLDC 1.0 e a CLDC 1.1.

A MIDP 2.0 traz vrias mudanas importantes em relao a sua precursora. O pacote GameCanvas permite a criao de jogos de uma maneira mais eficaz, contendo conceitos amplamente usadas na construo desse tipo de aplicativo. Alm disso, a MIDP 2.0 traz alguns componentes adicionais, como o javax.microedition.lcdui.CustomItem e javax.microedition.lcdui.Spacer. Alguns dos componentes ganharo novas funcionalidades, um deles, o Gauge pode ser includo em um Alert. Na classe javax.microedition.lcdui.Graphics foram adicionadas algumas diretivas grficas, como o desenho de tringulos.Sendo assim, a especificao da verso da MIDP e da CLDC de suma importncia para o projeto a ser desenvolvido. Felizmente, hoje em dia, o uso da MIDP 2.0 se sobressai substancialmente em relao a MIDP 1.0, se tornando um perfil padro, porm, vale lembrar que ainda existem aparelhos com a MIDP 1.0 e, dependendo do cliente ou do trabalho a ser desenvolvido, devem ser levados em conta. No momento da escrita desse trabalho a MIDP 3.0 ainda no havia sido lanada.

A partir desse ponto o projeto j pode ser iniciado, ou, informaes adicionais sobre o projeto podem ser configuradas, dando um Next na tela anterior obteremos a ltima tela do wizard, ilustrada na Figura 6:

Figura 6: Quarto e ltimo passo na criao de um novo projeto Java ME no NetBeans.5. Ciclo de vida de uma MIDlet

Uma MIDlet apresenta um ciclo de vida parecido com aquele adotado em Applets (aplicativos Java que executam em browser). Para facilitar o entendimento vamos imaginar um telefone celular. Na maioria dos modelos encontra-se uma pasta especfica para as aplicaes nativas do aparelho e outra para os aplicativos que o usurio instale depois da compra. Nesse local encontra-se uma lista das aplicaes instaladas no dispositivo. Quando escolhemos um item a MIDlet entra no estado Ativo. Quando algum evento externo acontecer, como uma mensagem SMS ou uma ligao, o AMS (Application Manager System, responsvel pelo gerenciamento de ativao e desativao das MIDlets presente no telefone celular) coloca a MIDlet em estado de espera, quando o evento externo se encerra, o MAS muda o status da MIDlet para ativo novamente. Finalmente, quando fechamos a aplicao o AMScoloca a aplicao no estado destrudo. A Figura 7 ilustra estes conceitos de forma grfica.

Figura 7: Ciclo de vida de uma aplicao Java ME.

J hora de vermos um pouco de cdigo no acham? Depois de dissertar sobre o ciclo de vida de uma MIDlet nada melhor que mostrar que cdigo que exemplifica tudo isso, veja a Listagem 1:Listagem 1: MIDlet bsica exemplificando Ciclo de Vida.

A primeira linha define o import necessrio para o uso da classe MIDlet. Um aplicativo desenvolvido em Java ME para pequenos dispositivos, s se comportar como tal, se o projeto possuir ao menos uma classe que herde da classe MIDlet. Sendo assim o uso da palavra extends seguido da classe de suma importncia na construo do projeto.

Quando existirem duas ou mais classes no projeto que herdem de MIDlet, todas ficaram dentro de uma MIDlet Sute. No instante que o usurio escolher o aplicativo no menu do seu aparelho, uma lista com todas as midlets presentes no Sute sero apresentadas.

Para que o ciclo de vida seja construdo, a classe deve implementar obrigatoriamente trs mtodos:

startApp(): chamado na inicializao do aplicativo, ou seja, quando o usurio escolhe o aplicativos na sua lista, o MAS chama o mtodo startApp() automaticamente:

pauseApp(): usado para o correto gerenciamento de eventos externos. Quando uma ligao ou uma mensagem SMS chegam ao telefone celular por exemplo, o MAS chama automaticamente o pauseApp(), transferindo o estado da aplicao de ativo para pausado.

destroyApp(): quando o usurio opta por fechar a aplicao, o MAS chama automaticamente o destroyApp(), liberando todos os recursos que eram usados por ela. 6. Display e DisplayableA classe java.mixroedition.lcdui.Display permite acesso ao display do dispositivo mvel. A classe oferece uma maneira de apresentar ao usurio os componentes presentes no pacote lcdui. Alm disso, oferece mtodos que capturam algumas caractersticas grficas, como a quantidade de cores, mtodos que permitem a vibrao do aparelho, dentre outros. A classe Displayable, presente no mesmo pacote, herdada por todos os componentes reutilizveis da MIDP, como DateFied, TextField, StringItem, dentro outros. Para criar uma instncia de Display necessrio o uso do mtodo esttico getDisplay(MIDlet midlet). Na tabela abaixo so listados os principais mtodos da classe Display e, em seguida da classe Displayable. Para maiores informaes recomenda-se a leitura da documentao da MIDP API.

Mtodos classe Display

booleanflashBacklight(intdurao) Requisita um efeito de flashing para o dispositivo. Este mtodo pode ser usado em jogos, informando o usurio de forma mais eficaz.

intgetBestImageHeight(inttipoImagem) Retorna a melhor altura para um determinado tipo de imagem.

intgetBestImageWidth(inttipoImagem) Retorna a melhor largura para um determinado tipo de imagem.

DisplayablegetCurrent() Recupera a instncia do objeto Displayable que est sendo mostrado na MIDlet.

staticDisplaygetDisplay(MIDletm) Retorna o objeto Display que nico para a MIDlet recebida por parmetro.

booleanisColor() Retorna um valor booleano informando se o dispositivo suporta cores ou no.

intnumAlphaLevels() Retorna o nmero de nveis de transparncia suportados pela implementao da MIDP no dispositivo.

intnumColors() Recupera o nmero de cores (se o retorno do mtodo isColor() for true) ou nveis de tons de cinza (se o retorno do mtodo isColor() false) que podem ser representados pelo dispositivo.

voidsetCurrent(Alertalerta, DisplayableproximoDisplayable) Requisita que a instncia de Alert seja mostrada no display, e o proximoDisplayable seja mostrado depois que o Alert for fechado.

voidsetCurrent(DisplayableproximoDisplayable) Requisita que uma instncia de Displayable seja visualizada no display do dispositivo..

voidsetCurrentItem(Itemitem) Requisita que o Displayable que contenha o Item seja mostrado, se o Item no estiver visvel o Displayable deve rolar at o mesmo ficar em evidncia.

booleanvibrate(intduracao) Requisita que o dispositivo vibre por um intervalo de tempo especificado por duracao.

Mtodos classe Displayable

voidaddCommand(Commandcomando) Adiciona um command para o Displayable.

TickergetTicker() Recupera o ticker usado pelo Displayable.

StringgetTitle() Retorna o ttulo do Displayable.

booleanisShown() Checa se o Displayable est visvel no display.

voidremoveCommand(Commandcmd) Remove um command do Displayable.

voidsetCommandListener(CommandListenerl) Configura um listener para os Commands do Displayable, sobrescrevendo qualquer CommandListener previamente configurado.

voidsetTicker(Tickerticker) Configura um ticker para seu usado no Displayable..

voidsetTitle(Strings) Configura o ttulo do Displayable.

Com o decorrer dos exemplos, o entendimento das classes Display e Displayable ser completo. Apenas para comear, veja uma melhoria do cdigo apresentado na Listagem 1. A Listagem 2 mostra oque necessrio fazer para mostrar para o usurio um objeto javax.microedition.lcdui.Form. Este componente ser explicado posteriormente, por hora, necessrio saber apenas que ele herda diretamente de Displayable.Liistagem 2: Cdigo para mostrar um objeto Form ao usurio.

7. Interface GrficaA construo de interfaces grficas em Java ME tem trs caminhos: o uso de componentes grficos prontos, a construo de telas personalizadas com diretivas grficas e, por fim, o uso de algum framework que personaliza alguns componentes padres da MIDP. O uso de componentes prontos, inseridos dentro do pacote javax.microedition.lcdui tornam o processo de desenvolvimento mais rpido, porm, no possvel adicionar cores, mudar fontes ou estilo de linhas dos componentes, eles so fechados. O uso de diretivas grficas torna o processo de codificao mais penoso, porm, o resultado grfico, na maioria das vezes, ser superior aos componentes, isso porque, o usurio pode fazer a combinao de diretivas que quiser, criando os mais variados tipos de interfaces. Alm disso, existem frameworks que podem ser entendidos como componentes mais amigveis, com opes de configurao de comportamento grfico. No decorrer do texto vamos demonstrar as duas primeiras formas, que so oriundas da API MIDP, os frameworks ficam como lio de casa para os leitores mais interessados. A Figura 8 ilustra uma breve arquitetura das classes do pacote javax.microedition.lcdui, responsvel pela interface grfica dos aplicativos Java ME.

Figura 8: rvore de classes para interface grfica em aplicaes Java ME. Imagem retirada de < http://www.javaworld.com/javaworld/jw-11-2003/jw-1107-wireless.html?page=2>.O ponto crucial a ser entendido na figura a diviso entre Screen (interface grfica de alto nvel) e Canvas (interface grfica de baixo nvel). Os dois no podem coexistir em uma instncia de um objeto Displayable, ou seja, ou usamos um ou outro para a interface. Optando por Screen tm-se alguns componentes prontos para a utilizao. Com Canvas, tudo por parte da imaginao e codificao do programador.8. Command e CommandListener

Antes de comear a mexer nos componentes importante conhecer as classes javax.microedition.lcdui.Command e javax.microedition.lcdui.CommandListener. Os comandos so inseridos nas classes que herdam diretamente de Displayable, ou seja, Canvas, TexBox, Alert, List e Form, alm dos itens Gauge e Spacer. Eles so umas das formas mais primitivas de interao com o usurio. Excluindo as formas presentes no Canvas e nos componentes na MIDP, os comandos so a nica forma de contato com o usurio.

Construtor da classe Command

Command(Stringrotulo, inttipoComando, intprioridade) Cria um novo objeto Command com um rtulo, tipo e prioridade.

Command(StringrotuloCurto, StringrotuloLongo, inttipoComando, intprioridade) Cria um novo objeto Command com um rtulo curto e um longo, alm do seu tipo e prioridade.

Mtodos da classe Command

intgetCommandType() Retorna o tipo do comando.

StringgetLabel() Retorna o rtulo curto do comando.

StringgetLongLabel() Retorna o rtulo longo do comando.

intgetPriority() Retorna a prioridade do comando.

Um conceito importante a ser discutido aqui o tipo do comando. Este tipo uma das constantes da classe: BACK, CANCEL, EXIT, HELP, ITEM, OK, SCREEN, STOP. Por exemplo, se o tipo configurado for EXIT, ele no ter o comportamento de sair da aplicao, mas sim, ser colocado onde o comando EXIT do aparelho est. A funcionalidade do comando quem configura o programador.

Figura 9: Command EXIT no emulador de celular amplamente conhecido.

Figura 10: Command EXIT em um dispositivo com teclado QWERTY, presente em alguns smartphones e PDAs (Personal Digital Assistant).

Perceba o comando Sair que est presente nas duas figuras acima, ambos tero o mesmo comportamento, que foi configurado pelo programador (ver Listagem 3), porm, esto em locais totalmente diferentes. Isso acontece porque a JVM do dispositivo define o local que o command do tipo EXIT ir ficar. A Listagem 3 mostra o cdigo necessrio para gerar o programa ilustrado nas figuras 9 e 10.

A classe javax.microedition.lcdui.CommandListener o ouvidor que captura os eventos de seleo dos Commands. Para us-la, basta que a classe implemente a classe, atravs do uso da palavra reservada implements. Alm disso, o mtodo commandAction(Command c, Displayable d) deve ser implementado. O parmetro que especifica o comando que originou o evento muito importante quando tempos vrias telas implementando o mesmo comando, sendo assim, podemos fazer um tratamento diferenciado dependendo da tela onde o comando foi acionado.Listagem 3: Classe que usa um Command do tipo EXIT.

9. Interface Grfica de Alto NvelO uso de componentes facilita o processo de codificao, isso indiscutvel, sendo assim, vamos comear por este mtodo, depois partiremos para a cereja do bolo. A classe Screen apresenta quatro classes que representam componentes grficos: Form, List, TextBox e Alert. A Figura 9 ilustra esta arquitetura. Vale ressaltar que no possvel mostrar duas instncias destas classes no mesmo Display.

Figura 11: Classes pertencentes que herdam de Screen. Imagem retirada de < http://www.devx.com/wireless/Article/21262/1954>.

9.1 Alert

A classe javax.microedition.lcdui.Alert permite que o programador apresente um alerta para o usurio do aplicativo. Este alerta pode receber configuraes de som, de ttulo, de mensagem apresentada e da imagem que anexada. Nas duas tabelas abaixo encontra-se, respectivamente, os dois construtores da classe e os principais mtoodos.Construtores da classe Alert

Alert(Stringttulo) Constri um novo objeto, um Alert vazio somente com o ttulo.

Alert(Stringtitulo, StringtextoAlerta, ImageimagemAlerta, AlertTypetipoAlerta) Constri um novo objeto Alert com um ttulo, contedo, imagem e tipo passados por parmetro.

O primeiro construtor resulta em um alerta semelhante ao da Figura 10, ou seja, somente com o ttulo. O segundo construtor insere, alm do ttulo, uma mensagem, uma imagem e um tipo, sendo que, um pequeno trecho de som vinculado ao Alert dependendo do tipo configurado, resultando na Figura 11.

Figura 12: Alert somente com ttulo.Figura 13: Alert gerado com o construtor de quatro parmetros.

A Listagem 4 mostra o cdigo necessrio para a criao dos dois Alerts mostrados anteriormente.

Listagem 4: Construtores da classe Alert.Method Summary

voidaddCommand(Commandcmd) Similar ao Displayable.addCommand(javax.microedition.lcdui.Command), entretanto, quando a aplicao adiciona um comanndo para o Alert, o DISMISS_COMMAND removido automaticamente.

intgetDefaultTimeout() Retorna o tempo padro que um Alert ficar visvel.

ImagegetImage() Retorna a imagem usada no Alert.

GaugegetIndicator() Retorna o indicador associado ao Alert.

StringgetString() Retorna o texto usado no Alert.

intgetTimeout() Retorna o tempo que o Alert ficar visvel.

AlertTypegetType() Retorna o tipo do Alert.

voidremoveCommand(Commandcmd) Similar a Displayable.removeCommand(javax.microedition.lcdui.Command), entretanto, quando a aplicao remove um comando do lert, o DISMISS_COMMAND automaticamente adicionado.

voidsetCommandListener(CommandListenerl) O mesmo que Displayable.setCommandListener(javax.microedition.lcdui.CommandListener).

voidsetImage(Imageimg) Configura a instncia de Image a ser usada no Alert.

voidsetIndicator(Gaugeindicador) Configura um indicador para o Alert.

voidsetString(Stringstr) Configura o texto que ser usado no Alert.

voidsetTimeout(inttime) Configura o tempo que o Alert dever ficar visvel.

voidsetType(AlertTypetype) Configura o tipo do Alert.

A maioria dos mtodos da classe so auto-explicativos, porm, dois deles merecem um tratamento a parte. O mtodo setType recebe por parmetro uma instncia da classe javax.microedition.lcdui.AlertType. Esta classe tem cinco constantes: ALARM, CONFIRMATION, ERROR, INFO e WARNING. Uma delas ser passada para o mtodo. Este tipo configura um som que executado quando o Alert mostrado ao usurio.

A classe AlertType tambm permite que um som seja executado aleatoriamente, em qualquer parte do aplicativo. Para isso, basta usar o mtodo playSound(Display d), como mostra a linha de cdigo abaixo:AlertType.WARNING.playSound(display);

O mtodo setIndicator associa ao Alert um objeto da classe javax.microedition.lcdui.Gauge. Este item ser visto detalhadamente mais adiante, se preferir, o leitor pode dar uma lida na descrio do item agora e tentar implementar este mtodo. Lembrando que ele est presente somente a partir da MIDP 2.0.

9.2 TextBox

A classe javax.microedition.lcdui.TextBox apresenta ao usurio uma caixa de texto, semelhante ao componentes JTextArea presente na plataforma Java SE. Seu nico construtor recebe o ttulo, uma String que pode ser o texto inicial do componente, o tamanho mximo de caracteres que rea de texto suportar, e, por fim, recebe um inteiro que representa a constante de mscara do texto. Esta mscara uma das constantes presentes na classe javax.microedition.lcdui.TextField. Todas mscaras sero tratadas posteriormente, porm, para fins didticos, cito aqui algumas para facilitar o entendimento: ANY (qualquer texto), PASSWORD (o texto digitado se transforma em um caracter definido pela JVM, geralmente o *) e URL (a caixa de texto s aceita a entrada de um texto no formato de URL).Construtor da classe TextBox

TextBox(Stringttulo, Stringtexto, inttamanhoMax, intmascara) Cria um novo objeto TextBox com um ttulo, texto, tamanho mximo e mscara recebidos por parmetro.

A Figura 12 ilustra o componente gerado pelo cdigo representado na Listagem 5. importante ressaltar que somente o mtodo startApp sofreu alteraes, por isso, a Listagem 4 pode ser usada, trocando somente o mtodo referido anteriormente.

Figura 14: Exemplo do componente TextBox.

Listagem 5: Cdigo necessrio para gerar um TextBox.

Mtodos da classe TextBox

voiddelete(intinicio, inttamanho) Deleta os caracteres especificados do inicio e com um tamanho fixo.

intgetCaretPosition() Retorna a posio corrente do cursor.

intgetChars(char[]data) Copia o contedo do TextBox para um vetor de caracteres.

intgetConstraints() Recupera a mscara em uso do TextBox.

intgetMaxSize() Retorna o tamanho mximo (nmero de caracteres) que podem ser armazenados no TextBox.

StringgetString() Recupera o contedo do TextBox.

voidinsert(char[]data, intindice, inttamanho, intposicao) Insere dados de um array de caracteres, especificando o indice e o tamanho a ser copiado. O parmetro posicao indica o ndice do TextBox que receber o novo texto.

voidinsert(Stringsrc, intposicao) Insere uma string no contedo de texto do TextBox, especificando a posio.

voidsetChars(char[]data, intinicio, inttamanho) Configura o contedo do TextBox a partir de um vetor de caracteres..

voidsetConstraints(intmascara) Configura a mscara de entrada de dados do TextBox.

intsetMaxSize(inttamanhoMaximo) Configura o tamanho mximo (nmero de caracteres) que o TextBox suporta.

voidsetString(Stringtexto) Configura o contedo do TextBox.

voidsetTicker(Tickerticker) Configura um item ticker a ser usado pelo Displayable.

voidsetTitle(Stringtitulo) Configura o ttulo do Displayable.

intsize() Retorna o nmero de caracteres que esto armazenados no TextBox.

Assim como o Alert, as classes do TextBox so fceis de entender, porm, para facilitar a vida do leitor, a Listagem 6 apresenta uma classe que mostra um TextBox e faz diversas alteraes no componente a cada vez que o Command pressionado.

Listagem 6: Classe que manipula o componente TextBox.

A Figura 13 apresenta o resultado do cdigo. importante perceber na parte superior do TextBox, ao contrrio da Figura 12, aparece um texto, que faz parte do Ticker que foi adicionado com o mtodo setTicker. Mais sobre este item posteriormente. O texto do componente tambm apresentado com uma mscara de senha, isso aconteceu depois da linha de cdigo setConstraint(TextField.PASSWORD).

Figura 15: Tela resultante da Listagem 5.

9.3 ListA classe javax.microedition.lcdui.List permite que o desenvolvedor apresenta uma lista para o usurio. A classe apresenta dois construtores: pode-se construir uma lista vazia passando apelas o ttulo da lista e o seu tipo, ou, passamos ainda um vetor de strings e um vetor de imagens, que formaro os itens da lista. Independente do construtor, os itens da lista podem ser rearranjados de vrias maneiras mesmo depois da inicializao do componente, atravs dos mtodos insert, delete, deleteAl e set.Quanto ao tipo da List, ela pode ser referenciada com uma das trs constantes oferecidas pela classe:

EXCLUSIVE: permite que somente um item seja selecionado a cada vez.

MULTIPLE: permite a seleo de vrios itens da lista.

IMPLICIT: cada seleo de item dispara um evento que pode ser capturado pelo ComandListener da classe.Construtores da classe List

List(Stringtitulo, inttipoLista) Cria um novo objeto List vazio, especificando somente o ttulo e o tipo da lista.

List(Stringtitulo, inttipoLista, String[]elementos, Image[]iconesElementos) Cria um novo objeto List, especificando o ttulo, o tipo da lista, um vetor de Strings e imagens que compes os itens da lista.

Method Summary

intappend(Stringstring, Imageimagem) Adiciona um novo item ao objeto List.

voiddelete(intindice) Deleta o elemento referenciado pelo indice.

voiddeleteAll() Deleta todos os elementos da lista.

FontgetFont(intindice) Retorna a fonte usada pela aplicao de um elemento especifcado pelo parmetro recebido.

ImagegetImage(intindice) Retorna o objeto Image de um elemento especfico referenciado pelo indice.

intgetSelectedFlags(boolean[]arrayRetorno) Armazena o estado dos elementos do List no array recebido por parmetro.

intgetSelectedIndex() Retorna o nmero do ndice do elemento que est selecionado na lista.

StringgetString(intindice) Retorna a String do elemento referenciado por indice.

voidinsert(intindice, StringparteString, ImageparteImagem) Insere um elemento na lista, colocando ele no ndice..

booleanisSelected(intindice) Verifica se o elemento do indice est selecionado ou no.

voidremoveCommand(Commandcmd) O mesmo que Displayable.removeCommand.

voidset(intindice, StringstringPart, ImageimagePart) Configura o String e a Image de um elemento da lista, referenciado pelo ndice.

voidsetFont(intindice, Fontfont) Configura a fonte de um elemento da lista.

voidsetSelectedFlags(boolean[]arraySelecionados) Configura o estado de todos os itens da lista.

voidsetSelectedIndex(intindice, booleanselecionado) Configura o estado de um indice para selecionado ou no.

voidsetTicker(Tickerticker) Configura um ticker para usar com este Displayable.

voidsetTitle(Strings) Configura o ttulo do Displayable.

intsize() Recupera o nmero de elementos do List.

Os mtodos da classe List so auto-explicativos, pois seguem basicamente o mesmo padro dos outros componentes. A Listagem 7 ajudar o leitor a fixar alguns dos principais mtodos. As Figuras que se encontro logo abaixo do cdigo representam o comportamento do componente aps a execuo de cada mtodo:

Listagem 7: Classe que manipula o componente List.

Figura 16: Lista inicial.Figura 17: Lista aps a execuo do mtodo lsMain.delete(2).Figura 18: Lista aps a execuo do mtodo lsMain.insert.

Figura 19: Lista aps a execuo do mtodo lsMain.set(1, "Pera", null).Figura 20: Lista aps a execuo do mtodo lsMain.append("Maa", null).Figura 21: Lista aps a execuo do mtodo lsMain.setFont().

10. Interface Grfica de Alto Nvel Form

A classe javax.microedition.lcdui.Form merece um captulo a parte, isso porque o componente pode agregar outros componentes, que so chamados de itens. Uma analogia um quadro de recados, onde qualquer pessoa pode colocar um lembrete, uma foto, ou qualquer outra coisa, somente grudando no quadro. A tabela abaixo apresenta os dois construtores da classe.Construtores da classe Form

Form(Stringtitulo) Cria um novo objeto Form, somente com o titulo.

Form(Stringtitulo, Item[]items) Cria um novo objeto Form, especificando seu titulo e seus itens iniciais.

O primeiro construtor cria um objeto Form somente com ttulo, sem nenhum item inicial. O segundo construtor permite que o programador passe um vetor com instncias da classe javax.microedition.lcdui.Item. Indiferente do mtodo usado, a classe fornece meios de adicionar ou remover qualquer Item em qualquer momento. A tabela abaixo apresenta os principais mtodos da classe.

Principais mtodos da classe Form

intappend(Imageimg) Adiciona um item da classe Image para o Form.

intappend(Itemitem) Adiciona um Item dentro do Form.

intappend(Stringstr) Adiciona um item String para o Form.

voiddelete(intindiceItem) Deleta um Item refeenciado pelo seu indice.

voiddeleteAll() Deleta todos os itens do Form, deixando-o com zero itens.

Itemget(intindiceNum) Recupera o item de um dado ndice.

intgetHeight() Returns the height in pixels of the displayable area available for items.

intgetWidth() Returns the width in pixels of the displayable area available for items.

voidinsert(intitemNum, Itemitem) Inserts an item into the Form just prior to the item specified.

voidset(intitemNum, Itemitem) Sets the item referenced by itemNum to the specified item, replacing the previous item.

voidsetItemStateListener(ItemStateListeneriListener) Sets the ItemStateListener for the Form, replacing any previous ItemStateListener.

intsize() Gets the number of items in the Form.

Os mtodos seguem o padro das outras classes, ou seja, so intuitivos. Uma considerao sobre a diferena entre os mtodos append e insert, porm, bem vinda. O primeiro adiciona o Item logo abaixo dos demais, ou seja, se o formulrio contm cinco itens, o novo ser adiciona logo aps o quinto elemento. Porm, o mtodo insert coloca o novo item na posio especifica pelo parmetro recebido, ou seja, se passarmos 0, o novo item ser inserido na primeira posio.

importante perceber tambm a importncia do mtodo setItemStateListener. Diferentemente dos outros componentes vistos at agora, o Form pode conter um listener que verifica quando um dos seus itens foi modificado. Quando uma classe implementa a interface javax.microedition.lcdui.ItemStateListener, deve, obrigatoriamente, implementar tambm o mtodo itemStateChanged(Item item). A Listagem 8 apresenta trechos de cdigo da classe ExForm, que implementa o listener ItemStateListener.

A primeira linha traz o primeiro ponto crucial, que o implements ItemStateListener. Isso faz com que a classe possa ficar escutando as possveis alteraes nos itens associados a um Form. O segundo ponto o uso do mtodo setItemStateListener(MIDlet midlet) em um formulrio. O Item ChoiceGroup vai ser detalhado posteriormente. Com a implementao da interface ItemStateListener obrigatrio o uso do mtodo itemStateChanged(Item item). O parmetro recebido serve para que o programador possa implementar uma funcionalidade para cara Item que aciona o listener.

Listagem 8: Trecho de cdigo da classe ExForm que implementa a ItemStateListener.

10.1 Itens

A classe javax.microedition.lcdui.Item possui subclasse que podem ser adicionadas em instncias das classe Form e Alert. No total so oito subclasses: ChoiceGroup, CustomItem, DateField, Gauge, ImageItem, Spacer, StringItem e TextField. Todos estes componentes possuem dois mtodos herdados de sua superclasse, que so getLabel() e setLabel(String rotulo). O rtulo de um componente geralmente fica na extremidade esquerda do mesmo, porm, esse comportamento pode variar de implementao para implementao. A Figura 22 ilustra os itens que podem ser acoplados a um objeto da classe Form.

Figura 22: Itens presentes na MIDP 2.0 que podem ser usados dentro de um objeto da classe Form. Retirado de: http://www.devx.com/wireless/Article/21262/1954Mtodos da classe Item

StringgetLabel() Retorna o rtulo do objeto Item.

voidsetLabel(Stringrotulo) Configura o rtulo do objeto Item.

10.2 ChoiceGroup

A classe permite que o programador apresente um grupo de escolha ao usurio. Seu construtor recebe os mesmo parmetros que a classe List, ou seja, um rtulo, seu tipo, e (opcionalmente) uma lista de itens pr-configurados para o componente. Uma diferena sutil, porm importantssima, tem relao a seu tipo. No List o programador pode usar a constante IMPLICIT para configurar um evento automaticamente assim que o objeto sofrer modificaes, j no ChoiceGroup, as opes disponveis so: MULTIPLE (mltipla escolha), EXCLUSIVE (apenas um item selecionado por vez) e POPUP (os itens so apresentados em uma janela popup).Para ilustrar melhor oque seria um ChoiceGroup, e at mesmo o tipo POPUP, vejam as Figuras 23 e 24. A primeira apresenta os trs tipos possveis do item, sendo eles do primeiro para o ltimo: EXCLUSIVE, POPUP e MULTIPLE. Notem que no ltimo tipo os dois combos esto selecionados. A Figura 23 mostra o ChoiceGroup POPUP selecionado.

Figura 23: ChoiceGroup e seus tipos.Figura 24: ChoiceGroup Popup selecionado.

importante ressaltar que os componentes MIDP no oferecem um comportamento grfico homogneo em todas as plataformas em que so executadas. Usando o exemplo do ChoiceGroup, veja a Figura 25, que traz a execuo do mesmo aplicativo, porm, em um emulador de um telefone celular da Samsung. Perceba que o segundo choice, que do tipo POPUP est selecionado, tendo um comportamento completamente diferente daquele emulado pelo Wireless Toolkit.

Figura 25: ChoiceGroup Popup selecionado no emulador do SGH-X800 da Samsung.Construtores da classe ChoiceGroup

ChoiceGroup(Stringrotulo, inttipo) Cria um novo ChoiceGroup vazio, especificando seu ttulo e seu tipo.

ChoiceGroup(Stringrotulo, inttipo, String[]elementosString, Image[]elementosImagem) Cria um novo ChoiceGroup, especificando seu ttulo, o tipo e um vetor com strings e imagens eu formam os elementos do componente.

Os mtodos da classe ChoiceGroup apresentam o mesmo comportamento da classe List. Principais mtodos da classe ChoiceGroup

intappend(Stringtexto, Imageimagem) Adiciona um novo elemento ao Choice.

voiddelete(intindice) Deleta o elemento referenciado pelo seu ndice.

ImagegetImage(intindice) Retorna um objeto Image do elemento referenciado pelo ndice.

intgetSelectedFlags(boolean[]arrayRetorno) Recupera o estado dos elementos de um ChoiceGroup, armazendo-os em um vetor de booleanos recebido por parmetro.

intgetSelectedIndex() Retorna o ndice do elemento que est selecionado atualmente.

StringgetString(intindice) Retorna o texto do elemento referenciado pelo seu ndice.

voidinsert(intindice, Stringtexto, Imageimagem) Insere um elemento dentro do Choice no ndice especificado por parmetro.

booleanisSelected(intindice) Retorna um valor booleano indicando se o ndice do parmetro est selecionado ou no.

voidset(intindice, Stringtexto, Imageimagem) Configura o elemento referenciado pelo sue ndice, atualizando seu texto e sua imagem com os parmetros recebidos.

voidsetSelectedFlags(boolean[]arraySelecionado) Tenta configurar o estados de cada elemento de um ChoiceGroup.

voidsetSelectedIndex(intindice, booleanselecionado) Para objetos ChoiceGroup do tipo MULTIPLE, ele simplesmente configura o estado de um elemento individualmente.

intsize() Retorna o nmero de elementos presentes no ChoiceGroup.

10.3 StringItem

A classe javax.microedition.lcdui.StringItem fornece ao desenvolvedor um componente de apresentao de texto. Este componente passou a apresentar iterao com o usurio somente a partir da MIDP 2.0, atravs de seu construtor que recebe um inteiro chamado de appearance mode, ou, um inteiro que define o design do item. bom lembrar, que o comportamento visual de todos os itens no homogneo em todos os dispositivos. As opo so:

PLAIN: Nenhuma alterao apresentada, o StringItem padro apresentado.

BUTTON: O StringItem ganha o formato de um boto. Alm disso, o mesmo pode contar um ItemCommandListener para capturar as aes do usurio. Desta maneira, o StringItem ganha forma e comportamento de um boto.

HYPERLINK: O StringItem recebe o formato de um hyperlink. Alm disso, tambm pode conter a ItemCommandListener. O outro construtor da classe no especifica o comportamento de aparncia do item, somente passa como parmetro seu rtulo e o seu texto. A aparncia recebe, por padro, a opo PLAIN.

A Figura 26 apresenta trs tipos de StringItem, sendo eles: um para o nome do usurio (BUTTON), um para a idade (PLAIN) e, finalmente, um para a cidade (KYPERLINK). Perceba que a Figura 27 apresenta os mesmos StringItens porm, a apresentao difere do emulador ao lado. Isso acontece pela falta de padronizao das JVMs presentes nos dispositivos, gerando interfaces dispares em aparelhos de plataformas diferentes. Porm, o comportamento e as funes dos componentes continua inalterada.

Figura 26: Exemplos de StringItem no emulador do WTK da SunFigura 27: Exemplos de StringItem no emulador do Nokia 6165.

A Listagem 9 apresenta o cdigo necessrio para criar o aplicativo que apresentado nas Figuras 26 e 27. Perceba que necessrio a criao de um objeto do tipo Command, para ser utilizado nos StringItem que no so do tipo PLAIN. Alm disso, um listener deve ser adicionado a cada um destes itens, atravs do mtodo setItemCommandListener. Posteriormente, no mtodo commandAction(Command, Item) possvel configurar a ao referente a cada StringItem.

Listagem 9: Trecho de cdigo da classe ExStringItem que apresenta a forma de utilizao do item.

Abaixo, seguem as tabelas de construtores e mtodos, respectivamente. Os mtodos so auto-explicativos.Construtores da classe StringItem

StringItem(Stringrotulo, Stringtexto) Cria um novo objeto StringItem.

StringItem(Stringlabel, Stringtext, intappearanceMode) Cria um novo StringItem com um rtulo, texto e aparncia.

Mtodos da classe StringItem

intgetAppearanceMode() Retorna o modo de aparncia do StringItem.

FontgetFont() Retorna a fonte usada no momento pelo StringItem.

StringgetText() Retorna o contedo de texto do StringItem, ou null se o StringItem est vazio.

voidsetFont(Fontfonte) Configura a fonte utilizada pelo StringItem.

voidsetPreferredSize(intlargura, intaltura) Configura a largura e altura preferencial do Item.

voidsetText(Stringtexto) Configura o contedo de texto do StringItem.

10.4 TextFieldA classe javax.microedition.lcdui.TextField permite ao desenvolvedor a utilizao de um componente de entrada de texto padro. Seu nico contrutor especifica o rtulo que ficar (geralmente) no lado esquerdo do componente, um texto inicial (pode ser configurado como uma string vazia, quando o desenvolvedor no deseja nenhum texto padro), um tamanho mximo de caracteres que o campo ir possuir e, finalmente, uma constraint, que funciona como uma mscara. Para conhecer o componente pessoalmente, veja as Figuras 28 e 29.

Figura 28: Exemplos de TextField no emulador do Motorola RAZRFigura 29: Exemplos de TextField no emulador do WTK da Sun

O conceito de constraint merece uma ateno especial. A classe apresenta constantes que definem estes valores, as principais so mostradas a seguir:ANY: permite a entrada de qualquer texto.DECIMAL: o usurio pode informar valores decimais, por exemplo "-123", "0.123", or ".5".

EMAILADDR: o usurio pode informar valores no formato de e-mail.NUMERIC: o usurio pode inserir somente valores numricos.

PASSWORD: indica que o texto confidencial, geralmente, os caracteres digitados so mostrados no visor de telefone celular como um caracter especial (*).

PHONENUMBER: o usurio informa um nmero de telefone. Em algumas implementaes da Java ME, um campo deste tipo, permite o acesso a agenda de telephone fo aparelho.

URL: o usurio insere uma URL.Por exemplo, se um novo campo senha for colocado na aplicao mostrada nas Figuras 28 e 29, e seu constraints for definido como PASSWORD, e, o usurio digite uma senha 12345, ele ver no display do seu telefone celular uma tela semelhante a da Figura 30.

Figura 30: Exemplos de TextField com um campo tipo PASSWORD

Abaixo, segue o construtor e os principais mtodos da classe TextField. A Listagem 10, por sua vez, apresenta o cdigo fonte necessrio para produzir a aplicao mostrada na Figura 30.

Construtor da classe TextField

TextField(Stringlabel, Stringtexto, inttamanhoMaximo, intconstraints) Cria um novo objeto TextField com um rtulo, texto inicial, tamanho mximo de caracteres e uma mscara.

Principais mtodos da classe TextField

voiddelete(intinicio, inttamanho) Deleta caracteres do TextField.

intgetCaretPosition() Pega a posio de input corrente.

intgetChars(char[]data) Copia o contedo do TextField para um vetor de caracteres, comeando do ndice zero.

intgetConstraints() Retorna o constraints (mscara) corrente do TextField.

intgetMaxSize() Retorna o tamanho mximo (nmero de caracteres) que pode ser armazenado no TextField.

StringgetString() Retorna o contedo do TextField como um valor de String.

voidinsert(char[]dados, intinicio, inttamanho, intposicao) Insere uma parte de um vetor de caracteres no contedo do TextField.

voidinsert(Stringtexto, intposicao) Insere uma string no contedo do TextField.

voidsetChars(char[]dados, intincio, inttamanho) Configura o contedo do TextField a partir de um vetor de caracteres, sobrepondo o contedo prvio.

voidsetConstraints(intconstraints) Configura o constraint (mscara) do TextField.

intsetMaxSize(inttamanhoMaximo) Configura o tamanho mximo (nmero de caracteres) que o component epode conter.

voidsetString(Stringtexto) Configura o contedo do TextField como um valor String, substituindo o contedo prvio.

intsize() Recupera o nmero de caracteres que esto armazenados no TextField.

Listagem 10: Trecho de cdigo da classe ExTextField que apresenta a forma de utilizao do TextField.

10.5 DateField

A classe javax.microedition.lcdui.DateField permite que o programador apresente ao usurio um componente de seleo de data e tempo. Seu primeiro construtor o rtulo e seu modo. O modo representado por uma das duas constantes da classe:

DATE: somente edio da data.

DATE_TIME: edio de data e hora.

O seu modo difere na interface visual do componente e na sua funo. As Figura 31 apresenta os dois componentes, o primeiro do tipo DATE, e, o ltimo DATE_TIME. A mesma figura pode ser utilizada para explicar o conceito de TimeZone. Perceba que a Figura apresenta dois componentes com data e hora, o primeiro apresenta a hora local (03:54) e o segundo apresenta a data e hora do local de destino de viagem (Denver, 08:54).

Figura 31: Exemplos de componente DateField DATE e DATE_TIME.

A Listagem 11 mostra o cdigo necessrio para a instanciao dos dois ltimos componentes. Perceba que o segundo operador new define o TimeZone do componente como GMT-07:00. Posteriormente, os dois componentes so configurados com a mesma data, porm, percebe-se claramente que a data do DateField do horrio local difere da data do DateField do horrio em Denver.

Listagem 11: Trecho de cdigo que apresenta a criao de configurao dos dois componentes DateField DATE_TIME.

Abaixo, segue os dois construtores da classe DateField, seguido de seus principais mtodos.Construtores da classe DateField

DateField(Stringrotulo, intmodo) Cria um novo objeto DateField com seu rtulo e modo especfico.

DateField(Stringrotulo, intmodo, TimeZonetimeZone) Cria um novo objeto, onde o clculo do calendrio baseado em um objeto TimeZone especfico. Padronizando o sistema de calendrio para local corrente especificado.

Principais mtodos da classe DateField

DategetDate() Retorna o valor do campo.

intgetInputMode() Retorna o modo do DateField.

voidsetDate(Datedate) Configura um novo valor para o campo.

voidsetInputMode(intmode) Configura um novo modo para o campo de data.

Um dos pontos importantes a ser percebido, o fato de sua falta de padronizao de interface entre as plataformas de implementao da Java ME. Pode-se dizer que o componente MIDP que apresenta a maior falta de semelhana entre suas implementaes, sendo assim, no fique assustado se seu aplicativo tiver uma cara em um emulador e, quando for transposto para um telefone celular real, tiver uma cara totalmente diferente. Na tabela abaixo esto presentes os emuladores da Srie 80 dos telefones Nokia, LG 160 e emulador padro do Sun Wireless Toolkit.

Figura 32: Exemplos de DateField no emulador da Srie 80 da Nokia.

Figura 33: Exemplos de edio de um componente DateField no emulador da Srie 80 da Nokia.

A Figura 32 e 33 apresenta o DateField sendo executado em um emulador do Nokia srie 80. Perceba que alm da mudana de interface, sua edio de d de duas maneiras. A primeira, consiste na digitao da data e da hora, a segunda, acessando o componente, neste momento, uma tela pop-up aberta e a data pode ser escolhida dentro de um calendrio grfico. A escolha da hora no possui a escolha do pop-up.A Figura 34 apresenta o DateField em um emulador do LG 160. Sua interface grfica j sofreu uma grande diferena em relao aquela apresentada na Figura 32.

Figura 34: Exemplos do componente DateField no emulador do aparelho LG 160.

Figura 35: Exemplo de edio do componente DateField (modo DATE) no emulador do aparelho LG 160.Figura 36: Exemplo de edio do componente DateField (modo DATE_TIME) no emulador do aparelho LG 160.

As Figuras 35 e 36 nos do uma noo exata da falta de padronizao da interface grfica do DateField. No primeira, apresentada a tela de edio do componente quando seu modo DATE, por sua vez, a Figura 36 ilustra a tela de edio do DateField com o seu modo configurado para DATE_FIELD. Lembrando que o programador no teve que digitar nenhuma linha de cdigo para que o calendrio e o relgio analgico fossem mostrados ao usurio, somente usou o operador new e passou os parmetros necessrios ao construtor da classe.

A Figura 36 apresenta a tela que edita a hora do componente DateField (modo DATE_FIELD), no emulador da Sun. Lembrando que a interface padro do componente no mesmo emulador mostrada na Figura 31. A Figura 37 ilustra a edio da data do DateField.Figura 36: Exemplo de edio da hora do componente DateField no emulador da Sun.Figura 37: Exemplo de edio da data do componente DateField no emulador da Sun.

A Listagem 12 apresenta o cdigo necessrio para criao da aplicao que foi mostrada nos exemplos do componente TextField.

Listagem 12: Classe de exemplo de uso do componente DateField.

10.5 ImageItem

A classe javax.microedition.lcdui.ImageItem permite a utilizao de um componente que tem como funo bsica, mostrar uma imagem no display do aparelho do usurio. Os dois construtores recebem quatro parmetros padro: um valor String que ser o rtulo do componente (geralmente fica no lado esquerdo), uma instncia de um objeto Image que define a imagem propriamente dita, um inteiro que define o layout do componente um texto alternativo que pode substituir a imagem. O construtor mais extenso, tambm recebe um inteiro, que define a sua aparncia, semelhante ao que ocorre com o componente StringItem (esse construtor est presente s na verso da MIDP 2.0 e superiores).Construtores da classe ImageItem

ImageItem(Stringrotulo, Imageimagem, intlayout, StringtextoAlternativo) Cria um novo objeto ImageItem com um rtulo, uma imagem, um layout e um texto alternativo.

ImageItem(Stringrotulo, Imageimagem, intlayout, StringtextoAlternativo, intmodoAparencia) Cria um novo objeto ImageItem com um rtulo, uma imagem, um layout, um texto alternativo e um valor inteiro que define seu modo de aparncia.

Quando um objeto da classe Image utilizado para criar o objeto ImageItem, o programador tem duas opes: pode utilizar uma imagem mutvel ou imutvel. Uma imagem imutvel carregada da prpria aplicao, ou seja, um arquivo com extenso .png que foi empacotada junto com o arquivo. .jar da aplicao, ou ainda, uma imagem que buscada em uma pgina web. Imagem mutvel criada de dentro da aplicao, o programador utiliza a seguinte linha de cdigo:

Image teste = Image.createImage(30, 30);

Graphics g = teste.getGraphics();

A classe Image possui duas maneiras de criar um objeto do seu tipo, um deles atravs do mtodo createImage(int largura, int altura)(mutvel), e o outro, passando o endereo da imagem (imutvel). Depois de criado o objeto, possvel obter uma instncia da classe Graphics. Imagens mutveis utilizam de um objeto Graphics, para desenhar diretivas grficas que formam a imagem. Posteriormente, esta classe ser discutida com maiores detalhes. No momento, basta saber que uma imagem imutvel criada pelo prprio programador atravs de suas diretivas grficas, porm, o meio mais comum a criao de imagens imutveis atravs de um arquivo externo.

O inteiro que define o layout da imagem (terceiro parmetro do construtor) pode ser definido com uma das constantes da classe, os mais comuns so:

LAYOUT_LEFT: alinha o componente esquerda da tela.

LAYOUT_CENTER: alinha o componente no centro da tela.

LAYOUT_RIGHT: alinha o componente direita da tela.A Figura 37 mostra os trs layout em ao.O segundo construtor apresentado, tambm recebe um valor inteiro que especifica o seu modo de aparncia, utilizando a mesma idia que aplicada ao componente StringItem, visto anteriormente. No total, trs constantes podem ser utilizadas;

PLAIN: padro, no altera o formato do ImageItem.

BUTTON: o ImageItem recebe o formato aproximado de um boto, que pode variar de implementao para implementao, como pode ser visto nas Figuras 37 e 39:

KYPERLINK: o ImageItem recebe o formato de um hyperlink, tambm sensitivo a implementaes da Java ME.

Assim como no StringItem, necessrio a criao de um objeto do tipo Command, para ser utilizado nos ImageItems que no so do tipo PLAIN. Alm disso, um listener deve ser adicionado a cada um destes itens, atravs do mtodo setItemCommandListener. Posteriormente, no mtodo commandAction(Command, Item) possvel configurar a ao referente a cada ImageItem. Veja a Listagem 13 para entender como isso funciona e tambm para visualizar o cdigo fonte necessrio para criar o aplicativo das Figuras 37, 38, 39 e 40.

Abaixo, segue os principais mtodos da classe ImageItem.Principais mtodos da classe ImageItem

StringgetAltText() Gets the text string to be used if the image exceeds the device's capacity to display it.

intgetAppearanceMode() Returns the appearance mode of the ImageItem.

ImagegetImage() Gets the image contained within the ImageItem, or null if there is no contained image.

intgetLayout() Gets the layout directives used for placing the image.

voidsetAltText(Stringtext) Sets the alternate text of the ImageItem, or null if no alternate text is provided.

voidsetImage(Imageimg) Sets the Image object contained within the ImageItem.

voidsetLayout(intlayout) Sets the layout directives.

Listagem 13: Classe de exemplo de uso do componente DateField.

Figura 37: Exemplo de ImageItem no emulador da Srie 80 dos telefones celulares da Nokia.Figura 38: Exemplo de interao com ImageItem no emulador da Srie 80 da Nokia.

Figura 39: Exemplo de ImageItem no emulador do LG LX260.Figura 40: Exemplo de interao com o ImageItem no emulador do LG LX260.

10.6 Gauge

A classe javax.microedition.lcdui.Gauge se trata de um componente que pode ser interpretado e utilizado de diferentes maneiras. Pessoalmente, ele me lembra daqueles itens que so usados para configurao de nvel de jogo ou de volume, nos games de aparelhos celulares. Para decidir sobre oque voc acha, veja Figura 41. O Gauge recebe um valor mximo e um valor mnimo, que definem sua apresentao, por exemplo, no exemplo da Figura 40 seu valor corrente est configurado com 10, e seu valor inicial com 0. J na Figura 41, o mesmo componente aparece com valor corrente igual a 5.

Seu construtor recebe quatro parmetros: um rtulo (geralmente fica ao lado esquerdo do componente), um valor booelano que indica se seu contedo pode ser alterado diretamente pelo usurio ou no, e por fim, dois inteiros, que definem seu valor mximo e valor inicial, respectivamente.

Construtores da classe Gauge

Gauge(Stringrotulo, booleaninterativo, intvalorMaximo, intvalorInicial) Cria um novo objeto Gauge com um rtulo, um booleano que indica se o componente interativo ou no, seu valor mximo e seu valor inicial.

Algums questes sobre o componente devem ser discutidas, primeiramente, seu booleano interativo. Se o mesmo estiver como true, o usurio pode alterar o valor corrente do item, alterando em tempo real a aparncia visual. Caso contrrio, o valor pode ser alterado somente codificao. Na ltima maneira, geralmente implementada uma thread que implementar de forma automtica o valor. Este uso comum em telas de espera para conexo com a rede GPRS. Para compreender este conceiito de forma completa, veja as Listagens 14 e 15. O primeiro utiliza o Gauge interativo, ou seja, no seu construtor foi passado true no segundo parmetro. A ltima listagem apresenta o Gauge com uso de Thread. Perceba que a interface Runnable implementada, e seu preenchimento ocorre quando o Command cmInicia for selecionado. No mtodo run implementa-se um lao while, que executa at que o valor mximo do componente no for igual ao seu valor mximo. O uso dos mtodos getValue() e setValue(int valor) usado intensamente. A Listagem 14 produz um resultado mostrado na aplicao das Figuras 40 e 41.Abaixo segue a tabela com os principais mtodos da classe Gauge.Principais mtodos da classe Gauge

voidaddCommand(Commandcmd) Adiciona um Command para o item (somente a partir da verso 2.0 do perfil MIDP).

intgetMaxValue() Retorna o valor mximo que o objeto Gauge pode assumer.

intgetValue() Retorna o valor corrente do objeto Gauge.

booleanisInteractive() Retorna um valor Boolean indicando se o item permite que o usurio modifique seu contedo.

voidsetDefaultCommand(Commandcmd) Configura o Command padro para o Item.

voidsetItemCommandListener(ItemCommandListenerl) Configura um listener para os Commands do Item, substituindo qualquer outro ItemCommandListener.

voidsetLabel(Stringrotulo) Configura o rtulo do Item.

voidsetLayout(intlayout) Configura a diretiva de layout do componente.

voidsetMaxValue(intvalorMaximo) Configura o valor mximo do objeto Gauge.

voidsetPreferredSize(intlargura, intaltura) Configura a largura e altura preferida para este Item.

voidsetValue(intvalor) Configura o valor corrente do objeto Gauge.

Listagem 14: Exemplo de uso do Gauge interativo.

Listagem 15: Exemplo de uso do Gauge com Thread.

Figura 40: Exemplo de Gauge no emulador da Sun. StringItem selecionado.Figura 41: Exemplo de Gauge no emulador do aparelho Sanyo MM-5600.

10.7 Spacer

A classe javax.microedition.lcdui.Spacer insere um espao entre Itens dentro de um Form. Seu construtor recebe apenas dois parmetros, a sua largura e altura mnima. A Figura 42 mostra um exemplo de utilizao do componente entre dois StringItems, a figura ao lado, apresenta a mesma classe, porm, sem o Spacer entre os dois itens.O Spacer est presente a partir da MIDP 2.0, no permite a insero de Commands e no aceita a utilizao de nmeros negativos para configurao de seu tamanho mnimo. A Listagem 16 apresenta o cdigo da classe exemplo utilizado nas Figuras 42 e 43.Construtor da classe Spacer

Spacer(intlarguraMinima, intalturaMinima) Cria um novo objeto Spacer com seu tamanho mnimo.

Principais mtodos da classe Spacer

voidsetMinimumSize(intlarguraMinima, intalturaMinima) Sets the minimum size for this spacer.

Figura 42: Exemplo de utilizao do Gauge no emulador do LG 325.Figura 43: Classe de exemplo de Gauge, com a linha que adiciona o componente ao Form comentada.

Listagem 16: Exemplo de uso da classe Spacer.

10.8 CustomItemA classe javax.microedition.lcdui.CustomItem permite que o programador crie seus prprios componentes. Subclasses gerados a partir desta classe tem controle sobre todos os elementos de interface do item, assim como sua interao com os usurios. Cada subclasse de CustomItem possui uma largura e altura mnima configurvel para a rea total e rea de contedo do componente. Sua rea de responsabilidade do programador implementar, sua borda e seu rtulo fica a cargo da implementao da MIDP presente no dispositivo mvel. Se a informao de tamanho mnimo passado e maior que o tamanho mximo permitido pela tela, a classe tem o domnio de atribuir um valor menor para este atributo. Ela est presente somente a partir da verso 2.0 do perfil MIDP.10.8.1 Modos de Interao

A classe possui vrios modos de interao, fica a cargo da implementao da MIDP decidir quais deles sero configurados dentre de um dispositivo. Cada subclasse de CustomItem pode utilizar de Item Commands, eventos de teclado e eventos de toque na tela (no caso de telas touch-screen).

A implementao no obrigada a implementar eventos de teclado nem de toques na tela. Alm disso, um dispositivo pode suportar evento KEY_PRESSED e KEY_RELEASED, porm, no oferecer suporte a eventos KEY_REPEATED. A mesma analogia serve para os eventos de POINTER_PRESSED, POINTER_RELEASE e POINTER_DRAG. Os modos de interao so aplicveis tambm classe Canvas, que discutida posteriormente neste texto.

10.8.2 Traversal

A classe CustomItem permite que a implementao da MIDP fornea uma maneira do programador definir o comportamento nos eventos de entrada e sada do componente. Com isso, possvel, por exemplo, implementar uma animao a cada vez que o usurio visita o item. possvel a implementao de TRAVERSE_HORIZONTAL e TRAVERSE_VERTICAL, porm, nenhum dos dois obrigatrio.10.8.3 Aplicao Exemplo

Para que o aprendizado da classe CustomItem seja completo, vamos desenvolver uma nova API, o nome dela ser MReport. Esta API se prope a construtir relatrios na plataforma Java ME, de forma simples e totalmente customizvel, podendo ser baseada na ferramenta iReport, altamente usada na plataforma Java SE. A pgina oficial do projeto est aqui: http://www.jasperforge.org/sf/projects/ireport. Outro ponto importante, no nossa idia implementar todas as funcionalidades que a ferramenta possui, porque os ambientes Desktop e Mobile apresentam vrias e severas diferenas na capacidade de armazenamento e processamento de dados.

Listagem 17: Midlet que faz uso da classe CustomItem

A Listagem 17 apresenta o cdigo da classe MIDlet que faz uso do CustomItem. Perceba que ele tratado como qualquer outro Item da MIDP. Um objeto da classe Relatorio (classe que extende de CustomItem) criado, instanciado e depois anexado a instncia da classe Form, atravs do mtodo append(), at o presente momento o leitor no deve ter se surpreendido nem um pouco. Espere um pouco mais.

O grande diferencial entre os outros Itens e a CustomItem est na implementao do mtodo paint(). No CustomItem esta tarefa fica a cargo do programador, por isso um item customizvel. Os outros itens da MIDP j vem com este mtodo implementado e impossvel altera-los.

A Listagem 18 mostra o cdigo da classe Relatrio. Quando uma classe extende diretamente de CustomItem, ela deve impementar, de forma obrigatria, os seguintes mtodos: getMinContentWidth(), getMinContentHeight(), getPrefContentWidth(int largura), getPrefContentHeight(int altura) , paint(Graphics arg0, int arg1, int arg2). Os mtodos getMinContentWidth() (linha 15) e getMinContentHeight() (linha 18) definem a largura e altura mnima do novo componente. Os mtodos getPrefContentWidth(int largura) e getPrefContentHeight(int altura), que esto nas linhas 21 e 24 respectivamente, definem a largura e altura preferencial do componente. Por fim, o mtodo paint define o contedo visual do componente personalizado.

Os mtodos pointerPressed (linha 32), pointerDragged (linha 37) e pointerReleased (linha 39) servem para dar possibilidade de interao com a caneta do dispositivo. Por fim, os mtodo traverse (linha 42) e traverseOut (linha 48) possibilitam programar o comportamento quando o usurio entrar e sair do componente.

Listagem 18: Classe que herda diretamente de CustomItem.

Listagem 19: Mtodo paint da classe que herda diretamente de CustomItem

A Listagem 19 apresenta o mtodo paint() j codificado em um dos relatrios da MReport. Nesse momento o cdigo no ser explicado, isso porque, as classes Graphics e Canvas tero um tpico s pra elas. O importante a ser compreendido na Listagem 19 um quesito: o responsvel pelo desenho de toda a interface a classe que estende de CustomItem e implementa o mtodo paint, utilizando de diretivas grficas (linhas, retngulos, linhas etc) para formar a interface grfica do componente. A Figura 44 apresenta a API em execuo e o resultado das ltimas Listagens.Construtor da classe CustomItem

protected CustomItem(Stringrotulo) Construtor da superclasse, fornecendo uma maneira de suas subclasses especificarem seus rtulos.

Principais mtodos da classe CustomItem

intgetGameAction(intcodigoTecla) Retorna o game action associado com o cdigo de tecla do dispositivo.

protected intgetInteractionModes() Retorna os modos de interatividade disponveis.

protected abstract intgetMinContentHeight() Implementado pela subclasse para retornar a altura mnima da rea de contedo do componente, em pixeis.

protected abstract intgetMinContentWidth() Implementado pela subclasse para retornar a largura mnima da rea de contedo do componente, em pixeis.

protected abstract intgetPrefContentHeight(intwidth) Implementado pela subclasse para retornar a altura preferida da rea de contedo do componente, em pixeis.

protected abstract intgetPrefContentWidth(intheight) Implementado pela subclasse para retornar a largura preferida da rea de contedo do componente, em pixeis.

protected voidhideNotify() Chamado pelo sistema para notificar o item que ele est invisvel no momento, quando estava previamente visvel.

protected voidinvalidate() Sinaliza que o tamanho do ustomItem's e a localizao de traversal necessitam ser atualizadas.

protected voidkeyPressed(intcodigoTecla) Chamado pelo sistema quando uma tecla pressionada.

protected voidkeyReleased(intcodigoTecla) Chamado pelo sistema quando uma tecla liberada.

protected voidkeyRepeated(intcodigoTecla) Chamado pelo sistema quando uma tecla repetida.

protected abstract voidpaint(Graphicsg, intlargura, intaltura) Implementado pela subclasse para renderizar o item dentro de seu container.

protected voidpointerDragged(intx, inty) Chamado pelo sistema, quando uma ao de arrasto de ponteiro (canetas presentes em dispositivos touch-screen, como PDAs) ocorre dentro do item.

protected voidpointerPressed(intx, inty) Chamado pelo sistema quando um evento de pressionamento de pontiro ocorre dentro do item.

protected voidpointerReleased(intx, inty) Chamado pelo sistema quando o usurio tira o ponteiro do contato com o dispositivo, dentro do item.

protected voidrepaint() Requisita que o item seja repintado.

protected voidrepaint(intx, inty, intlargura, intaltura) Solicita que o item seja repintado a partir de um ponto x, y e com uma largura e altura determinados.

protected voidshowNotify() Chamado pelo sistema para notificar o item que ele est visvel.

protected voidsizeChanged(intlargura, intaltura) Implementado pela subclasse para tartar dos eventos de redimensionamento.

protected booleantraverse(intdir, intviewportWidth, intviewportHeight, int[]visRect_inout) Chamado pelo sistema quando o sistema acessa o item, ou quando eventos de teclado so acionados dentro do item.

protected voidtraverseOut() Chamado pelo sistema quando o sistema sai do item.

Figura 44: Exemplo de Canvas sem fullscreen.11. Interface grfica de baixo nvel - Canvas

Como vimos anteriormente, o Java ME nos fornece alguns componentes prontos para uso, tornando a curva de aprendizado e desenvolvimento mais rpida. Porm, esses mesmos componentes no apresentam um comportamento de interface uniforme nas diversas plataformas mbile existentes no mercado, tambm, alguns opes de configuraes so impossveis, como uma cor de fundo em um componente Form e seus itens.

Sendo assim, importante conhecer a forma de construo de interface em baixo nvel, com as classes Canvas e Graphics, ambas do pacote javax.microedition.lcdui. importante ressaltas que uma tela construda com Canvas no pode conter qualquer outro elemento visto anteriormente, ou seja, o desenvolvedor tem que optar por ela ou por uma das instncia da classe Screen.

11.1 Canvas

A classe Canvas permite que programadores construam suas interfaces grficas em baixo nvel, ou seja, todo o controle de eventos, e desenho na tela, so sua responsabilidade. O ponto chave o mtodo paint(), na Canvas este mtodo abstrato, sendo responsabilidade do desenvolveor implementar o mtodo, fornecendo chamadas para diretivas grficas, desenhando linhas, arcos, crculos, configurando cores e traados, at atingir a interface grfica desejada.

Nos componentes vistos anteriormente, como o DateField e o TextFeld por exemplo, o mesmo mtodo paint() j est implemetado, por isso seu uso torna-se mais fcil, porm sua interface mais fechada e no possvel alteraes. Lembrando sempre, que para uma aplicao, possvl conciliar tanto telas criadas com filhos da classe Screen, como Canvas, podendo alternar entre elas. Um bom exemplo a configurao de um jogo, dados como volume, nome do jogador e nvel de dificuldade podem ser construdos com a classe Form e seus itens. J a tela do jogo em si, seria desenhada com Canvas.

Alm de precisar construir a interface da tela, o programador precisa tratar diretamente com os eventos de teclado. Na MIDP, existem oito mtodos que tem essa finalidade: showNotify()

hideNotify()

keyPressed()

keyRepeated()

keyReleased()

pointerPressed()

pointerDragged()

pointerReleased()

O primeiro mtodo chamado antes do Canvas se tornar visvel para o usurio da aplicao. J o hideNotify chamado aps o Canvas ser removido da tela, substitudo por outro Canvas, um Screen, ou ainda, alguma tela do prprio sistema operacional do dispositivo. Os ltimos seis mtodos da lista s podem ser chamados no intervalo dos dois primeiros mtodos, ou seja, enquanto a instncia de Canvas estiver visvel para o usurio da aplicao.

Os mtodos keyPressed, keyRepeated e keyReleased so referents a evento do teclado do aparelho, que geralmente obedece ao padro ITU-U, presente na grande maioria dos telefones celulares. Os mtodos pointerPressed, poiterDragged e pointerReleased tratam de eventos de ponteiros, como as canetinhas que so usados em equipamentos como o PDA.

Os eventos de ponteiros no so implementados de forma obrigatrio, isso porque, nem todos dispositivos mveis tem tela sensvel ao toque. Nos eventos de teclado, apenas o keyRepeated pode no estar implementado. Para verificar sua presena ou no, pode-se usar o mtodo hasRepeatedEvents() que retorna um valor booleano, true para suporte e false para a ausncia dele.

O tratamento de eventos ser visto completamente posteriormente.

11.2 Modos de Operao

Uma tela construda com Canvas, pode estar opervel em dois modos, full screen mode ou modo padro. Para configurar a instncia como full screen, utiliza-se o mtodo setFullScreenMode(boolean modo). Lembrando que este mtodo est presente somente a partir da verso 2.0 da MIDP.

A Figura 45 apresenta uma tela Canvas sem o uso de full screen. Perceba que a visualizao do Ticker adicionado ao Canvas, bem como seus Commands, possvel. Na Figura 46 o Canvas seta com o full screen habilitado, perceba que tanto o Ticker, quando os Commands no se tornam mais visveis. Apesar disso, a implementao deixa os comandos ativos, por exemplo, se voc chamar a key que abriria o menu da esquerda ou da direita, ele ir abrir da mesma forma, tornando-se visvel a partir deste momento.

Figura 45: Exemplo de Canvas sem fullscreen.Figura 46: Exemplo de Canvas com fullscreen.

Um fato curioso sobre os modos de operao acontece no aparelho W380 da Sony Ericsson. O comportamento padro definido pela documentao oficial da Canvas, diz que, quando um Canvas opera no modo full screen, os Tickers associados a esta tela tornam-se invisveis, porm, veja na Figura 47 o comportamento no referido telefone celular. Perceba que o Ticker continua visvel na parte superior do aplicativo. A imagem tambm til para perceber a falta de padronizao entre o resultado obtido no emulador da Sun Microsystems (Figura 45) e no ambiente real de execuo.

Figura 47: Exemplo de Canvas com fullscreen executando em um aparelho Sony Ericsson W380.

11.3 Graphics

Como dito anteriormente, a responsabilidade de construo das interfaces construdas em baixo nvel do programador. Isso feito com a classe Canvas e a javax.microedition.lcdui.Graphics. Esta ltima permite a renderizao de simples formas geomtricas 2D. Atravs de mtodos que permitem a construo de desenhos primitivos, como linhas, retngulos, arcos, textos e imagens.

O modelo de cores utilizado o de 24 bits, onde so separados 8 bits para cada componente da cor: 8 bits para vermelho, 8 bits para verde e 8 bits para azul. Hoje em dia, a grande maioria dos aparelhos que suportam a MIDP, seno a totalidade, tem suporte a este esquema de cores. Porm, no comeo da programao Java ME ainda existiam as telas monocromticas, sendo assim, a MIDP consegue trabalhar com este esquema de cores mesmo em aparelhos que no a suportem, transpondo as cores para uma escala de cinza. A classe Display fornece o mtodo isColor(), que retorna um valor booleano true se o dispositivo suporta cores e false se no h. Na questo das cores, existe ainda um fato importante, dependendo de questes de implementao e suporte grfico do dispositivo, a cor que voc especifica pode sofrer algumas distores no display do aparelho, para isso, existe o mtodo getDisplayColor(int color) que recebe uma cor e retorna a cor que ser impressa no display do aparelho pela implementao da MIDP.

O esquema usada pelo Graphics para desenho das diretivas grficas o Source Over Destination, onde os pixeis de origem sobrepe os pixeis de destino. Para o desenho de linhas, arcos, textos e retngulos a regra utilizar apenas pixeis opacos, porm, para desenho de imagens, possvel o uso de transparncia e semi-transparncia. Neste contexto, se o pixel transparente, o pixel de destino no sofre modificao, se o pixel fonte semi-transparente a MIDP utiliza processo Alpha blending. Porm, a implementao da MIDP pode suportar somente pixeis opacos tambm nas imagens, sendo assim, os pixeis transparentes e semi-transparentes da imagem so removidos no momento de sua construo.

O sistema de coordendas basea-se no canto superior esquerdo, que representa o ponto (0, 0). O eixo X cresce para a direita e o eixo Y para baixo. Veja a Figura 48.

SHAPE \* MERGEFORMAT

Figura 48: Sistema de coordenadas da Graphics.

A seguir, duas tabelas so apresentadas, mostrandos as constantes da classe e alguns dos seus mtodos:

Constantes da classe Graphics

StaticintBASELINE Constante que posiciona o ponto de ncora na base do texto.

staticintBOTTOM Constante para posicionar o ponto de ncora de textos e imagens abaixo dos mesmos.

staticintDOTTED Constante para o estilo da linha DOTTED.

staticintHCENTER Constante para centrar textos e imagens horizontalmente em torno do ponto de ncora.

staticintLEFT Constante para posicionar o ponto de ncora na esquerda de textos e imagens.

staticintRIGHT Constante para posicionar o ponto de ncora na direita de textos e imagens.

staticintSOLID Constante para o estilo de linha SOLID.

staticintTOP Constante para posicionar o ponto de ncora acima de textos e imagens.

staticintVCENTER Constante para centrar imagens verticalmente em torno do ponto de ncora.

Mtodos da classe Graphics

VoidclipRect(intx, inty, intlargura, intaltura) Intersecta o clip corrente com o retngulo especificado.

VoidcopyArea(intx_src, inty_src, intlargura, intaltura, intx_dest, inty_dest, intancora) Copia o contedo de uma rea retangular (x_src, y_src, largura, altura) para uma area de destino, identificado pela posio (x_dest, y_dest) e ponto de ncora (int ancora).

VoiddrawArc(intx, inty, intlargura, intaltura, intinicioAngulo, intarcoAngulo) Desenha um arco vazio circular ou elptico, usando a cor e estilo de linha corrente.

VoiddrawChar(charcaracter, intx, inty, intancora) Desenha um character usando a fonte e cor atual.

VoiddrawChars(char[]data, intcomeco, inttamanho, intx, inty, intancora) Desenha os caracteres de um vetor usando a fonte e cor corrente.

VoiddrawImage(Imageimg, intx, inty, intancora) Desenha uma imagem usando um ponto de ncora.

VoiddrawLine(intx1, inty1, intx2, inty2) Desenha uma linha entre duas coordenadas (x1,y1) e (x2,y2) usando a cor e estilo de linha atual.

VoiddrawRect(intx, inty, intlargura, intaltura) Desenha um retngulo vazio usando a cor e estilo de linha corrente.

VoiddrawRegion(Imagefonte, intx_src, inty_src, intlargura, intaltura, inttransformacao, intx_dest, inty_dest, intancora) Copia a regio de uma imagem para um local dentro do destino, possibilidade de transformao na imagem fonte usando a funo de transformao adeq