tutorial j2me

53
1 Tutorial J2ME Copyright® - 2005 Apostila de J2ME versão 1.1 Juliano Carniel - [email protected] Clóvis Teixeira - [email protected]

Upload: josetonny

Post on 29-Jun-2015

297 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Tutorial J2ME

1

Tutorial J2ME Copyrightreg - 2005

Apostila de J2ME versatildeo 11

Juliano Carniel - julianoportaljavacom

Cloacutevis Teixeira - clvportaljavacom

2

Tutorial J2ME Copyrightreg - 2005

Iacutendice - INTRODUCcedilAtildeO 4

- ENTENDENDO J2ME5

- CONFIGURATION5

- PROFILES5

- SEGURANCcedilA 7

- TECNOLOGIAS WIRELESS8

- DIFERENCcedilA ENTRE MIDP 10 E 209

- APIS 9

- CRIANDO PROJETOS COMPILANDO E EXECUTANDO 9

- CICLO DE VIDA DE UMA MIDLET 13

- INTERFACE 13

- COMMANDS 14

- TEXTBOX 16

- TICKERS16

- FORMS 16

- ITEM17

- LISTS 19

- IMAGENS 20

- ALERTS20

- CONEXOtildeES 21

- SMS VIA SERVIDOR22

- ARMAZENAMENTO EM CELULARES (RECORDSTORES) 23

- CANVAS25

- CODIFICANDO 29

COacuteDIGOS EXEMPLOS31

3

Tutorial J2ME Copyrightreg - 2005

EXEMPLOCOMMANDSANDTICKER31 EXEMPLOLISTANDALERT 33 EXEMPLOTEXTBOX36 EXEMPLOFORM1 38 EXEMPLOGAUGE40 EXEMPLOCONNECTIONIMAGE43 EXEMPLOHTTPCONNECTION46 EXEMPLOCANVAS49

REFEREcircNCIAS BIBLIOGRAacuteFICAS 51

COPYRIGHT 52

4

Tutorial J2ME Copyrightreg - 2005

Apostila de J2ME

- Introduccedilatildeo

Comecemos com uma pergunta baacutesica poreacutem natildeo menos importante O que vem a ser esse J2ME E para que serve

Java 2 Micro Edition eacute uma API Java voltada para micro aplicativos que rodam em micro processadores assim como os dos celulares e PDA s

Neste Tutorial vamos tratar da Tecnologia J2ME MIDP 10 voltada para aplicaccedilotildees graacuteficas poreacutem natildeo vamos tratar de jogos aqui embora apoacutes a leitura deste vocecirc pode ter um embasamento para comeccedilar a desenvolver algo na aacuterea As aplicaccedilotildees criadas usando-se MIDP satildeo chamadas MIDlets (assim como Servlets e Applets)

Usamos os programas - Wireless Tollkit que eacute um software gratuito feito pela Sun para simplificar o ciclo

de desenvolvimento do J2ME o qual pode ser encontrado em httpwirelessjavasuncomallsoftware

(eacute necessaacuterio que vocecirc jaacute tenha o j2sdk instalado httpjavasuncomj2se) vocecirc ainda pode baixar outros emuladores encontrados na mesma pagina do Wireless Toolkit para posteriores testes

- E o editor GEL que eacute free e eacute um oacutetimo editor facilitando muito na ediccedilatildeo com auto-complete de meacutetodos e muitas outras facilidades que este programa provecirc e pode ser encontrado em wwwgexpertscom

Caso vocecirc jaacute tenha algum outro programa como o Eclipse (wwweclipseorg) por exemplo pode-se usa-lo tambeacutem fazendo as devidas modificaccedilotildees existe um plugin chamado EclipseME (httpeclipsemesourceforgenet) que pode ser utilizado para auxiliar nesse desenvolvimento

A abordagem desta apostila foca-se no MIDP10 e CLDC10 por ainda ser maioria no mercado e tambeacutem para que possamos contemplar bem os recursos para se desenvolver uma aplicaccedilatildeo J2ME Se fossemos discutir a fundo os novos recursos do MIDP20 e CLDC11 teriacuteamos que dar uma abrangecircncia muito maior do que a que jaacute damos nesta apostila e esse natildeo eacute o nosso objetivo para esta versatildeo do material

5

Tutorial J2ME Copyrightreg - 2005

- Entendendo J2ME

J2ME basicamente eacute dividido em configurations profiles e APIs opcionais

- Configuration

A configuration mais baacutesica do J2ME eacute o CLDC (Connected Limited Device Configuration) e tambeacutem a mais importante pois ela da base para a outra configuration CDC (Connected Limited Configuration) a qual prove algumas funcionalidades a mais e requer um pouco mais de hardware

Mas o que vem a ser essa tal de configuration Bom ela basicamente provecirc algumas bibliotecas baacutesicas e a VM (virtual machine) ou seja a parte mais basica que necessita estar presente em todo e qualquer dispositivo que suporta essa tecnologia

- Profiles

Um profile nada mais eacute que uma seacuterie de API s padrotildees que combinadas com alguma configuration no nosso caso o CLDC prove um serviccedilo completo para que aplicaccedilotildees possam ser rodadas

E a profile que noacutes iremos trabalhar eacute a MIDP

Celulares em sua quase totalidade hoje no mercado trabalha com o MIDP10 e CLDC10

Para entendermos melhor pensemos da seguinte maneira Profiles satildeo mais especiacuteficos que configurations e fazendo analogia a um velho exemplo temos uma

6

Tutorial J2ME Copyrightreg - 2005

abstraccedilatildeo sobre o que eacute um carro e como ele eacute fabricado (configuration) e como um Ford eacute fabricado (profile) mais tecnicamente falando profile eacute baseado em configuration e ainda acima dos profiles estatildeo as APIs que na nossa analogia seria um modelo especiacutefico da Ford

Como jaacute foi citado existem dois configurations um configuration eacute o CLDC (Connected Limited Device Configuration) que rege as configuraccedilotildees para aparelhos bem pequenos como celulares ou PDAs o qual fica acima das diretrizes J2ME juntamente com CDC (Connected Device Configuration) o que rege as configuraccedilotildees para aparelhos um pouco maiores mas mesmo assim pequenos

Podem haver vaacuterios Profiles vamos citar dois aqui os quais satildeo os mais importantes para este estudo MIDP (Mobile Information Device Profile) e tambeacutem o PDAP (Personal Digital Assistant Profile) e ambos estatildeo acima do CLDC

CLDC como jaacute vimos rege as configuraccedilotildees para aparelhos extremamente pequenos ele foi desenvolvido para dispositivos de no miacutenimo 160KB e algumas dezenas de MHz de processamento Vocecirc natildeo leu errado e nem noacutes trocamos unidades de medidas a memoacuteria estaacute realmente certa o que nos faz pensar muito em termos de aplicaccedilotildees que podem rodar neles e nos traz de volta a certas programaccedilotildees para DOS no que diz respeito agrave memoacuteria E falando em memoacuteria relevemos tambeacutem o processamento que eacute muito fraco mas muito mesmo pois no miacutenimo 16MHz satildeo requeridos e se tratando de aparelhos tops de linha podem chegar ateacute 300MHz ou um pouco mais (ateacute a composiccedilatildeo desta mateacuteria) poreacutem eacute muito difiacutecil dizer ao certo pois o acesso a informaccedilotildees desse tipo nas especificaccedilotildees dos fabricantes eacute bem restrito embora jaacute nos faz analisar melhor coacutedigos e meacutetodos usados os quais despedem de muito processamento e uso de memoacuteria E tambeacutem a conexatildeo lenta tipicamente de

7

Tutorial J2ME Copyrightreg - 2005

9600bps para aparelhos TDMACDMA e de 128Kbps para GPRSCDMA 1xRTT MIDP tem as seguintes caracteriacutesticas - Miacutenimo de 160kB de memoacuteria natildeo-volaacutetil para JAVA - Um processador de 16 bits ou 32 bits com um clock de no miacutenimo 16MHz - 32KB de memoacuteria volaacutetil para tempo de execuccedilatildeo - Pelo menos 192KB livres para Java - 8KB de memoacuteria natildeo-volaacutetil de para armazenamento de dados - Uma tela de pelo menos 96x54 pixels (aqui jaacute cai por terra a propaganda de

muitos celulares os quais dizem ter uma tela ampla de 96x54 o que eacute o miacutenimo necessaacuterio)

- Capacidade de entrada de dados seja por teclado (do celular) teclado externo ou mesmo Touch-screen

- Possibilidade de enviar e receber dados em conexatildeo possivelmente intermitente e banda reduzida

- Seguranccedila

Uma pergunta frequumlentemente feita eacute Agora com programas rodando nos celulares natildeo iremos ter problemas de viacuterus ou programas maliciosos Por meio do J2ME muito difiacutecil poreacutem ja temos visto celulares sendo atacados por viacuterus que exploram falhas do Sistema operacional e natildeo de uma aplicaccedilatildeo J2ME

No caso dos jogos de celulares cada fabricante disponibiliza uma API especiacutefica para os jogos podendo assim aproveitar melhor o desempenho do aparelho poreacutem cai por terra a forte caracteriacutestica de vida do JAVA a (WORA) Write Once Run Anywhere apesar de ser mais seguro perde-se um pouco a funcionalidade

A maquina virtual tem um espaccedilo independente de memoacuteria (sand-box) e natildeo pode acessar a memoacuteria correspondente agraves aplicaccedilotildees nativas do celular assim como eacute feito com os Applets um pouco diferente do J2SE

8

Tutorial J2ME Copyrightreg - 2005

Nota dos Autores Pouco tempo antes da revisatildeo dessa segunda versatildeo da apostila surgiu o primeiro viacuterus para celulares para uma seacuterie especiacutefica da Nokia aquela que usa SymbianOS O viacuterus embora seja chamado de viacuterus se encaixa mais na qualidade de WORM pois se propaga sozinho atraveacutes da interface de Bluetooth do celular poreacutem este worm natildeo faz nada no celular natildeo danifica nada apenas tenta se propagar para outros celulares Um malefiacutecio provocado eacute gastar bateria do celular pois fica com a interface de Bluetooth ligada e procurando algueacutem que responda para se retransmitir

- Tecnologias Wireless

Muitas pessoas ainda tecircm duacutevidas sobre as diferentes tecnologias de celulares existentes Vamos tentar defini-las e diferencia-las em poucas palavras sendo que este natildeo eacute o enfoque principal deste Tutorial

- TDMA (time division multiple access ou acesso muacuteltiplo por divisatildeo do tempo) ou seja ele natildeo diferencia voz e dados entatildeo para navegar na internet(dados) vocecirc paga o mesmo preccedilo que pagaria por fazer uma ligaccedilatildeo de voz Quem tem algum celular tdma sabe o quatildeo caro e lento eacute isso Somente para estabelecer a conexatildeo leva-se uns 8 segundos e a transferecircncia de dados daacute-se a 9600bps(conseguindo-se taxa maacutexima)

- CDMA (code division multiple access ou acesso muacuteltiplo por divisatildeo de coacutedigos) ou seja eacute separado voz de dados e tanto esta tecnologia quando a GSM satildeo conexatildeo 100 ativa ou seja natildeo existe este delay de conexatildeo vocecirc requisita uma informaccedilatildeo e ela vem diretamente Aleacutem de a taxa de transferecircncia que eacute maior chegando a 256Kbps usando CDMA 1xRTT que eacute o que esta em vigor

- GSM (global system for communication ou sistema global de comunicaccedilatildeo) ou seja tem as mesmas caracteriacutesticas da tecnologia CDMA poreacutem opera usando GPRS

Como foi falado acima as conexotildees eram para ser 100 ativas ou seja on-line todo tempo poreacutem pelo provado pelo uso hoje dessas tecnologias vemos que ele precisa de uma primeira conexatildeo o que tambeacutem despende alguns segundos para somente depois poder transmitir

Caso haja maior interesse nas tecnologias de transmissatildeo e na evoluccedilatildeo e tudo mais que diz respeito recomendo estes sites httpwwwsitcombrSeparataTELCO50htm

e httpidgnowterracombridgnowtelecom2002090043 ainda em wwwgsmworldnet

9

Tutorial J2ME Copyrightreg - 2005

- Diferenccedila entre MIDP 10 e 20

Existem algumas diferenccedilas entre as versotildees como todos sabemos a cada versatildeo mais nova eacute sempre incrementado mais funccedilotildees Aleacutem desses meacutetodos a mais e algumas facilidades maiores da 20 como classes para jogos e tratamento de sons temos a diferenccedila na comunicaccedilatildeo de dados que eacute o mais interessante aqui como por exemplo as conexotildees no CLDC10 satildeo feitas atraveacutes do protocolo http que no caso eacute inseguro no envio de informaccedilotildees jaacute na 10 estaacute implementado o https (ssl) conexatildeo com criptografia que jaacute eacute conhecida de todos

Aqui listamos os Packages disponiacuteveis para as versotildees

javalang

javalangref (somente CLDC11)

javaio

javautil

javaxmicroeditionio

javaxmicroeditionlcdui

javaxmicroeditionlcduigame (somente na 20)

javaxmicroeditionmedia (somente na 20)

javaxmicroeditionmediacontrol (somente na 20)

javaxmicroeditionmidlet

javaxmicroeditionrms

javaxmicroeditionpki (somente na 20)

Opcionalmente fabricantes podem fornecer APIs JAVA para acesso a partes especificas de cada aparelho

Com relaccedilatildeo agrave seguranccedila o CLDC11 traz bastante recursos e jaacute se aproxima mais do J2SE com Permissions Types Protection Domains baseados em IPs e PKIs

- APIs

A CLDC 10 natildeo possui suporte a ponto flutuante ou seja se desejas trabalhar com contas e valores reais teraacutes que manuseaacute-los em coacutedigo mesmo A versatildeo 11 do CLDC jaacute possui suporte a ponto flutuante poreacutem mesmo com a versatildeo 10 vocecirc pode baixar programas especiacuteficos pra isso como esse programa encontrado em httphomerochesterrrcomohommesMathFP

Vocecirc tem ainda outras restriccedilotildees como

Sem user classLoading

Sem finalizaccedilatildeo de objetos (finallize() de javalangObject)

Garbage collector existe poreacutem natildeo executa meacutetodo automaacutetico

Sem RMI e sem JINI

Sem meacutetodos nativos a natildeo ser os fornecidos pela JVM nativa

MultiThreading (sem interrupt() pause() resume() e stop())

Sem thread groups e thread Deamons

- Criando projetos Compilando e Executando

10

Tutorial J2ME Copyrightreg - 2005

Bom depois de muita teoria a qual nos deu um embasamento melhor para sabermos o que estamos fazendo vamos a uma parte mais praacutetica e a mais esperada por todos

O processo de desenvolvimento de MIDlets eacute um pouco mais complexo do que de outros programas feitos em JAVA pois eacute feito segundo estes passos

Editar coacutedigo fonte

Compilar

Preacute-Verificar

Empacotar

Testar eou Instalar

Depois de tudo instalado corretamente devemos primeiramente abrir o Wireless ToolKit e criar um Projeto para isso clique em New Project

Depois em Project Name defina o nome do seu projeto e logo abaixo o nome da classe de sua midlet que deve ser igual ao nome do projeto

11

Tutorial J2ME Copyrightreg - 2005

Feito isso ele teraacute criado vaacuterios diretoacuterios dentro de path_WTKappsSua_Aplicacao para cada aplicaccedilatildeo eacute criado uma aacutervore de diretoacuterios conforme ilustrado abaixo

Em seguida abriraacute uma tela que conteacutem informaccedilotildees sobre a sua aplicaccedilatildeo (aconselho a natildeo mudar o que estaacute laacute) pois eacute por esse arquivo que o celular reconheceraacute seu aplicativo antes de ser baixado se ele eacute apto a rodar ou natildeo seu programa a uacutenica

coisa que poderias mudar seria o Vendor Name o qual vocecirc pode colocar o nome de sua empresa ou o que desejares Se vocecircs verificarem a uacuteltima aba desta tela (aba MIDlets)

tem um link para uma figura png que eacute o icone que apareceraacute no celular de sua aplicaccedilatildeo vocecirc pode modificaacute-lo colocando o nome de uma figura personalizada apenas

lembre-se que a figura deve ficar no devido diretoacuterio (path_WTKappsSua_Aplicacaores) e sempre para qualquer aplicaccedilatildeo deve-se por dentro do diretoacuterio res

12

Tutorial J2ME Copyrightreg - 2005

Existem dois bototildees que seratildeo muito utilizados por nos BUILD e RUN os quais satildeo auto-explicativos

Apoacutes a criaccedilatildeo do projeto estamos aptos e finalmente a criar nossos coacutedigos

Obfuscator Como vimos dispositivos celulares possuem memoacuteria muito reduzida e quanto

menor sua aplicaccedilatildeo for melhor seraacute para o celular Para isso usamos o Obfuscator que eacute usado para diminuir o tamanho dos arquivos eliminando redundacircncia e tambeacutem para evitar engenharia reversa

Este programa renomeia classes variaacuteveis e meacutetodos para nomes mais compactos removem classes meacutetodos natildeo usados e ainda inserem dados ilegais ou questionaacuteveis para confundir Descompiladores

Para criar um pacote obfuscado vocecirc precisa de algum programa Obfuscator um bom programa o Retroguard pode ser encontrado em wwwretrologiccom depois de baixado vocecirc deve copiar o arquivo retroguardjar dentro do diretoacuterio bin do wirelessToolkit (Ex cWTK104bin)

Tome um pouco de cuidado com os obfuscators pois em alguns celulares a sua aplicaccedilatildeo pode acabar natildeo funcionando

13

Tutorial J2ME Copyrightreg - 2005

- Ciclo de Vida de uma MIDlet

O Aplication Manager (AM) de cada dispositivo eacute quem vai controlar os aplicativos a serem instalados onde e como seratildeo armazenados e como seratildeo executados As classes de cada aplicativo estatildeo em um arquivo JAR o qual vem acompanhado de um descritor JAD que teraacute todas as informaccedilotildees as quais jaacute vimos anteriormente

Assim que a MIDlet eacute invocada o AM invoca o meacutetodo startApp() o qual coloca a midlet no estado Active Enquanto ela estiver executando o AM pode pausar ela invocando o meacutetodo pauseApp() no caso de uma chamada sendo recebida ou SMS chegando A aplicaccedilatildeo pode pausar a si mesma bastando invocar notifyPaused() Assim como a AM pode pausar a aplicaccedilatildeo e esta a si mesma ocorre o mesmo com o DestroyApp() que eacute invocado pela AM para fechar a aplicaccedilatildeo ou ateacute mesmo pode ser fechada atraveacutes da proacutepria aplicaccedilatildeo invocando o notifyDestroyed()

- Interface

As MIDlets devem poder ser executadas em qualquer dispositivo contendo a VM sem alteraccedilotildees poreacutem isso torna-se bastante difiacutecil na parte de Interface com usuaacuterio pois dispositivos variam de tamanho de tela cores teclados touch-Screens e outros aspectos

As aplicaccedilotildees satildeo desenvolvidas com uma certa abstraccedilatildeo de tela pois os comandos e insersatildeo de dados satildeo feitos atraveacutes dos bototildees do celular e isto natildeo eacute sabido previamente As aplicaccedilotildees descobrem isto em Runtime e se comportam de maneira apropriada a cada celular Jaacute no desenvolvimento de jogos a aplicaccedilatildeo eacute bem mais especiacutefica pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos como disposiccedilatildeo em tela por exemplo

A tela do dispositivo eacute representada por uma instacircncia da classe Display a qual eacute obtida pelo meacutetodo getDisplay() geralmente contida no meacutetodo startApp() pois o meacutetodo getDisplay() somente fica disponiacutevel apoacutes o inicio da Aplicaccedilatildeo (startApp()) Nessa instancia de Display satildeo inseridos heranccedilas de Displayable

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 2: Tutorial J2ME

2

Tutorial J2ME Copyrightreg - 2005

Iacutendice - INTRODUCcedilAtildeO 4

- ENTENDENDO J2ME5

- CONFIGURATION5

- PROFILES5

- SEGURANCcedilA 7

- TECNOLOGIAS WIRELESS8

- DIFERENCcedilA ENTRE MIDP 10 E 209

- APIS 9

- CRIANDO PROJETOS COMPILANDO E EXECUTANDO 9

- CICLO DE VIDA DE UMA MIDLET 13

- INTERFACE 13

- COMMANDS 14

- TEXTBOX 16

- TICKERS16

- FORMS 16

- ITEM17

- LISTS 19

- IMAGENS 20

- ALERTS20

- CONEXOtildeES 21

- SMS VIA SERVIDOR22

- ARMAZENAMENTO EM CELULARES (RECORDSTORES) 23

- CANVAS25

- CODIFICANDO 29

COacuteDIGOS EXEMPLOS31

3

Tutorial J2ME Copyrightreg - 2005

EXEMPLOCOMMANDSANDTICKER31 EXEMPLOLISTANDALERT 33 EXEMPLOTEXTBOX36 EXEMPLOFORM1 38 EXEMPLOGAUGE40 EXEMPLOCONNECTIONIMAGE43 EXEMPLOHTTPCONNECTION46 EXEMPLOCANVAS49

REFEREcircNCIAS BIBLIOGRAacuteFICAS 51

COPYRIGHT 52

4

Tutorial J2ME Copyrightreg - 2005

Apostila de J2ME

- Introduccedilatildeo

Comecemos com uma pergunta baacutesica poreacutem natildeo menos importante O que vem a ser esse J2ME E para que serve

Java 2 Micro Edition eacute uma API Java voltada para micro aplicativos que rodam em micro processadores assim como os dos celulares e PDA s

Neste Tutorial vamos tratar da Tecnologia J2ME MIDP 10 voltada para aplicaccedilotildees graacuteficas poreacutem natildeo vamos tratar de jogos aqui embora apoacutes a leitura deste vocecirc pode ter um embasamento para comeccedilar a desenvolver algo na aacuterea As aplicaccedilotildees criadas usando-se MIDP satildeo chamadas MIDlets (assim como Servlets e Applets)

Usamos os programas - Wireless Tollkit que eacute um software gratuito feito pela Sun para simplificar o ciclo

de desenvolvimento do J2ME o qual pode ser encontrado em httpwirelessjavasuncomallsoftware

(eacute necessaacuterio que vocecirc jaacute tenha o j2sdk instalado httpjavasuncomj2se) vocecirc ainda pode baixar outros emuladores encontrados na mesma pagina do Wireless Toolkit para posteriores testes

- E o editor GEL que eacute free e eacute um oacutetimo editor facilitando muito na ediccedilatildeo com auto-complete de meacutetodos e muitas outras facilidades que este programa provecirc e pode ser encontrado em wwwgexpertscom

Caso vocecirc jaacute tenha algum outro programa como o Eclipse (wwweclipseorg) por exemplo pode-se usa-lo tambeacutem fazendo as devidas modificaccedilotildees existe um plugin chamado EclipseME (httpeclipsemesourceforgenet) que pode ser utilizado para auxiliar nesse desenvolvimento

A abordagem desta apostila foca-se no MIDP10 e CLDC10 por ainda ser maioria no mercado e tambeacutem para que possamos contemplar bem os recursos para se desenvolver uma aplicaccedilatildeo J2ME Se fossemos discutir a fundo os novos recursos do MIDP20 e CLDC11 teriacuteamos que dar uma abrangecircncia muito maior do que a que jaacute damos nesta apostila e esse natildeo eacute o nosso objetivo para esta versatildeo do material

5

Tutorial J2ME Copyrightreg - 2005

- Entendendo J2ME

J2ME basicamente eacute dividido em configurations profiles e APIs opcionais

- Configuration

A configuration mais baacutesica do J2ME eacute o CLDC (Connected Limited Device Configuration) e tambeacutem a mais importante pois ela da base para a outra configuration CDC (Connected Limited Configuration) a qual prove algumas funcionalidades a mais e requer um pouco mais de hardware

Mas o que vem a ser essa tal de configuration Bom ela basicamente provecirc algumas bibliotecas baacutesicas e a VM (virtual machine) ou seja a parte mais basica que necessita estar presente em todo e qualquer dispositivo que suporta essa tecnologia

- Profiles

Um profile nada mais eacute que uma seacuterie de API s padrotildees que combinadas com alguma configuration no nosso caso o CLDC prove um serviccedilo completo para que aplicaccedilotildees possam ser rodadas

E a profile que noacutes iremos trabalhar eacute a MIDP

Celulares em sua quase totalidade hoje no mercado trabalha com o MIDP10 e CLDC10

Para entendermos melhor pensemos da seguinte maneira Profiles satildeo mais especiacuteficos que configurations e fazendo analogia a um velho exemplo temos uma

6

Tutorial J2ME Copyrightreg - 2005

abstraccedilatildeo sobre o que eacute um carro e como ele eacute fabricado (configuration) e como um Ford eacute fabricado (profile) mais tecnicamente falando profile eacute baseado em configuration e ainda acima dos profiles estatildeo as APIs que na nossa analogia seria um modelo especiacutefico da Ford

Como jaacute foi citado existem dois configurations um configuration eacute o CLDC (Connected Limited Device Configuration) que rege as configuraccedilotildees para aparelhos bem pequenos como celulares ou PDAs o qual fica acima das diretrizes J2ME juntamente com CDC (Connected Device Configuration) o que rege as configuraccedilotildees para aparelhos um pouco maiores mas mesmo assim pequenos

Podem haver vaacuterios Profiles vamos citar dois aqui os quais satildeo os mais importantes para este estudo MIDP (Mobile Information Device Profile) e tambeacutem o PDAP (Personal Digital Assistant Profile) e ambos estatildeo acima do CLDC

CLDC como jaacute vimos rege as configuraccedilotildees para aparelhos extremamente pequenos ele foi desenvolvido para dispositivos de no miacutenimo 160KB e algumas dezenas de MHz de processamento Vocecirc natildeo leu errado e nem noacutes trocamos unidades de medidas a memoacuteria estaacute realmente certa o que nos faz pensar muito em termos de aplicaccedilotildees que podem rodar neles e nos traz de volta a certas programaccedilotildees para DOS no que diz respeito agrave memoacuteria E falando em memoacuteria relevemos tambeacutem o processamento que eacute muito fraco mas muito mesmo pois no miacutenimo 16MHz satildeo requeridos e se tratando de aparelhos tops de linha podem chegar ateacute 300MHz ou um pouco mais (ateacute a composiccedilatildeo desta mateacuteria) poreacutem eacute muito difiacutecil dizer ao certo pois o acesso a informaccedilotildees desse tipo nas especificaccedilotildees dos fabricantes eacute bem restrito embora jaacute nos faz analisar melhor coacutedigos e meacutetodos usados os quais despedem de muito processamento e uso de memoacuteria E tambeacutem a conexatildeo lenta tipicamente de

7

Tutorial J2ME Copyrightreg - 2005

9600bps para aparelhos TDMACDMA e de 128Kbps para GPRSCDMA 1xRTT MIDP tem as seguintes caracteriacutesticas - Miacutenimo de 160kB de memoacuteria natildeo-volaacutetil para JAVA - Um processador de 16 bits ou 32 bits com um clock de no miacutenimo 16MHz - 32KB de memoacuteria volaacutetil para tempo de execuccedilatildeo - Pelo menos 192KB livres para Java - 8KB de memoacuteria natildeo-volaacutetil de para armazenamento de dados - Uma tela de pelo menos 96x54 pixels (aqui jaacute cai por terra a propaganda de

muitos celulares os quais dizem ter uma tela ampla de 96x54 o que eacute o miacutenimo necessaacuterio)

- Capacidade de entrada de dados seja por teclado (do celular) teclado externo ou mesmo Touch-screen

- Possibilidade de enviar e receber dados em conexatildeo possivelmente intermitente e banda reduzida

- Seguranccedila

Uma pergunta frequumlentemente feita eacute Agora com programas rodando nos celulares natildeo iremos ter problemas de viacuterus ou programas maliciosos Por meio do J2ME muito difiacutecil poreacutem ja temos visto celulares sendo atacados por viacuterus que exploram falhas do Sistema operacional e natildeo de uma aplicaccedilatildeo J2ME

No caso dos jogos de celulares cada fabricante disponibiliza uma API especiacutefica para os jogos podendo assim aproveitar melhor o desempenho do aparelho poreacutem cai por terra a forte caracteriacutestica de vida do JAVA a (WORA) Write Once Run Anywhere apesar de ser mais seguro perde-se um pouco a funcionalidade

A maquina virtual tem um espaccedilo independente de memoacuteria (sand-box) e natildeo pode acessar a memoacuteria correspondente agraves aplicaccedilotildees nativas do celular assim como eacute feito com os Applets um pouco diferente do J2SE

8

Tutorial J2ME Copyrightreg - 2005

Nota dos Autores Pouco tempo antes da revisatildeo dessa segunda versatildeo da apostila surgiu o primeiro viacuterus para celulares para uma seacuterie especiacutefica da Nokia aquela que usa SymbianOS O viacuterus embora seja chamado de viacuterus se encaixa mais na qualidade de WORM pois se propaga sozinho atraveacutes da interface de Bluetooth do celular poreacutem este worm natildeo faz nada no celular natildeo danifica nada apenas tenta se propagar para outros celulares Um malefiacutecio provocado eacute gastar bateria do celular pois fica com a interface de Bluetooth ligada e procurando algueacutem que responda para se retransmitir

- Tecnologias Wireless

Muitas pessoas ainda tecircm duacutevidas sobre as diferentes tecnologias de celulares existentes Vamos tentar defini-las e diferencia-las em poucas palavras sendo que este natildeo eacute o enfoque principal deste Tutorial

- TDMA (time division multiple access ou acesso muacuteltiplo por divisatildeo do tempo) ou seja ele natildeo diferencia voz e dados entatildeo para navegar na internet(dados) vocecirc paga o mesmo preccedilo que pagaria por fazer uma ligaccedilatildeo de voz Quem tem algum celular tdma sabe o quatildeo caro e lento eacute isso Somente para estabelecer a conexatildeo leva-se uns 8 segundos e a transferecircncia de dados daacute-se a 9600bps(conseguindo-se taxa maacutexima)

- CDMA (code division multiple access ou acesso muacuteltiplo por divisatildeo de coacutedigos) ou seja eacute separado voz de dados e tanto esta tecnologia quando a GSM satildeo conexatildeo 100 ativa ou seja natildeo existe este delay de conexatildeo vocecirc requisita uma informaccedilatildeo e ela vem diretamente Aleacutem de a taxa de transferecircncia que eacute maior chegando a 256Kbps usando CDMA 1xRTT que eacute o que esta em vigor

- GSM (global system for communication ou sistema global de comunicaccedilatildeo) ou seja tem as mesmas caracteriacutesticas da tecnologia CDMA poreacutem opera usando GPRS

Como foi falado acima as conexotildees eram para ser 100 ativas ou seja on-line todo tempo poreacutem pelo provado pelo uso hoje dessas tecnologias vemos que ele precisa de uma primeira conexatildeo o que tambeacutem despende alguns segundos para somente depois poder transmitir

Caso haja maior interesse nas tecnologias de transmissatildeo e na evoluccedilatildeo e tudo mais que diz respeito recomendo estes sites httpwwwsitcombrSeparataTELCO50htm

e httpidgnowterracombridgnowtelecom2002090043 ainda em wwwgsmworldnet

9

Tutorial J2ME Copyrightreg - 2005

- Diferenccedila entre MIDP 10 e 20

Existem algumas diferenccedilas entre as versotildees como todos sabemos a cada versatildeo mais nova eacute sempre incrementado mais funccedilotildees Aleacutem desses meacutetodos a mais e algumas facilidades maiores da 20 como classes para jogos e tratamento de sons temos a diferenccedila na comunicaccedilatildeo de dados que eacute o mais interessante aqui como por exemplo as conexotildees no CLDC10 satildeo feitas atraveacutes do protocolo http que no caso eacute inseguro no envio de informaccedilotildees jaacute na 10 estaacute implementado o https (ssl) conexatildeo com criptografia que jaacute eacute conhecida de todos

Aqui listamos os Packages disponiacuteveis para as versotildees

javalang

javalangref (somente CLDC11)

javaio

javautil

javaxmicroeditionio

javaxmicroeditionlcdui

javaxmicroeditionlcduigame (somente na 20)

javaxmicroeditionmedia (somente na 20)

javaxmicroeditionmediacontrol (somente na 20)

javaxmicroeditionmidlet

javaxmicroeditionrms

javaxmicroeditionpki (somente na 20)

Opcionalmente fabricantes podem fornecer APIs JAVA para acesso a partes especificas de cada aparelho

Com relaccedilatildeo agrave seguranccedila o CLDC11 traz bastante recursos e jaacute se aproxima mais do J2SE com Permissions Types Protection Domains baseados em IPs e PKIs

- APIs

A CLDC 10 natildeo possui suporte a ponto flutuante ou seja se desejas trabalhar com contas e valores reais teraacutes que manuseaacute-los em coacutedigo mesmo A versatildeo 11 do CLDC jaacute possui suporte a ponto flutuante poreacutem mesmo com a versatildeo 10 vocecirc pode baixar programas especiacuteficos pra isso como esse programa encontrado em httphomerochesterrrcomohommesMathFP

Vocecirc tem ainda outras restriccedilotildees como

Sem user classLoading

Sem finalizaccedilatildeo de objetos (finallize() de javalangObject)

Garbage collector existe poreacutem natildeo executa meacutetodo automaacutetico

Sem RMI e sem JINI

Sem meacutetodos nativos a natildeo ser os fornecidos pela JVM nativa

MultiThreading (sem interrupt() pause() resume() e stop())

Sem thread groups e thread Deamons

- Criando projetos Compilando e Executando

10

Tutorial J2ME Copyrightreg - 2005

Bom depois de muita teoria a qual nos deu um embasamento melhor para sabermos o que estamos fazendo vamos a uma parte mais praacutetica e a mais esperada por todos

O processo de desenvolvimento de MIDlets eacute um pouco mais complexo do que de outros programas feitos em JAVA pois eacute feito segundo estes passos

Editar coacutedigo fonte

Compilar

Preacute-Verificar

Empacotar

Testar eou Instalar

Depois de tudo instalado corretamente devemos primeiramente abrir o Wireless ToolKit e criar um Projeto para isso clique em New Project

Depois em Project Name defina o nome do seu projeto e logo abaixo o nome da classe de sua midlet que deve ser igual ao nome do projeto

11

Tutorial J2ME Copyrightreg - 2005

Feito isso ele teraacute criado vaacuterios diretoacuterios dentro de path_WTKappsSua_Aplicacao para cada aplicaccedilatildeo eacute criado uma aacutervore de diretoacuterios conforme ilustrado abaixo

Em seguida abriraacute uma tela que conteacutem informaccedilotildees sobre a sua aplicaccedilatildeo (aconselho a natildeo mudar o que estaacute laacute) pois eacute por esse arquivo que o celular reconheceraacute seu aplicativo antes de ser baixado se ele eacute apto a rodar ou natildeo seu programa a uacutenica

coisa que poderias mudar seria o Vendor Name o qual vocecirc pode colocar o nome de sua empresa ou o que desejares Se vocecircs verificarem a uacuteltima aba desta tela (aba MIDlets)

tem um link para uma figura png que eacute o icone que apareceraacute no celular de sua aplicaccedilatildeo vocecirc pode modificaacute-lo colocando o nome de uma figura personalizada apenas

lembre-se que a figura deve ficar no devido diretoacuterio (path_WTKappsSua_Aplicacaores) e sempre para qualquer aplicaccedilatildeo deve-se por dentro do diretoacuterio res

12

Tutorial J2ME Copyrightreg - 2005

Existem dois bototildees que seratildeo muito utilizados por nos BUILD e RUN os quais satildeo auto-explicativos

Apoacutes a criaccedilatildeo do projeto estamos aptos e finalmente a criar nossos coacutedigos

Obfuscator Como vimos dispositivos celulares possuem memoacuteria muito reduzida e quanto

menor sua aplicaccedilatildeo for melhor seraacute para o celular Para isso usamos o Obfuscator que eacute usado para diminuir o tamanho dos arquivos eliminando redundacircncia e tambeacutem para evitar engenharia reversa

Este programa renomeia classes variaacuteveis e meacutetodos para nomes mais compactos removem classes meacutetodos natildeo usados e ainda inserem dados ilegais ou questionaacuteveis para confundir Descompiladores

Para criar um pacote obfuscado vocecirc precisa de algum programa Obfuscator um bom programa o Retroguard pode ser encontrado em wwwretrologiccom depois de baixado vocecirc deve copiar o arquivo retroguardjar dentro do diretoacuterio bin do wirelessToolkit (Ex cWTK104bin)

Tome um pouco de cuidado com os obfuscators pois em alguns celulares a sua aplicaccedilatildeo pode acabar natildeo funcionando

13

Tutorial J2ME Copyrightreg - 2005

- Ciclo de Vida de uma MIDlet

O Aplication Manager (AM) de cada dispositivo eacute quem vai controlar os aplicativos a serem instalados onde e como seratildeo armazenados e como seratildeo executados As classes de cada aplicativo estatildeo em um arquivo JAR o qual vem acompanhado de um descritor JAD que teraacute todas as informaccedilotildees as quais jaacute vimos anteriormente

Assim que a MIDlet eacute invocada o AM invoca o meacutetodo startApp() o qual coloca a midlet no estado Active Enquanto ela estiver executando o AM pode pausar ela invocando o meacutetodo pauseApp() no caso de uma chamada sendo recebida ou SMS chegando A aplicaccedilatildeo pode pausar a si mesma bastando invocar notifyPaused() Assim como a AM pode pausar a aplicaccedilatildeo e esta a si mesma ocorre o mesmo com o DestroyApp() que eacute invocado pela AM para fechar a aplicaccedilatildeo ou ateacute mesmo pode ser fechada atraveacutes da proacutepria aplicaccedilatildeo invocando o notifyDestroyed()

- Interface

As MIDlets devem poder ser executadas em qualquer dispositivo contendo a VM sem alteraccedilotildees poreacutem isso torna-se bastante difiacutecil na parte de Interface com usuaacuterio pois dispositivos variam de tamanho de tela cores teclados touch-Screens e outros aspectos

As aplicaccedilotildees satildeo desenvolvidas com uma certa abstraccedilatildeo de tela pois os comandos e insersatildeo de dados satildeo feitos atraveacutes dos bototildees do celular e isto natildeo eacute sabido previamente As aplicaccedilotildees descobrem isto em Runtime e se comportam de maneira apropriada a cada celular Jaacute no desenvolvimento de jogos a aplicaccedilatildeo eacute bem mais especiacutefica pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos como disposiccedilatildeo em tela por exemplo

A tela do dispositivo eacute representada por uma instacircncia da classe Display a qual eacute obtida pelo meacutetodo getDisplay() geralmente contida no meacutetodo startApp() pois o meacutetodo getDisplay() somente fica disponiacutevel apoacutes o inicio da Aplicaccedilatildeo (startApp()) Nessa instancia de Display satildeo inseridos heranccedilas de Displayable

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 3: Tutorial J2ME

3

Tutorial J2ME Copyrightreg - 2005

EXEMPLOCOMMANDSANDTICKER31 EXEMPLOLISTANDALERT 33 EXEMPLOTEXTBOX36 EXEMPLOFORM1 38 EXEMPLOGAUGE40 EXEMPLOCONNECTIONIMAGE43 EXEMPLOHTTPCONNECTION46 EXEMPLOCANVAS49

REFEREcircNCIAS BIBLIOGRAacuteFICAS 51

COPYRIGHT 52

4

Tutorial J2ME Copyrightreg - 2005

Apostila de J2ME

- Introduccedilatildeo

Comecemos com uma pergunta baacutesica poreacutem natildeo menos importante O que vem a ser esse J2ME E para que serve

Java 2 Micro Edition eacute uma API Java voltada para micro aplicativos que rodam em micro processadores assim como os dos celulares e PDA s

Neste Tutorial vamos tratar da Tecnologia J2ME MIDP 10 voltada para aplicaccedilotildees graacuteficas poreacutem natildeo vamos tratar de jogos aqui embora apoacutes a leitura deste vocecirc pode ter um embasamento para comeccedilar a desenvolver algo na aacuterea As aplicaccedilotildees criadas usando-se MIDP satildeo chamadas MIDlets (assim como Servlets e Applets)

Usamos os programas - Wireless Tollkit que eacute um software gratuito feito pela Sun para simplificar o ciclo

de desenvolvimento do J2ME o qual pode ser encontrado em httpwirelessjavasuncomallsoftware

(eacute necessaacuterio que vocecirc jaacute tenha o j2sdk instalado httpjavasuncomj2se) vocecirc ainda pode baixar outros emuladores encontrados na mesma pagina do Wireless Toolkit para posteriores testes

- E o editor GEL que eacute free e eacute um oacutetimo editor facilitando muito na ediccedilatildeo com auto-complete de meacutetodos e muitas outras facilidades que este programa provecirc e pode ser encontrado em wwwgexpertscom

Caso vocecirc jaacute tenha algum outro programa como o Eclipse (wwweclipseorg) por exemplo pode-se usa-lo tambeacutem fazendo as devidas modificaccedilotildees existe um plugin chamado EclipseME (httpeclipsemesourceforgenet) que pode ser utilizado para auxiliar nesse desenvolvimento

A abordagem desta apostila foca-se no MIDP10 e CLDC10 por ainda ser maioria no mercado e tambeacutem para que possamos contemplar bem os recursos para se desenvolver uma aplicaccedilatildeo J2ME Se fossemos discutir a fundo os novos recursos do MIDP20 e CLDC11 teriacuteamos que dar uma abrangecircncia muito maior do que a que jaacute damos nesta apostila e esse natildeo eacute o nosso objetivo para esta versatildeo do material

5

Tutorial J2ME Copyrightreg - 2005

- Entendendo J2ME

J2ME basicamente eacute dividido em configurations profiles e APIs opcionais

- Configuration

A configuration mais baacutesica do J2ME eacute o CLDC (Connected Limited Device Configuration) e tambeacutem a mais importante pois ela da base para a outra configuration CDC (Connected Limited Configuration) a qual prove algumas funcionalidades a mais e requer um pouco mais de hardware

Mas o que vem a ser essa tal de configuration Bom ela basicamente provecirc algumas bibliotecas baacutesicas e a VM (virtual machine) ou seja a parte mais basica que necessita estar presente em todo e qualquer dispositivo que suporta essa tecnologia

- Profiles

Um profile nada mais eacute que uma seacuterie de API s padrotildees que combinadas com alguma configuration no nosso caso o CLDC prove um serviccedilo completo para que aplicaccedilotildees possam ser rodadas

E a profile que noacutes iremos trabalhar eacute a MIDP

Celulares em sua quase totalidade hoje no mercado trabalha com o MIDP10 e CLDC10

Para entendermos melhor pensemos da seguinte maneira Profiles satildeo mais especiacuteficos que configurations e fazendo analogia a um velho exemplo temos uma

6

Tutorial J2ME Copyrightreg - 2005

abstraccedilatildeo sobre o que eacute um carro e como ele eacute fabricado (configuration) e como um Ford eacute fabricado (profile) mais tecnicamente falando profile eacute baseado em configuration e ainda acima dos profiles estatildeo as APIs que na nossa analogia seria um modelo especiacutefico da Ford

Como jaacute foi citado existem dois configurations um configuration eacute o CLDC (Connected Limited Device Configuration) que rege as configuraccedilotildees para aparelhos bem pequenos como celulares ou PDAs o qual fica acima das diretrizes J2ME juntamente com CDC (Connected Device Configuration) o que rege as configuraccedilotildees para aparelhos um pouco maiores mas mesmo assim pequenos

Podem haver vaacuterios Profiles vamos citar dois aqui os quais satildeo os mais importantes para este estudo MIDP (Mobile Information Device Profile) e tambeacutem o PDAP (Personal Digital Assistant Profile) e ambos estatildeo acima do CLDC

CLDC como jaacute vimos rege as configuraccedilotildees para aparelhos extremamente pequenos ele foi desenvolvido para dispositivos de no miacutenimo 160KB e algumas dezenas de MHz de processamento Vocecirc natildeo leu errado e nem noacutes trocamos unidades de medidas a memoacuteria estaacute realmente certa o que nos faz pensar muito em termos de aplicaccedilotildees que podem rodar neles e nos traz de volta a certas programaccedilotildees para DOS no que diz respeito agrave memoacuteria E falando em memoacuteria relevemos tambeacutem o processamento que eacute muito fraco mas muito mesmo pois no miacutenimo 16MHz satildeo requeridos e se tratando de aparelhos tops de linha podem chegar ateacute 300MHz ou um pouco mais (ateacute a composiccedilatildeo desta mateacuteria) poreacutem eacute muito difiacutecil dizer ao certo pois o acesso a informaccedilotildees desse tipo nas especificaccedilotildees dos fabricantes eacute bem restrito embora jaacute nos faz analisar melhor coacutedigos e meacutetodos usados os quais despedem de muito processamento e uso de memoacuteria E tambeacutem a conexatildeo lenta tipicamente de

7

Tutorial J2ME Copyrightreg - 2005

9600bps para aparelhos TDMACDMA e de 128Kbps para GPRSCDMA 1xRTT MIDP tem as seguintes caracteriacutesticas - Miacutenimo de 160kB de memoacuteria natildeo-volaacutetil para JAVA - Um processador de 16 bits ou 32 bits com um clock de no miacutenimo 16MHz - 32KB de memoacuteria volaacutetil para tempo de execuccedilatildeo - Pelo menos 192KB livres para Java - 8KB de memoacuteria natildeo-volaacutetil de para armazenamento de dados - Uma tela de pelo menos 96x54 pixels (aqui jaacute cai por terra a propaganda de

muitos celulares os quais dizem ter uma tela ampla de 96x54 o que eacute o miacutenimo necessaacuterio)

- Capacidade de entrada de dados seja por teclado (do celular) teclado externo ou mesmo Touch-screen

- Possibilidade de enviar e receber dados em conexatildeo possivelmente intermitente e banda reduzida

- Seguranccedila

Uma pergunta frequumlentemente feita eacute Agora com programas rodando nos celulares natildeo iremos ter problemas de viacuterus ou programas maliciosos Por meio do J2ME muito difiacutecil poreacutem ja temos visto celulares sendo atacados por viacuterus que exploram falhas do Sistema operacional e natildeo de uma aplicaccedilatildeo J2ME

No caso dos jogos de celulares cada fabricante disponibiliza uma API especiacutefica para os jogos podendo assim aproveitar melhor o desempenho do aparelho poreacutem cai por terra a forte caracteriacutestica de vida do JAVA a (WORA) Write Once Run Anywhere apesar de ser mais seguro perde-se um pouco a funcionalidade

A maquina virtual tem um espaccedilo independente de memoacuteria (sand-box) e natildeo pode acessar a memoacuteria correspondente agraves aplicaccedilotildees nativas do celular assim como eacute feito com os Applets um pouco diferente do J2SE

8

Tutorial J2ME Copyrightreg - 2005

Nota dos Autores Pouco tempo antes da revisatildeo dessa segunda versatildeo da apostila surgiu o primeiro viacuterus para celulares para uma seacuterie especiacutefica da Nokia aquela que usa SymbianOS O viacuterus embora seja chamado de viacuterus se encaixa mais na qualidade de WORM pois se propaga sozinho atraveacutes da interface de Bluetooth do celular poreacutem este worm natildeo faz nada no celular natildeo danifica nada apenas tenta se propagar para outros celulares Um malefiacutecio provocado eacute gastar bateria do celular pois fica com a interface de Bluetooth ligada e procurando algueacutem que responda para se retransmitir

- Tecnologias Wireless

Muitas pessoas ainda tecircm duacutevidas sobre as diferentes tecnologias de celulares existentes Vamos tentar defini-las e diferencia-las em poucas palavras sendo que este natildeo eacute o enfoque principal deste Tutorial

- TDMA (time division multiple access ou acesso muacuteltiplo por divisatildeo do tempo) ou seja ele natildeo diferencia voz e dados entatildeo para navegar na internet(dados) vocecirc paga o mesmo preccedilo que pagaria por fazer uma ligaccedilatildeo de voz Quem tem algum celular tdma sabe o quatildeo caro e lento eacute isso Somente para estabelecer a conexatildeo leva-se uns 8 segundos e a transferecircncia de dados daacute-se a 9600bps(conseguindo-se taxa maacutexima)

- CDMA (code division multiple access ou acesso muacuteltiplo por divisatildeo de coacutedigos) ou seja eacute separado voz de dados e tanto esta tecnologia quando a GSM satildeo conexatildeo 100 ativa ou seja natildeo existe este delay de conexatildeo vocecirc requisita uma informaccedilatildeo e ela vem diretamente Aleacutem de a taxa de transferecircncia que eacute maior chegando a 256Kbps usando CDMA 1xRTT que eacute o que esta em vigor

- GSM (global system for communication ou sistema global de comunicaccedilatildeo) ou seja tem as mesmas caracteriacutesticas da tecnologia CDMA poreacutem opera usando GPRS

Como foi falado acima as conexotildees eram para ser 100 ativas ou seja on-line todo tempo poreacutem pelo provado pelo uso hoje dessas tecnologias vemos que ele precisa de uma primeira conexatildeo o que tambeacutem despende alguns segundos para somente depois poder transmitir

Caso haja maior interesse nas tecnologias de transmissatildeo e na evoluccedilatildeo e tudo mais que diz respeito recomendo estes sites httpwwwsitcombrSeparataTELCO50htm

e httpidgnowterracombridgnowtelecom2002090043 ainda em wwwgsmworldnet

9

Tutorial J2ME Copyrightreg - 2005

- Diferenccedila entre MIDP 10 e 20

Existem algumas diferenccedilas entre as versotildees como todos sabemos a cada versatildeo mais nova eacute sempre incrementado mais funccedilotildees Aleacutem desses meacutetodos a mais e algumas facilidades maiores da 20 como classes para jogos e tratamento de sons temos a diferenccedila na comunicaccedilatildeo de dados que eacute o mais interessante aqui como por exemplo as conexotildees no CLDC10 satildeo feitas atraveacutes do protocolo http que no caso eacute inseguro no envio de informaccedilotildees jaacute na 10 estaacute implementado o https (ssl) conexatildeo com criptografia que jaacute eacute conhecida de todos

Aqui listamos os Packages disponiacuteveis para as versotildees

javalang

javalangref (somente CLDC11)

javaio

javautil

javaxmicroeditionio

javaxmicroeditionlcdui

javaxmicroeditionlcduigame (somente na 20)

javaxmicroeditionmedia (somente na 20)

javaxmicroeditionmediacontrol (somente na 20)

javaxmicroeditionmidlet

javaxmicroeditionrms

javaxmicroeditionpki (somente na 20)

Opcionalmente fabricantes podem fornecer APIs JAVA para acesso a partes especificas de cada aparelho

Com relaccedilatildeo agrave seguranccedila o CLDC11 traz bastante recursos e jaacute se aproxima mais do J2SE com Permissions Types Protection Domains baseados em IPs e PKIs

- APIs

A CLDC 10 natildeo possui suporte a ponto flutuante ou seja se desejas trabalhar com contas e valores reais teraacutes que manuseaacute-los em coacutedigo mesmo A versatildeo 11 do CLDC jaacute possui suporte a ponto flutuante poreacutem mesmo com a versatildeo 10 vocecirc pode baixar programas especiacuteficos pra isso como esse programa encontrado em httphomerochesterrrcomohommesMathFP

Vocecirc tem ainda outras restriccedilotildees como

Sem user classLoading

Sem finalizaccedilatildeo de objetos (finallize() de javalangObject)

Garbage collector existe poreacutem natildeo executa meacutetodo automaacutetico

Sem RMI e sem JINI

Sem meacutetodos nativos a natildeo ser os fornecidos pela JVM nativa

MultiThreading (sem interrupt() pause() resume() e stop())

Sem thread groups e thread Deamons

- Criando projetos Compilando e Executando

10

Tutorial J2ME Copyrightreg - 2005

Bom depois de muita teoria a qual nos deu um embasamento melhor para sabermos o que estamos fazendo vamos a uma parte mais praacutetica e a mais esperada por todos

O processo de desenvolvimento de MIDlets eacute um pouco mais complexo do que de outros programas feitos em JAVA pois eacute feito segundo estes passos

Editar coacutedigo fonte

Compilar

Preacute-Verificar

Empacotar

Testar eou Instalar

Depois de tudo instalado corretamente devemos primeiramente abrir o Wireless ToolKit e criar um Projeto para isso clique em New Project

Depois em Project Name defina o nome do seu projeto e logo abaixo o nome da classe de sua midlet que deve ser igual ao nome do projeto

11

Tutorial J2ME Copyrightreg - 2005

Feito isso ele teraacute criado vaacuterios diretoacuterios dentro de path_WTKappsSua_Aplicacao para cada aplicaccedilatildeo eacute criado uma aacutervore de diretoacuterios conforme ilustrado abaixo

Em seguida abriraacute uma tela que conteacutem informaccedilotildees sobre a sua aplicaccedilatildeo (aconselho a natildeo mudar o que estaacute laacute) pois eacute por esse arquivo que o celular reconheceraacute seu aplicativo antes de ser baixado se ele eacute apto a rodar ou natildeo seu programa a uacutenica

coisa que poderias mudar seria o Vendor Name o qual vocecirc pode colocar o nome de sua empresa ou o que desejares Se vocecircs verificarem a uacuteltima aba desta tela (aba MIDlets)

tem um link para uma figura png que eacute o icone que apareceraacute no celular de sua aplicaccedilatildeo vocecirc pode modificaacute-lo colocando o nome de uma figura personalizada apenas

lembre-se que a figura deve ficar no devido diretoacuterio (path_WTKappsSua_Aplicacaores) e sempre para qualquer aplicaccedilatildeo deve-se por dentro do diretoacuterio res

12

Tutorial J2ME Copyrightreg - 2005

Existem dois bototildees que seratildeo muito utilizados por nos BUILD e RUN os quais satildeo auto-explicativos

Apoacutes a criaccedilatildeo do projeto estamos aptos e finalmente a criar nossos coacutedigos

Obfuscator Como vimos dispositivos celulares possuem memoacuteria muito reduzida e quanto

menor sua aplicaccedilatildeo for melhor seraacute para o celular Para isso usamos o Obfuscator que eacute usado para diminuir o tamanho dos arquivos eliminando redundacircncia e tambeacutem para evitar engenharia reversa

Este programa renomeia classes variaacuteveis e meacutetodos para nomes mais compactos removem classes meacutetodos natildeo usados e ainda inserem dados ilegais ou questionaacuteveis para confundir Descompiladores

Para criar um pacote obfuscado vocecirc precisa de algum programa Obfuscator um bom programa o Retroguard pode ser encontrado em wwwretrologiccom depois de baixado vocecirc deve copiar o arquivo retroguardjar dentro do diretoacuterio bin do wirelessToolkit (Ex cWTK104bin)

Tome um pouco de cuidado com os obfuscators pois em alguns celulares a sua aplicaccedilatildeo pode acabar natildeo funcionando

13

Tutorial J2ME Copyrightreg - 2005

- Ciclo de Vida de uma MIDlet

O Aplication Manager (AM) de cada dispositivo eacute quem vai controlar os aplicativos a serem instalados onde e como seratildeo armazenados e como seratildeo executados As classes de cada aplicativo estatildeo em um arquivo JAR o qual vem acompanhado de um descritor JAD que teraacute todas as informaccedilotildees as quais jaacute vimos anteriormente

Assim que a MIDlet eacute invocada o AM invoca o meacutetodo startApp() o qual coloca a midlet no estado Active Enquanto ela estiver executando o AM pode pausar ela invocando o meacutetodo pauseApp() no caso de uma chamada sendo recebida ou SMS chegando A aplicaccedilatildeo pode pausar a si mesma bastando invocar notifyPaused() Assim como a AM pode pausar a aplicaccedilatildeo e esta a si mesma ocorre o mesmo com o DestroyApp() que eacute invocado pela AM para fechar a aplicaccedilatildeo ou ateacute mesmo pode ser fechada atraveacutes da proacutepria aplicaccedilatildeo invocando o notifyDestroyed()

- Interface

As MIDlets devem poder ser executadas em qualquer dispositivo contendo a VM sem alteraccedilotildees poreacutem isso torna-se bastante difiacutecil na parte de Interface com usuaacuterio pois dispositivos variam de tamanho de tela cores teclados touch-Screens e outros aspectos

As aplicaccedilotildees satildeo desenvolvidas com uma certa abstraccedilatildeo de tela pois os comandos e insersatildeo de dados satildeo feitos atraveacutes dos bototildees do celular e isto natildeo eacute sabido previamente As aplicaccedilotildees descobrem isto em Runtime e se comportam de maneira apropriada a cada celular Jaacute no desenvolvimento de jogos a aplicaccedilatildeo eacute bem mais especiacutefica pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos como disposiccedilatildeo em tela por exemplo

A tela do dispositivo eacute representada por uma instacircncia da classe Display a qual eacute obtida pelo meacutetodo getDisplay() geralmente contida no meacutetodo startApp() pois o meacutetodo getDisplay() somente fica disponiacutevel apoacutes o inicio da Aplicaccedilatildeo (startApp()) Nessa instancia de Display satildeo inseridos heranccedilas de Displayable

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 4: Tutorial J2ME

4

Tutorial J2ME Copyrightreg - 2005

Apostila de J2ME

- Introduccedilatildeo

Comecemos com uma pergunta baacutesica poreacutem natildeo menos importante O que vem a ser esse J2ME E para que serve

Java 2 Micro Edition eacute uma API Java voltada para micro aplicativos que rodam em micro processadores assim como os dos celulares e PDA s

Neste Tutorial vamos tratar da Tecnologia J2ME MIDP 10 voltada para aplicaccedilotildees graacuteficas poreacutem natildeo vamos tratar de jogos aqui embora apoacutes a leitura deste vocecirc pode ter um embasamento para comeccedilar a desenvolver algo na aacuterea As aplicaccedilotildees criadas usando-se MIDP satildeo chamadas MIDlets (assim como Servlets e Applets)

Usamos os programas - Wireless Tollkit que eacute um software gratuito feito pela Sun para simplificar o ciclo

de desenvolvimento do J2ME o qual pode ser encontrado em httpwirelessjavasuncomallsoftware

(eacute necessaacuterio que vocecirc jaacute tenha o j2sdk instalado httpjavasuncomj2se) vocecirc ainda pode baixar outros emuladores encontrados na mesma pagina do Wireless Toolkit para posteriores testes

- E o editor GEL que eacute free e eacute um oacutetimo editor facilitando muito na ediccedilatildeo com auto-complete de meacutetodos e muitas outras facilidades que este programa provecirc e pode ser encontrado em wwwgexpertscom

Caso vocecirc jaacute tenha algum outro programa como o Eclipse (wwweclipseorg) por exemplo pode-se usa-lo tambeacutem fazendo as devidas modificaccedilotildees existe um plugin chamado EclipseME (httpeclipsemesourceforgenet) que pode ser utilizado para auxiliar nesse desenvolvimento

A abordagem desta apostila foca-se no MIDP10 e CLDC10 por ainda ser maioria no mercado e tambeacutem para que possamos contemplar bem os recursos para se desenvolver uma aplicaccedilatildeo J2ME Se fossemos discutir a fundo os novos recursos do MIDP20 e CLDC11 teriacuteamos que dar uma abrangecircncia muito maior do que a que jaacute damos nesta apostila e esse natildeo eacute o nosso objetivo para esta versatildeo do material

5

Tutorial J2ME Copyrightreg - 2005

- Entendendo J2ME

J2ME basicamente eacute dividido em configurations profiles e APIs opcionais

- Configuration

A configuration mais baacutesica do J2ME eacute o CLDC (Connected Limited Device Configuration) e tambeacutem a mais importante pois ela da base para a outra configuration CDC (Connected Limited Configuration) a qual prove algumas funcionalidades a mais e requer um pouco mais de hardware

Mas o que vem a ser essa tal de configuration Bom ela basicamente provecirc algumas bibliotecas baacutesicas e a VM (virtual machine) ou seja a parte mais basica que necessita estar presente em todo e qualquer dispositivo que suporta essa tecnologia

- Profiles

Um profile nada mais eacute que uma seacuterie de API s padrotildees que combinadas com alguma configuration no nosso caso o CLDC prove um serviccedilo completo para que aplicaccedilotildees possam ser rodadas

E a profile que noacutes iremos trabalhar eacute a MIDP

Celulares em sua quase totalidade hoje no mercado trabalha com o MIDP10 e CLDC10

Para entendermos melhor pensemos da seguinte maneira Profiles satildeo mais especiacuteficos que configurations e fazendo analogia a um velho exemplo temos uma

6

Tutorial J2ME Copyrightreg - 2005

abstraccedilatildeo sobre o que eacute um carro e como ele eacute fabricado (configuration) e como um Ford eacute fabricado (profile) mais tecnicamente falando profile eacute baseado em configuration e ainda acima dos profiles estatildeo as APIs que na nossa analogia seria um modelo especiacutefico da Ford

Como jaacute foi citado existem dois configurations um configuration eacute o CLDC (Connected Limited Device Configuration) que rege as configuraccedilotildees para aparelhos bem pequenos como celulares ou PDAs o qual fica acima das diretrizes J2ME juntamente com CDC (Connected Device Configuration) o que rege as configuraccedilotildees para aparelhos um pouco maiores mas mesmo assim pequenos

Podem haver vaacuterios Profiles vamos citar dois aqui os quais satildeo os mais importantes para este estudo MIDP (Mobile Information Device Profile) e tambeacutem o PDAP (Personal Digital Assistant Profile) e ambos estatildeo acima do CLDC

CLDC como jaacute vimos rege as configuraccedilotildees para aparelhos extremamente pequenos ele foi desenvolvido para dispositivos de no miacutenimo 160KB e algumas dezenas de MHz de processamento Vocecirc natildeo leu errado e nem noacutes trocamos unidades de medidas a memoacuteria estaacute realmente certa o que nos faz pensar muito em termos de aplicaccedilotildees que podem rodar neles e nos traz de volta a certas programaccedilotildees para DOS no que diz respeito agrave memoacuteria E falando em memoacuteria relevemos tambeacutem o processamento que eacute muito fraco mas muito mesmo pois no miacutenimo 16MHz satildeo requeridos e se tratando de aparelhos tops de linha podem chegar ateacute 300MHz ou um pouco mais (ateacute a composiccedilatildeo desta mateacuteria) poreacutem eacute muito difiacutecil dizer ao certo pois o acesso a informaccedilotildees desse tipo nas especificaccedilotildees dos fabricantes eacute bem restrito embora jaacute nos faz analisar melhor coacutedigos e meacutetodos usados os quais despedem de muito processamento e uso de memoacuteria E tambeacutem a conexatildeo lenta tipicamente de

7

Tutorial J2ME Copyrightreg - 2005

9600bps para aparelhos TDMACDMA e de 128Kbps para GPRSCDMA 1xRTT MIDP tem as seguintes caracteriacutesticas - Miacutenimo de 160kB de memoacuteria natildeo-volaacutetil para JAVA - Um processador de 16 bits ou 32 bits com um clock de no miacutenimo 16MHz - 32KB de memoacuteria volaacutetil para tempo de execuccedilatildeo - Pelo menos 192KB livres para Java - 8KB de memoacuteria natildeo-volaacutetil de para armazenamento de dados - Uma tela de pelo menos 96x54 pixels (aqui jaacute cai por terra a propaganda de

muitos celulares os quais dizem ter uma tela ampla de 96x54 o que eacute o miacutenimo necessaacuterio)

- Capacidade de entrada de dados seja por teclado (do celular) teclado externo ou mesmo Touch-screen

- Possibilidade de enviar e receber dados em conexatildeo possivelmente intermitente e banda reduzida

- Seguranccedila

Uma pergunta frequumlentemente feita eacute Agora com programas rodando nos celulares natildeo iremos ter problemas de viacuterus ou programas maliciosos Por meio do J2ME muito difiacutecil poreacutem ja temos visto celulares sendo atacados por viacuterus que exploram falhas do Sistema operacional e natildeo de uma aplicaccedilatildeo J2ME

No caso dos jogos de celulares cada fabricante disponibiliza uma API especiacutefica para os jogos podendo assim aproveitar melhor o desempenho do aparelho poreacutem cai por terra a forte caracteriacutestica de vida do JAVA a (WORA) Write Once Run Anywhere apesar de ser mais seguro perde-se um pouco a funcionalidade

A maquina virtual tem um espaccedilo independente de memoacuteria (sand-box) e natildeo pode acessar a memoacuteria correspondente agraves aplicaccedilotildees nativas do celular assim como eacute feito com os Applets um pouco diferente do J2SE

8

Tutorial J2ME Copyrightreg - 2005

Nota dos Autores Pouco tempo antes da revisatildeo dessa segunda versatildeo da apostila surgiu o primeiro viacuterus para celulares para uma seacuterie especiacutefica da Nokia aquela que usa SymbianOS O viacuterus embora seja chamado de viacuterus se encaixa mais na qualidade de WORM pois se propaga sozinho atraveacutes da interface de Bluetooth do celular poreacutem este worm natildeo faz nada no celular natildeo danifica nada apenas tenta se propagar para outros celulares Um malefiacutecio provocado eacute gastar bateria do celular pois fica com a interface de Bluetooth ligada e procurando algueacutem que responda para se retransmitir

- Tecnologias Wireless

Muitas pessoas ainda tecircm duacutevidas sobre as diferentes tecnologias de celulares existentes Vamos tentar defini-las e diferencia-las em poucas palavras sendo que este natildeo eacute o enfoque principal deste Tutorial

- TDMA (time division multiple access ou acesso muacuteltiplo por divisatildeo do tempo) ou seja ele natildeo diferencia voz e dados entatildeo para navegar na internet(dados) vocecirc paga o mesmo preccedilo que pagaria por fazer uma ligaccedilatildeo de voz Quem tem algum celular tdma sabe o quatildeo caro e lento eacute isso Somente para estabelecer a conexatildeo leva-se uns 8 segundos e a transferecircncia de dados daacute-se a 9600bps(conseguindo-se taxa maacutexima)

- CDMA (code division multiple access ou acesso muacuteltiplo por divisatildeo de coacutedigos) ou seja eacute separado voz de dados e tanto esta tecnologia quando a GSM satildeo conexatildeo 100 ativa ou seja natildeo existe este delay de conexatildeo vocecirc requisita uma informaccedilatildeo e ela vem diretamente Aleacutem de a taxa de transferecircncia que eacute maior chegando a 256Kbps usando CDMA 1xRTT que eacute o que esta em vigor

- GSM (global system for communication ou sistema global de comunicaccedilatildeo) ou seja tem as mesmas caracteriacutesticas da tecnologia CDMA poreacutem opera usando GPRS

Como foi falado acima as conexotildees eram para ser 100 ativas ou seja on-line todo tempo poreacutem pelo provado pelo uso hoje dessas tecnologias vemos que ele precisa de uma primeira conexatildeo o que tambeacutem despende alguns segundos para somente depois poder transmitir

Caso haja maior interesse nas tecnologias de transmissatildeo e na evoluccedilatildeo e tudo mais que diz respeito recomendo estes sites httpwwwsitcombrSeparataTELCO50htm

e httpidgnowterracombridgnowtelecom2002090043 ainda em wwwgsmworldnet

9

Tutorial J2ME Copyrightreg - 2005

- Diferenccedila entre MIDP 10 e 20

Existem algumas diferenccedilas entre as versotildees como todos sabemos a cada versatildeo mais nova eacute sempre incrementado mais funccedilotildees Aleacutem desses meacutetodos a mais e algumas facilidades maiores da 20 como classes para jogos e tratamento de sons temos a diferenccedila na comunicaccedilatildeo de dados que eacute o mais interessante aqui como por exemplo as conexotildees no CLDC10 satildeo feitas atraveacutes do protocolo http que no caso eacute inseguro no envio de informaccedilotildees jaacute na 10 estaacute implementado o https (ssl) conexatildeo com criptografia que jaacute eacute conhecida de todos

Aqui listamos os Packages disponiacuteveis para as versotildees

javalang

javalangref (somente CLDC11)

javaio

javautil

javaxmicroeditionio

javaxmicroeditionlcdui

javaxmicroeditionlcduigame (somente na 20)

javaxmicroeditionmedia (somente na 20)

javaxmicroeditionmediacontrol (somente na 20)

javaxmicroeditionmidlet

javaxmicroeditionrms

javaxmicroeditionpki (somente na 20)

Opcionalmente fabricantes podem fornecer APIs JAVA para acesso a partes especificas de cada aparelho

Com relaccedilatildeo agrave seguranccedila o CLDC11 traz bastante recursos e jaacute se aproxima mais do J2SE com Permissions Types Protection Domains baseados em IPs e PKIs

- APIs

A CLDC 10 natildeo possui suporte a ponto flutuante ou seja se desejas trabalhar com contas e valores reais teraacutes que manuseaacute-los em coacutedigo mesmo A versatildeo 11 do CLDC jaacute possui suporte a ponto flutuante poreacutem mesmo com a versatildeo 10 vocecirc pode baixar programas especiacuteficos pra isso como esse programa encontrado em httphomerochesterrrcomohommesMathFP

Vocecirc tem ainda outras restriccedilotildees como

Sem user classLoading

Sem finalizaccedilatildeo de objetos (finallize() de javalangObject)

Garbage collector existe poreacutem natildeo executa meacutetodo automaacutetico

Sem RMI e sem JINI

Sem meacutetodos nativos a natildeo ser os fornecidos pela JVM nativa

MultiThreading (sem interrupt() pause() resume() e stop())

Sem thread groups e thread Deamons

- Criando projetos Compilando e Executando

10

Tutorial J2ME Copyrightreg - 2005

Bom depois de muita teoria a qual nos deu um embasamento melhor para sabermos o que estamos fazendo vamos a uma parte mais praacutetica e a mais esperada por todos

O processo de desenvolvimento de MIDlets eacute um pouco mais complexo do que de outros programas feitos em JAVA pois eacute feito segundo estes passos

Editar coacutedigo fonte

Compilar

Preacute-Verificar

Empacotar

Testar eou Instalar

Depois de tudo instalado corretamente devemos primeiramente abrir o Wireless ToolKit e criar um Projeto para isso clique em New Project

Depois em Project Name defina o nome do seu projeto e logo abaixo o nome da classe de sua midlet que deve ser igual ao nome do projeto

11

Tutorial J2ME Copyrightreg - 2005

Feito isso ele teraacute criado vaacuterios diretoacuterios dentro de path_WTKappsSua_Aplicacao para cada aplicaccedilatildeo eacute criado uma aacutervore de diretoacuterios conforme ilustrado abaixo

Em seguida abriraacute uma tela que conteacutem informaccedilotildees sobre a sua aplicaccedilatildeo (aconselho a natildeo mudar o que estaacute laacute) pois eacute por esse arquivo que o celular reconheceraacute seu aplicativo antes de ser baixado se ele eacute apto a rodar ou natildeo seu programa a uacutenica

coisa que poderias mudar seria o Vendor Name o qual vocecirc pode colocar o nome de sua empresa ou o que desejares Se vocecircs verificarem a uacuteltima aba desta tela (aba MIDlets)

tem um link para uma figura png que eacute o icone que apareceraacute no celular de sua aplicaccedilatildeo vocecirc pode modificaacute-lo colocando o nome de uma figura personalizada apenas

lembre-se que a figura deve ficar no devido diretoacuterio (path_WTKappsSua_Aplicacaores) e sempre para qualquer aplicaccedilatildeo deve-se por dentro do diretoacuterio res

12

Tutorial J2ME Copyrightreg - 2005

Existem dois bototildees que seratildeo muito utilizados por nos BUILD e RUN os quais satildeo auto-explicativos

Apoacutes a criaccedilatildeo do projeto estamos aptos e finalmente a criar nossos coacutedigos

Obfuscator Como vimos dispositivos celulares possuem memoacuteria muito reduzida e quanto

menor sua aplicaccedilatildeo for melhor seraacute para o celular Para isso usamos o Obfuscator que eacute usado para diminuir o tamanho dos arquivos eliminando redundacircncia e tambeacutem para evitar engenharia reversa

Este programa renomeia classes variaacuteveis e meacutetodos para nomes mais compactos removem classes meacutetodos natildeo usados e ainda inserem dados ilegais ou questionaacuteveis para confundir Descompiladores

Para criar um pacote obfuscado vocecirc precisa de algum programa Obfuscator um bom programa o Retroguard pode ser encontrado em wwwretrologiccom depois de baixado vocecirc deve copiar o arquivo retroguardjar dentro do diretoacuterio bin do wirelessToolkit (Ex cWTK104bin)

Tome um pouco de cuidado com os obfuscators pois em alguns celulares a sua aplicaccedilatildeo pode acabar natildeo funcionando

13

Tutorial J2ME Copyrightreg - 2005

- Ciclo de Vida de uma MIDlet

O Aplication Manager (AM) de cada dispositivo eacute quem vai controlar os aplicativos a serem instalados onde e como seratildeo armazenados e como seratildeo executados As classes de cada aplicativo estatildeo em um arquivo JAR o qual vem acompanhado de um descritor JAD que teraacute todas as informaccedilotildees as quais jaacute vimos anteriormente

Assim que a MIDlet eacute invocada o AM invoca o meacutetodo startApp() o qual coloca a midlet no estado Active Enquanto ela estiver executando o AM pode pausar ela invocando o meacutetodo pauseApp() no caso de uma chamada sendo recebida ou SMS chegando A aplicaccedilatildeo pode pausar a si mesma bastando invocar notifyPaused() Assim como a AM pode pausar a aplicaccedilatildeo e esta a si mesma ocorre o mesmo com o DestroyApp() que eacute invocado pela AM para fechar a aplicaccedilatildeo ou ateacute mesmo pode ser fechada atraveacutes da proacutepria aplicaccedilatildeo invocando o notifyDestroyed()

- Interface

As MIDlets devem poder ser executadas em qualquer dispositivo contendo a VM sem alteraccedilotildees poreacutem isso torna-se bastante difiacutecil na parte de Interface com usuaacuterio pois dispositivos variam de tamanho de tela cores teclados touch-Screens e outros aspectos

As aplicaccedilotildees satildeo desenvolvidas com uma certa abstraccedilatildeo de tela pois os comandos e insersatildeo de dados satildeo feitos atraveacutes dos bototildees do celular e isto natildeo eacute sabido previamente As aplicaccedilotildees descobrem isto em Runtime e se comportam de maneira apropriada a cada celular Jaacute no desenvolvimento de jogos a aplicaccedilatildeo eacute bem mais especiacutefica pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos como disposiccedilatildeo em tela por exemplo

A tela do dispositivo eacute representada por uma instacircncia da classe Display a qual eacute obtida pelo meacutetodo getDisplay() geralmente contida no meacutetodo startApp() pois o meacutetodo getDisplay() somente fica disponiacutevel apoacutes o inicio da Aplicaccedilatildeo (startApp()) Nessa instancia de Display satildeo inseridos heranccedilas de Displayable

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 5: Tutorial J2ME

5

Tutorial J2ME Copyrightreg - 2005

- Entendendo J2ME

J2ME basicamente eacute dividido em configurations profiles e APIs opcionais

- Configuration

A configuration mais baacutesica do J2ME eacute o CLDC (Connected Limited Device Configuration) e tambeacutem a mais importante pois ela da base para a outra configuration CDC (Connected Limited Configuration) a qual prove algumas funcionalidades a mais e requer um pouco mais de hardware

Mas o que vem a ser essa tal de configuration Bom ela basicamente provecirc algumas bibliotecas baacutesicas e a VM (virtual machine) ou seja a parte mais basica que necessita estar presente em todo e qualquer dispositivo que suporta essa tecnologia

- Profiles

Um profile nada mais eacute que uma seacuterie de API s padrotildees que combinadas com alguma configuration no nosso caso o CLDC prove um serviccedilo completo para que aplicaccedilotildees possam ser rodadas

E a profile que noacutes iremos trabalhar eacute a MIDP

Celulares em sua quase totalidade hoje no mercado trabalha com o MIDP10 e CLDC10

Para entendermos melhor pensemos da seguinte maneira Profiles satildeo mais especiacuteficos que configurations e fazendo analogia a um velho exemplo temos uma

6

Tutorial J2ME Copyrightreg - 2005

abstraccedilatildeo sobre o que eacute um carro e como ele eacute fabricado (configuration) e como um Ford eacute fabricado (profile) mais tecnicamente falando profile eacute baseado em configuration e ainda acima dos profiles estatildeo as APIs que na nossa analogia seria um modelo especiacutefico da Ford

Como jaacute foi citado existem dois configurations um configuration eacute o CLDC (Connected Limited Device Configuration) que rege as configuraccedilotildees para aparelhos bem pequenos como celulares ou PDAs o qual fica acima das diretrizes J2ME juntamente com CDC (Connected Device Configuration) o que rege as configuraccedilotildees para aparelhos um pouco maiores mas mesmo assim pequenos

Podem haver vaacuterios Profiles vamos citar dois aqui os quais satildeo os mais importantes para este estudo MIDP (Mobile Information Device Profile) e tambeacutem o PDAP (Personal Digital Assistant Profile) e ambos estatildeo acima do CLDC

CLDC como jaacute vimos rege as configuraccedilotildees para aparelhos extremamente pequenos ele foi desenvolvido para dispositivos de no miacutenimo 160KB e algumas dezenas de MHz de processamento Vocecirc natildeo leu errado e nem noacutes trocamos unidades de medidas a memoacuteria estaacute realmente certa o que nos faz pensar muito em termos de aplicaccedilotildees que podem rodar neles e nos traz de volta a certas programaccedilotildees para DOS no que diz respeito agrave memoacuteria E falando em memoacuteria relevemos tambeacutem o processamento que eacute muito fraco mas muito mesmo pois no miacutenimo 16MHz satildeo requeridos e se tratando de aparelhos tops de linha podem chegar ateacute 300MHz ou um pouco mais (ateacute a composiccedilatildeo desta mateacuteria) poreacutem eacute muito difiacutecil dizer ao certo pois o acesso a informaccedilotildees desse tipo nas especificaccedilotildees dos fabricantes eacute bem restrito embora jaacute nos faz analisar melhor coacutedigos e meacutetodos usados os quais despedem de muito processamento e uso de memoacuteria E tambeacutem a conexatildeo lenta tipicamente de

7

Tutorial J2ME Copyrightreg - 2005

9600bps para aparelhos TDMACDMA e de 128Kbps para GPRSCDMA 1xRTT MIDP tem as seguintes caracteriacutesticas - Miacutenimo de 160kB de memoacuteria natildeo-volaacutetil para JAVA - Um processador de 16 bits ou 32 bits com um clock de no miacutenimo 16MHz - 32KB de memoacuteria volaacutetil para tempo de execuccedilatildeo - Pelo menos 192KB livres para Java - 8KB de memoacuteria natildeo-volaacutetil de para armazenamento de dados - Uma tela de pelo menos 96x54 pixels (aqui jaacute cai por terra a propaganda de

muitos celulares os quais dizem ter uma tela ampla de 96x54 o que eacute o miacutenimo necessaacuterio)

- Capacidade de entrada de dados seja por teclado (do celular) teclado externo ou mesmo Touch-screen

- Possibilidade de enviar e receber dados em conexatildeo possivelmente intermitente e banda reduzida

- Seguranccedila

Uma pergunta frequumlentemente feita eacute Agora com programas rodando nos celulares natildeo iremos ter problemas de viacuterus ou programas maliciosos Por meio do J2ME muito difiacutecil poreacutem ja temos visto celulares sendo atacados por viacuterus que exploram falhas do Sistema operacional e natildeo de uma aplicaccedilatildeo J2ME

No caso dos jogos de celulares cada fabricante disponibiliza uma API especiacutefica para os jogos podendo assim aproveitar melhor o desempenho do aparelho poreacutem cai por terra a forte caracteriacutestica de vida do JAVA a (WORA) Write Once Run Anywhere apesar de ser mais seguro perde-se um pouco a funcionalidade

A maquina virtual tem um espaccedilo independente de memoacuteria (sand-box) e natildeo pode acessar a memoacuteria correspondente agraves aplicaccedilotildees nativas do celular assim como eacute feito com os Applets um pouco diferente do J2SE

8

Tutorial J2ME Copyrightreg - 2005

Nota dos Autores Pouco tempo antes da revisatildeo dessa segunda versatildeo da apostila surgiu o primeiro viacuterus para celulares para uma seacuterie especiacutefica da Nokia aquela que usa SymbianOS O viacuterus embora seja chamado de viacuterus se encaixa mais na qualidade de WORM pois se propaga sozinho atraveacutes da interface de Bluetooth do celular poreacutem este worm natildeo faz nada no celular natildeo danifica nada apenas tenta se propagar para outros celulares Um malefiacutecio provocado eacute gastar bateria do celular pois fica com a interface de Bluetooth ligada e procurando algueacutem que responda para se retransmitir

- Tecnologias Wireless

Muitas pessoas ainda tecircm duacutevidas sobre as diferentes tecnologias de celulares existentes Vamos tentar defini-las e diferencia-las em poucas palavras sendo que este natildeo eacute o enfoque principal deste Tutorial

- TDMA (time division multiple access ou acesso muacuteltiplo por divisatildeo do tempo) ou seja ele natildeo diferencia voz e dados entatildeo para navegar na internet(dados) vocecirc paga o mesmo preccedilo que pagaria por fazer uma ligaccedilatildeo de voz Quem tem algum celular tdma sabe o quatildeo caro e lento eacute isso Somente para estabelecer a conexatildeo leva-se uns 8 segundos e a transferecircncia de dados daacute-se a 9600bps(conseguindo-se taxa maacutexima)

- CDMA (code division multiple access ou acesso muacuteltiplo por divisatildeo de coacutedigos) ou seja eacute separado voz de dados e tanto esta tecnologia quando a GSM satildeo conexatildeo 100 ativa ou seja natildeo existe este delay de conexatildeo vocecirc requisita uma informaccedilatildeo e ela vem diretamente Aleacutem de a taxa de transferecircncia que eacute maior chegando a 256Kbps usando CDMA 1xRTT que eacute o que esta em vigor

- GSM (global system for communication ou sistema global de comunicaccedilatildeo) ou seja tem as mesmas caracteriacutesticas da tecnologia CDMA poreacutem opera usando GPRS

Como foi falado acima as conexotildees eram para ser 100 ativas ou seja on-line todo tempo poreacutem pelo provado pelo uso hoje dessas tecnologias vemos que ele precisa de uma primeira conexatildeo o que tambeacutem despende alguns segundos para somente depois poder transmitir

Caso haja maior interesse nas tecnologias de transmissatildeo e na evoluccedilatildeo e tudo mais que diz respeito recomendo estes sites httpwwwsitcombrSeparataTELCO50htm

e httpidgnowterracombridgnowtelecom2002090043 ainda em wwwgsmworldnet

9

Tutorial J2ME Copyrightreg - 2005

- Diferenccedila entre MIDP 10 e 20

Existem algumas diferenccedilas entre as versotildees como todos sabemos a cada versatildeo mais nova eacute sempre incrementado mais funccedilotildees Aleacutem desses meacutetodos a mais e algumas facilidades maiores da 20 como classes para jogos e tratamento de sons temos a diferenccedila na comunicaccedilatildeo de dados que eacute o mais interessante aqui como por exemplo as conexotildees no CLDC10 satildeo feitas atraveacutes do protocolo http que no caso eacute inseguro no envio de informaccedilotildees jaacute na 10 estaacute implementado o https (ssl) conexatildeo com criptografia que jaacute eacute conhecida de todos

Aqui listamos os Packages disponiacuteveis para as versotildees

javalang

javalangref (somente CLDC11)

javaio

javautil

javaxmicroeditionio

javaxmicroeditionlcdui

javaxmicroeditionlcduigame (somente na 20)

javaxmicroeditionmedia (somente na 20)

javaxmicroeditionmediacontrol (somente na 20)

javaxmicroeditionmidlet

javaxmicroeditionrms

javaxmicroeditionpki (somente na 20)

Opcionalmente fabricantes podem fornecer APIs JAVA para acesso a partes especificas de cada aparelho

Com relaccedilatildeo agrave seguranccedila o CLDC11 traz bastante recursos e jaacute se aproxima mais do J2SE com Permissions Types Protection Domains baseados em IPs e PKIs

- APIs

A CLDC 10 natildeo possui suporte a ponto flutuante ou seja se desejas trabalhar com contas e valores reais teraacutes que manuseaacute-los em coacutedigo mesmo A versatildeo 11 do CLDC jaacute possui suporte a ponto flutuante poreacutem mesmo com a versatildeo 10 vocecirc pode baixar programas especiacuteficos pra isso como esse programa encontrado em httphomerochesterrrcomohommesMathFP

Vocecirc tem ainda outras restriccedilotildees como

Sem user classLoading

Sem finalizaccedilatildeo de objetos (finallize() de javalangObject)

Garbage collector existe poreacutem natildeo executa meacutetodo automaacutetico

Sem RMI e sem JINI

Sem meacutetodos nativos a natildeo ser os fornecidos pela JVM nativa

MultiThreading (sem interrupt() pause() resume() e stop())

Sem thread groups e thread Deamons

- Criando projetos Compilando e Executando

10

Tutorial J2ME Copyrightreg - 2005

Bom depois de muita teoria a qual nos deu um embasamento melhor para sabermos o que estamos fazendo vamos a uma parte mais praacutetica e a mais esperada por todos

O processo de desenvolvimento de MIDlets eacute um pouco mais complexo do que de outros programas feitos em JAVA pois eacute feito segundo estes passos

Editar coacutedigo fonte

Compilar

Preacute-Verificar

Empacotar

Testar eou Instalar

Depois de tudo instalado corretamente devemos primeiramente abrir o Wireless ToolKit e criar um Projeto para isso clique em New Project

Depois em Project Name defina o nome do seu projeto e logo abaixo o nome da classe de sua midlet que deve ser igual ao nome do projeto

11

Tutorial J2ME Copyrightreg - 2005

Feito isso ele teraacute criado vaacuterios diretoacuterios dentro de path_WTKappsSua_Aplicacao para cada aplicaccedilatildeo eacute criado uma aacutervore de diretoacuterios conforme ilustrado abaixo

Em seguida abriraacute uma tela que conteacutem informaccedilotildees sobre a sua aplicaccedilatildeo (aconselho a natildeo mudar o que estaacute laacute) pois eacute por esse arquivo que o celular reconheceraacute seu aplicativo antes de ser baixado se ele eacute apto a rodar ou natildeo seu programa a uacutenica

coisa que poderias mudar seria o Vendor Name o qual vocecirc pode colocar o nome de sua empresa ou o que desejares Se vocecircs verificarem a uacuteltima aba desta tela (aba MIDlets)

tem um link para uma figura png que eacute o icone que apareceraacute no celular de sua aplicaccedilatildeo vocecirc pode modificaacute-lo colocando o nome de uma figura personalizada apenas

lembre-se que a figura deve ficar no devido diretoacuterio (path_WTKappsSua_Aplicacaores) e sempre para qualquer aplicaccedilatildeo deve-se por dentro do diretoacuterio res

12

Tutorial J2ME Copyrightreg - 2005

Existem dois bototildees que seratildeo muito utilizados por nos BUILD e RUN os quais satildeo auto-explicativos

Apoacutes a criaccedilatildeo do projeto estamos aptos e finalmente a criar nossos coacutedigos

Obfuscator Como vimos dispositivos celulares possuem memoacuteria muito reduzida e quanto

menor sua aplicaccedilatildeo for melhor seraacute para o celular Para isso usamos o Obfuscator que eacute usado para diminuir o tamanho dos arquivos eliminando redundacircncia e tambeacutem para evitar engenharia reversa

Este programa renomeia classes variaacuteveis e meacutetodos para nomes mais compactos removem classes meacutetodos natildeo usados e ainda inserem dados ilegais ou questionaacuteveis para confundir Descompiladores

Para criar um pacote obfuscado vocecirc precisa de algum programa Obfuscator um bom programa o Retroguard pode ser encontrado em wwwretrologiccom depois de baixado vocecirc deve copiar o arquivo retroguardjar dentro do diretoacuterio bin do wirelessToolkit (Ex cWTK104bin)

Tome um pouco de cuidado com os obfuscators pois em alguns celulares a sua aplicaccedilatildeo pode acabar natildeo funcionando

13

Tutorial J2ME Copyrightreg - 2005

- Ciclo de Vida de uma MIDlet

O Aplication Manager (AM) de cada dispositivo eacute quem vai controlar os aplicativos a serem instalados onde e como seratildeo armazenados e como seratildeo executados As classes de cada aplicativo estatildeo em um arquivo JAR o qual vem acompanhado de um descritor JAD que teraacute todas as informaccedilotildees as quais jaacute vimos anteriormente

Assim que a MIDlet eacute invocada o AM invoca o meacutetodo startApp() o qual coloca a midlet no estado Active Enquanto ela estiver executando o AM pode pausar ela invocando o meacutetodo pauseApp() no caso de uma chamada sendo recebida ou SMS chegando A aplicaccedilatildeo pode pausar a si mesma bastando invocar notifyPaused() Assim como a AM pode pausar a aplicaccedilatildeo e esta a si mesma ocorre o mesmo com o DestroyApp() que eacute invocado pela AM para fechar a aplicaccedilatildeo ou ateacute mesmo pode ser fechada atraveacutes da proacutepria aplicaccedilatildeo invocando o notifyDestroyed()

- Interface

As MIDlets devem poder ser executadas em qualquer dispositivo contendo a VM sem alteraccedilotildees poreacutem isso torna-se bastante difiacutecil na parte de Interface com usuaacuterio pois dispositivos variam de tamanho de tela cores teclados touch-Screens e outros aspectos

As aplicaccedilotildees satildeo desenvolvidas com uma certa abstraccedilatildeo de tela pois os comandos e insersatildeo de dados satildeo feitos atraveacutes dos bototildees do celular e isto natildeo eacute sabido previamente As aplicaccedilotildees descobrem isto em Runtime e se comportam de maneira apropriada a cada celular Jaacute no desenvolvimento de jogos a aplicaccedilatildeo eacute bem mais especiacutefica pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos como disposiccedilatildeo em tela por exemplo

A tela do dispositivo eacute representada por uma instacircncia da classe Display a qual eacute obtida pelo meacutetodo getDisplay() geralmente contida no meacutetodo startApp() pois o meacutetodo getDisplay() somente fica disponiacutevel apoacutes o inicio da Aplicaccedilatildeo (startApp()) Nessa instancia de Display satildeo inseridos heranccedilas de Displayable

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 6: Tutorial J2ME

6

Tutorial J2ME Copyrightreg - 2005

abstraccedilatildeo sobre o que eacute um carro e como ele eacute fabricado (configuration) e como um Ford eacute fabricado (profile) mais tecnicamente falando profile eacute baseado em configuration e ainda acima dos profiles estatildeo as APIs que na nossa analogia seria um modelo especiacutefico da Ford

Como jaacute foi citado existem dois configurations um configuration eacute o CLDC (Connected Limited Device Configuration) que rege as configuraccedilotildees para aparelhos bem pequenos como celulares ou PDAs o qual fica acima das diretrizes J2ME juntamente com CDC (Connected Device Configuration) o que rege as configuraccedilotildees para aparelhos um pouco maiores mas mesmo assim pequenos

Podem haver vaacuterios Profiles vamos citar dois aqui os quais satildeo os mais importantes para este estudo MIDP (Mobile Information Device Profile) e tambeacutem o PDAP (Personal Digital Assistant Profile) e ambos estatildeo acima do CLDC

CLDC como jaacute vimos rege as configuraccedilotildees para aparelhos extremamente pequenos ele foi desenvolvido para dispositivos de no miacutenimo 160KB e algumas dezenas de MHz de processamento Vocecirc natildeo leu errado e nem noacutes trocamos unidades de medidas a memoacuteria estaacute realmente certa o que nos faz pensar muito em termos de aplicaccedilotildees que podem rodar neles e nos traz de volta a certas programaccedilotildees para DOS no que diz respeito agrave memoacuteria E falando em memoacuteria relevemos tambeacutem o processamento que eacute muito fraco mas muito mesmo pois no miacutenimo 16MHz satildeo requeridos e se tratando de aparelhos tops de linha podem chegar ateacute 300MHz ou um pouco mais (ateacute a composiccedilatildeo desta mateacuteria) poreacutem eacute muito difiacutecil dizer ao certo pois o acesso a informaccedilotildees desse tipo nas especificaccedilotildees dos fabricantes eacute bem restrito embora jaacute nos faz analisar melhor coacutedigos e meacutetodos usados os quais despedem de muito processamento e uso de memoacuteria E tambeacutem a conexatildeo lenta tipicamente de

7

Tutorial J2ME Copyrightreg - 2005

9600bps para aparelhos TDMACDMA e de 128Kbps para GPRSCDMA 1xRTT MIDP tem as seguintes caracteriacutesticas - Miacutenimo de 160kB de memoacuteria natildeo-volaacutetil para JAVA - Um processador de 16 bits ou 32 bits com um clock de no miacutenimo 16MHz - 32KB de memoacuteria volaacutetil para tempo de execuccedilatildeo - Pelo menos 192KB livres para Java - 8KB de memoacuteria natildeo-volaacutetil de para armazenamento de dados - Uma tela de pelo menos 96x54 pixels (aqui jaacute cai por terra a propaganda de

muitos celulares os quais dizem ter uma tela ampla de 96x54 o que eacute o miacutenimo necessaacuterio)

- Capacidade de entrada de dados seja por teclado (do celular) teclado externo ou mesmo Touch-screen

- Possibilidade de enviar e receber dados em conexatildeo possivelmente intermitente e banda reduzida

- Seguranccedila

Uma pergunta frequumlentemente feita eacute Agora com programas rodando nos celulares natildeo iremos ter problemas de viacuterus ou programas maliciosos Por meio do J2ME muito difiacutecil poreacutem ja temos visto celulares sendo atacados por viacuterus que exploram falhas do Sistema operacional e natildeo de uma aplicaccedilatildeo J2ME

No caso dos jogos de celulares cada fabricante disponibiliza uma API especiacutefica para os jogos podendo assim aproveitar melhor o desempenho do aparelho poreacutem cai por terra a forte caracteriacutestica de vida do JAVA a (WORA) Write Once Run Anywhere apesar de ser mais seguro perde-se um pouco a funcionalidade

A maquina virtual tem um espaccedilo independente de memoacuteria (sand-box) e natildeo pode acessar a memoacuteria correspondente agraves aplicaccedilotildees nativas do celular assim como eacute feito com os Applets um pouco diferente do J2SE

8

Tutorial J2ME Copyrightreg - 2005

Nota dos Autores Pouco tempo antes da revisatildeo dessa segunda versatildeo da apostila surgiu o primeiro viacuterus para celulares para uma seacuterie especiacutefica da Nokia aquela que usa SymbianOS O viacuterus embora seja chamado de viacuterus se encaixa mais na qualidade de WORM pois se propaga sozinho atraveacutes da interface de Bluetooth do celular poreacutem este worm natildeo faz nada no celular natildeo danifica nada apenas tenta se propagar para outros celulares Um malefiacutecio provocado eacute gastar bateria do celular pois fica com a interface de Bluetooth ligada e procurando algueacutem que responda para se retransmitir

- Tecnologias Wireless

Muitas pessoas ainda tecircm duacutevidas sobre as diferentes tecnologias de celulares existentes Vamos tentar defini-las e diferencia-las em poucas palavras sendo que este natildeo eacute o enfoque principal deste Tutorial

- TDMA (time division multiple access ou acesso muacuteltiplo por divisatildeo do tempo) ou seja ele natildeo diferencia voz e dados entatildeo para navegar na internet(dados) vocecirc paga o mesmo preccedilo que pagaria por fazer uma ligaccedilatildeo de voz Quem tem algum celular tdma sabe o quatildeo caro e lento eacute isso Somente para estabelecer a conexatildeo leva-se uns 8 segundos e a transferecircncia de dados daacute-se a 9600bps(conseguindo-se taxa maacutexima)

- CDMA (code division multiple access ou acesso muacuteltiplo por divisatildeo de coacutedigos) ou seja eacute separado voz de dados e tanto esta tecnologia quando a GSM satildeo conexatildeo 100 ativa ou seja natildeo existe este delay de conexatildeo vocecirc requisita uma informaccedilatildeo e ela vem diretamente Aleacutem de a taxa de transferecircncia que eacute maior chegando a 256Kbps usando CDMA 1xRTT que eacute o que esta em vigor

- GSM (global system for communication ou sistema global de comunicaccedilatildeo) ou seja tem as mesmas caracteriacutesticas da tecnologia CDMA poreacutem opera usando GPRS

Como foi falado acima as conexotildees eram para ser 100 ativas ou seja on-line todo tempo poreacutem pelo provado pelo uso hoje dessas tecnologias vemos que ele precisa de uma primeira conexatildeo o que tambeacutem despende alguns segundos para somente depois poder transmitir

Caso haja maior interesse nas tecnologias de transmissatildeo e na evoluccedilatildeo e tudo mais que diz respeito recomendo estes sites httpwwwsitcombrSeparataTELCO50htm

e httpidgnowterracombridgnowtelecom2002090043 ainda em wwwgsmworldnet

9

Tutorial J2ME Copyrightreg - 2005

- Diferenccedila entre MIDP 10 e 20

Existem algumas diferenccedilas entre as versotildees como todos sabemos a cada versatildeo mais nova eacute sempre incrementado mais funccedilotildees Aleacutem desses meacutetodos a mais e algumas facilidades maiores da 20 como classes para jogos e tratamento de sons temos a diferenccedila na comunicaccedilatildeo de dados que eacute o mais interessante aqui como por exemplo as conexotildees no CLDC10 satildeo feitas atraveacutes do protocolo http que no caso eacute inseguro no envio de informaccedilotildees jaacute na 10 estaacute implementado o https (ssl) conexatildeo com criptografia que jaacute eacute conhecida de todos

Aqui listamos os Packages disponiacuteveis para as versotildees

javalang

javalangref (somente CLDC11)

javaio

javautil

javaxmicroeditionio

javaxmicroeditionlcdui

javaxmicroeditionlcduigame (somente na 20)

javaxmicroeditionmedia (somente na 20)

javaxmicroeditionmediacontrol (somente na 20)

javaxmicroeditionmidlet

javaxmicroeditionrms

javaxmicroeditionpki (somente na 20)

Opcionalmente fabricantes podem fornecer APIs JAVA para acesso a partes especificas de cada aparelho

Com relaccedilatildeo agrave seguranccedila o CLDC11 traz bastante recursos e jaacute se aproxima mais do J2SE com Permissions Types Protection Domains baseados em IPs e PKIs

- APIs

A CLDC 10 natildeo possui suporte a ponto flutuante ou seja se desejas trabalhar com contas e valores reais teraacutes que manuseaacute-los em coacutedigo mesmo A versatildeo 11 do CLDC jaacute possui suporte a ponto flutuante poreacutem mesmo com a versatildeo 10 vocecirc pode baixar programas especiacuteficos pra isso como esse programa encontrado em httphomerochesterrrcomohommesMathFP

Vocecirc tem ainda outras restriccedilotildees como

Sem user classLoading

Sem finalizaccedilatildeo de objetos (finallize() de javalangObject)

Garbage collector existe poreacutem natildeo executa meacutetodo automaacutetico

Sem RMI e sem JINI

Sem meacutetodos nativos a natildeo ser os fornecidos pela JVM nativa

MultiThreading (sem interrupt() pause() resume() e stop())

Sem thread groups e thread Deamons

- Criando projetos Compilando e Executando

10

Tutorial J2ME Copyrightreg - 2005

Bom depois de muita teoria a qual nos deu um embasamento melhor para sabermos o que estamos fazendo vamos a uma parte mais praacutetica e a mais esperada por todos

O processo de desenvolvimento de MIDlets eacute um pouco mais complexo do que de outros programas feitos em JAVA pois eacute feito segundo estes passos

Editar coacutedigo fonte

Compilar

Preacute-Verificar

Empacotar

Testar eou Instalar

Depois de tudo instalado corretamente devemos primeiramente abrir o Wireless ToolKit e criar um Projeto para isso clique em New Project

Depois em Project Name defina o nome do seu projeto e logo abaixo o nome da classe de sua midlet que deve ser igual ao nome do projeto

11

Tutorial J2ME Copyrightreg - 2005

Feito isso ele teraacute criado vaacuterios diretoacuterios dentro de path_WTKappsSua_Aplicacao para cada aplicaccedilatildeo eacute criado uma aacutervore de diretoacuterios conforme ilustrado abaixo

Em seguida abriraacute uma tela que conteacutem informaccedilotildees sobre a sua aplicaccedilatildeo (aconselho a natildeo mudar o que estaacute laacute) pois eacute por esse arquivo que o celular reconheceraacute seu aplicativo antes de ser baixado se ele eacute apto a rodar ou natildeo seu programa a uacutenica

coisa que poderias mudar seria o Vendor Name o qual vocecirc pode colocar o nome de sua empresa ou o que desejares Se vocecircs verificarem a uacuteltima aba desta tela (aba MIDlets)

tem um link para uma figura png que eacute o icone que apareceraacute no celular de sua aplicaccedilatildeo vocecirc pode modificaacute-lo colocando o nome de uma figura personalizada apenas

lembre-se que a figura deve ficar no devido diretoacuterio (path_WTKappsSua_Aplicacaores) e sempre para qualquer aplicaccedilatildeo deve-se por dentro do diretoacuterio res

12

Tutorial J2ME Copyrightreg - 2005

Existem dois bototildees que seratildeo muito utilizados por nos BUILD e RUN os quais satildeo auto-explicativos

Apoacutes a criaccedilatildeo do projeto estamos aptos e finalmente a criar nossos coacutedigos

Obfuscator Como vimos dispositivos celulares possuem memoacuteria muito reduzida e quanto

menor sua aplicaccedilatildeo for melhor seraacute para o celular Para isso usamos o Obfuscator que eacute usado para diminuir o tamanho dos arquivos eliminando redundacircncia e tambeacutem para evitar engenharia reversa

Este programa renomeia classes variaacuteveis e meacutetodos para nomes mais compactos removem classes meacutetodos natildeo usados e ainda inserem dados ilegais ou questionaacuteveis para confundir Descompiladores

Para criar um pacote obfuscado vocecirc precisa de algum programa Obfuscator um bom programa o Retroguard pode ser encontrado em wwwretrologiccom depois de baixado vocecirc deve copiar o arquivo retroguardjar dentro do diretoacuterio bin do wirelessToolkit (Ex cWTK104bin)

Tome um pouco de cuidado com os obfuscators pois em alguns celulares a sua aplicaccedilatildeo pode acabar natildeo funcionando

13

Tutorial J2ME Copyrightreg - 2005

- Ciclo de Vida de uma MIDlet

O Aplication Manager (AM) de cada dispositivo eacute quem vai controlar os aplicativos a serem instalados onde e como seratildeo armazenados e como seratildeo executados As classes de cada aplicativo estatildeo em um arquivo JAR o qual vem acompanhado de um descritor JAD que teraacute todas as informaccedilotildees as quais jaacute vimos anteriormente

Assim que a MIDlet eacute invocada o AM invoca o meacutetodo startApp() o qual coloca a midlet no estado Active Enquanto ela estiver executando o AM pode pausar ela invocando o meacutetodo pauseApp() no caso de uma chamada sendo recebida ou SMS chegando A aplicaccedilatildeo pode pausar a si mesma bastando invocar notifyPaused() Assim como a AM pode pausar a aplicaccedilatildeo e esta a si mesma ocorre o mesmo com o DestroyApp() que eacute invocado pela AM para fechar a aplicaccedilatildeo ou ateacute mesmo pode ser fechada atraveacutes da proacutepria aplicaccedilatildeo invocando o notifyDestroyed()

- Interface

As MIDlets devem poder ser executadas em qualquer dispositivo contendo a VM sem alteraccedilotildees poreacutem isso torna-se bastante difiacutecil na parte de Interface com usuaacuterio pois dispositivos variam de tamanho de tela cores teclados touch-Screens e outros aspectos

As aplicaccedilotildees satildeo desenvolvidas com uma certa abstraccedilatildeo de tela pois os comandos e insersatildeo de dados satildeo feitos atraveacutes dos bototildees do celular e isto natildeo eacute sabido previamente As aplicaccedilotildees descobrem isto em Runtime e se comportam de maneira apropriada a cada celular Jaacute no desenvolvimento de jogos a aplicaccedilatildeo eacute bem mais especiacutefica pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos como disposiccedilatildeo em tela por exemplo

A tela do dispositivo eacute representada por uma instacircncia da classe Display a qual eacute obtida pelo meacutetodo getDisplay() geralmente contida no meacutetodo startApp() pois o meacutetodo getDisplay() somente fica disponiacutevel apoacutes o inicio da Aplicaccedilatildeo (startApp()) Nessa instancia de Display satildeo inseridos heranccedilas de Displayable

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 7: Tutorial J2ME

7

Tutorial J2ME Copyrightreg - 2005

9600bps para aparelhos TDMACDMA e de 128Kbps para GPRSCDMA 1xRTT MIDP tem as seguintes caracteriacutesticas - Miacutenimo de 160kB de memoacuteria natildeo-volaacutetil para JAVA - Um processador de 16 bits ou 32 bits com um clock de no miacutenimo 16MHz - 32KB de memoacuteria volaacutetil para tempo de execuccedilatildeo - Pelo menos 192KB livres para Java - 8KB de memoacuteria natildeo-volaacutetil de para armazenamento de dados - Uma tela de pelo menos 96x54 pixels (aqui jaacute cai por terra a propaganda de

muitos celulares os quais dizem ter uma tela ampla de 96x54 o que eacute o miacutenimo necessaacuterio)

- Capacidade de entrada de dados seja por teclado (do celular) teclado externo ou mesmo Touch-screen

- Possibilidade de enviar e receber dados em conexatildeo possivelmente intermitente e banda reduzida

- Seguranccedila

Uma pergunta frequumlentemente feita eacute Agora com programas rodando nos celulares natildeo iremos ter problemas de viacuterus ou programas maliciosos Por meio do J2ME muito difiacutecil poreacutem ja temos visto celulares sendo atacados por viacuterus que exploram falhas do Sistema operacional e natildeo de uma aplicaccedilatildeo J2ME

No caso dos jogos de celulares cada fabricante disponibiliza uma API especiacutefica para os jogos podendo assim aproveitar melhor o desempenho do aparelho poreacutem cai por terra a forte caracteriacutestica de vida do JAVA a (WORA) Write Once Run Anywhere apesar de ser mais seguro perde-se um pouco a funcionalidade

A maquina virtual tem um espaccedilo independente de memoacuteria (sand-box) e natildeo pode acessar a memoacuteria correspondente agraves aplicaccedilotildees nativas do celular assim como eacute feito com os Applets um pouco diferente do J2SE

8

Tutorial J2ME Copyrightreg - 2005

Nota dos Autores Pouco tempo antes da revisatildeo dessa segunda versatildeo da apostila surgiu o primeiro viacuterus para celulares para uma seacuterie especiacutefica da Nokia aquela que usa SymbianOS O viacuterus embora seja chamado de viacuterus se encaixa mais na qualidade de WORM pois se propaga sozinho atraveacutes da interface de Bluetooth do celular poreacutem este worm natildeo faz nada no celular natildeo danifica nada apenas tenta se propagar para outros celulares Um malefiacutecio provocado eacute gastar bateria do celular pois fica com a interface de Bluetooth ligada e procurando algueacutem que responda para se retransmitir

- Tecnologias Wireless

Muitas pessoas ainda tecircm duacutevidas sobre as diferentes tecnologias de celulares existentes Vamos tentar defini-las e diferencia-las em poucas palavras sendo que este natildeo eacute o enfoque principal deste Tutorial

- TDMA (time division multiple access ou acesso muacuteltiplo por divisatildeo do tempo) ou seja ele natildeo diferencia voz e dados entatildeo para navegar na internet(dados) vocecirc paga o mesmo preccedilo que pagaria por fazer uma ligaccedilatildeo de voz Quem tem algum celular tdma sabe o quatildeo caro e lento eacute isso Somente para estabelecer a conexatildeo leva-se uns 8 segundos e a transferecircncia de dados daacute-se a 9600bps(conseguindo-se taxa maacutexima)

- CDMA (code division multiple access ou acesso muacuteltiplo por divisatildeo de coacutedigos) ou seja eacute separado voz de dados e tanto esta tecnologia quando a GSM satildeo conexatildeo 100 ativa ou seja natildeo existe este delay de conexatildeo vocecirc requisita uma informaccedilatildeo e ela vem diretamente Aleacutem de a taxa de transferecircncia que eacute maior chegando a 256Kbps usando CDMA 1xRTT que eacute o que esta em vigor

- GSM (global system for communication ou sistema global de comunicaccedilatildeo) ou seja tem as mesmas caracteriacutesticas da tecnologia CDMA poreacutem opera usando GPRS

Como foi falado acima as conexotildees eram para ser 100 ativas ou seja on-line todo tempo poreacutem pelo provado pelo uso hoje dessas tecnologias vemos que ele precisa de uma primeira conexatildeo o que tambeacutem despende alguns segundos para somente depois poder transmitir

Caso haja maior interesse nas tecnologias de transmissatildeo e na evoluccedilatildeo e tudo mais que diz respeito recomendo estes sites httpwwwsitcombrSeparataTELCO50htm

e httpidgnowterracombridgnowtelecom2002090043 ainda em wwwgsmworldnet

9

Tutorial J2ME Copyrightreg - 2005

- Diferenccedila entre MIDP 10 e 20

Existem algumas diferenccedilas entre as versotildees como todos sabemos a cada versatildeo mais nova eacute sempre incrementado mais funccedilotildees Aleacutem desses meacutetodos a mais e algumas facilidades maiores da 20 como classes para jogos e tratamento de sons temos a diferenccedila na comunicaccedilatildeo de dados que eacute o mais interessante aqui como por exemplo as conexotildees no CLDC10 satildeo feitas atraveacutes do protocolo http que no caso eacute inseguro no envio de informaccedilotildees jaacute na 10 estaacute implementado o https (ssl) conexatildeo com criptografia que jaacute eacute conhecida de todos

Aqui listamos os Packages disponiacuteveis para as versotildees

javalang

javalangref (somente CLDC11)

javaio

javautil

javaxmicroeditionio

javaxmicroeditionlcdui

javaxmicroeditionlcduigame (somente na 20)

javaxmicroeditionmedia (somente na 20)

javaxmicroeditionmediacontrol (somente na 20)

javaxmicroeditionmidlet

javaxmicroeditionrms

javaxmicroeditionpki (somente na 20)

Opcionalmente fabricantes podem fornecer APIs JAVA para acesso a partes especificas de cada aparelho

Com relaccedilatildeo agrave seguranccedila o CLDC11 traz bastante recursos e jaacute se aproxima mais do J2SE com Permissions Types Protection Domains baseados em IPs e PKIs

- APIs

A CLDC 10 natildeo possui suporte a ponto flutuante ou seja se desejas trabalhar com contas e valores reais teraacutes que manuseaacute-los em coacutedigo mesmo A versatildeo 11 do CLDC jaacute possui suporte a ponto flutuante poreacutem mesmo com a versatildeo 10 vocecirc pode baixar programas especiacuteficos pra isso como esse programa encontrado em httphomerochesterrrcomohommesMathFP

Vocecirc tem ainda outras restriccedilotildees como

Sem user classLoading

Sem finalizaccedilatildeo de objetos (finallize() de javalangObject)

Garbage collector existe poreacutem natildeo executa meacutetodo automaacutetico

Sem RMI e sem JINI

Sem meacutetodos nativos a natildeo ser os fornecidos pela JVM nativa

MultiThreading (sem interrupt() pause() resume() e stop())

Sem thread groups e thread Deamons

- Criando projetos Compilando e Executando

10

Tutorial J2ME Copyrightreg - 2005

Bom depois de muita teoria a qual nos deu um embasamento melhor para sabermos o que estamos fazendo vamos a uma parte mais praacutetica e a mais esperada por todos

O processo de desenvolvimento de MIDlets eacute um pouco mais complexo do que de outros programas feitos em JAVA pois eacute feito segundo estes passos

Editar coacutedigo fonte

Compilar

Preacute-Verificar

Empacotar

Testar eou Instalar

Depois de tudo instalado corretamente devemos primeiramente abrir o Wireless ToolKit e criar um Projeto para isso clique em New Project

Depois em Project Name defina o nome do seu projeto e logo abaixo o nome da classe de sua midlet que deve ser igual ao nome do projeto

11

Tutorial J2ME Copyrightreg - 2005

Feito isso ele teraacute criado vaacuterios diretoacuterios dentro de path_WTKappsSua_Aplicacao para cada aplicaccedilatildeo eacute criado uma aacutervore de diretoacuterios conforme ilustrado abaixo

Em seguida abriraacute uma tela que conteacutem informaccedilotildees sobre a sua aplicaccedilatildeo (aconselho a natildeo mudar o que estaacute laacute) pois eacute por esse arquivo que o celular reconheceraacute seu aplicativo antes de ser baixado se ele eacute apto a rodar ou natildeo seu programa a uacutenica

coisa que poderias mudar seria o Vendor Name o qual vocecirc pode colocar o nome de sua empresa ou o que desejares Se vocecircs verificarem a uacuteltima aba desta tela (aba MIDlets)

tem um link para uma figura png que eacute o icone que apareceraacute no celular de sua aplicaccedilatildeo vocecirc pode modificaacute-lo colocando o nome de uma figura personalizada apenas

lembre-se que a figura deve ficar no devido diretoacuterio (path_WTKappsSua_Aplicacaores) e sempre para qualquer aplicaccedilatildeo deve-se por dentro do diretoacuterio res

12

Tutorial J2ME Copyrightreg - 2005

Existem dois bototildees que seratildeo muito utilizados por nos BUILD e RUN os quais satildeo auto-explicativos

Apoacutes a criaccedilatildeo do projeto estamos aptos e finalmente a criar nossos coacutedigos

Obfuscator Como vimos dispositivos celulares possuem memoacuteria muito reduzida e quanto

menor sua aplicaccedilatildeo for melhor seraacute para o celular Para isso usamos o Obfuscator que eacute usado para diminuir o tamanho dos arquivos eliminando redundacircncia e tambeacutem para evitar engenharia reversa

Este programa renomeia classes variaacuteveis e meacutetodos para nomes mais compactos removem classes meacutetodos natildeo usados e ainda inserem dados ilegais ou questionaacuteveis para confundir Descompiladores

Para criar um pacote obfuscado vocecirc precisa de algum programa Obfuscator um bom programa o Retroguard pode ser encontrado em wwwretrologiccom depois de baixado vocecirc deve copiar o arquivo retroguardjar dentro do diretoacuterio bin do wirelessToolkit (Ex cWTK104bin)

Tome um pouco de cuidado com os obfuscators pois em alguns celulares a sua aplicaccedilatildeo pode acabar natildeo funcionando

13

Tutorial J2ME Copyrightreg - 2005

- Ciclo de Vida de uma MIDlet

O Aplication Manager (AM) de cada dispositivo eacute quem vai controlar os aplicativos a serem instalados onde e como seratildeo armazenados e como seratildeo executados As classes de cada aplicativo estatildeo em um arquivo JAR o qual vem acompanhado de um descritor JAD que teraacute todas as informaccedilotildees as quais jaacute vimos anteriormente

Assim que a MIDlet eacute invocada o AM invoca o meacutetodo startApp() o qual coloca a midlet no estado Active Enquanto ela estiver executando o AM pode pausar ela invocando o meacutetodo pauseApp() no caso de uma chamada sendo recebida ou SMS chegando A aplicaccedilatildeo pode pausar a si mesma bastando invocar notifyPaused() Assim como a AM pode pausar a aplicaccedilatildeo e esta a si mesma ocorre o mesmo com o DestroyApp() que eacute invocado pela AM para fechar a aplicaccedilatildeo ou ateacute mesmo pode ser fechada atraveacutes da proacutepria aplicaccedilatildeo invocando o notifyDestroyed()

- Interface

As MIDlets devem poder ser executadas em qualquer dispositivo contendo a VM sem alteraccedilotildees poreacutem isso torna-se bastante difiacutecil na parte de Interface com usuaacuterio pois dispositivos variam de tamanho de tela cores teclados touch-Screens e outros aspectos

As aplicaccedilotildees satildeo desenvolvidas com uma certa abstraccedilatildeo de tela pois os comandos e insersatildeo de dados satildeo feitos atraveacutes dos bototildees do celular e isto natildeo eacute sabido previamente As aplicaccedilotildees descobrem isto em Runtime e se comportam de maneira apropriada a cada celular Jaacute no desenvolvimento de jogos a aplicaccedilatildeo eacute bem mais especiacutefica pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos como disposiccedilatildeo em tela por exemplo

A tela do dispositivo eacute representada por uma instacircncia da classe Display a qual eacute obtida pelo meacutetodo getDisplay() geralmente contida no meacutetodo startApp() pois o meacutetodo getDisplay() somente fica disponiacutevel apoacutes o inicio da Aplicaccedilatildeo (startApp()) Nessa instancia de Display satildeo inseridos heranccedilas de Displayable

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 8: Tutorial J2ME

8

Tutorial J2ME Copyrightreg - 2005

Nota dos Autores Pouco tempo antes da revisatildeo dessa segunda versatildeo da apostila surgiu o primeiro viacuterus para celulares para uma seacuterie especiacutefica da Nokia aquela que usa SymbianOS O viacuterus embora seja chamado de viacuterus se encaixa mais na qualidade de WORM pois se propaga sozinho atraveacutes da interface de Bluetooth do celular poreacutem este worm natildeo faz nada no celular natildeo danifica nada apenas tenta se propagar para outros celulares Um malefiacutecio provocado eacute gastar bateria do celular pois fica com a interface de Bluetooth ligada e procurando algueacutem que responda para se retransmitir

- Tecnologias Wireless

Muitas pessoas ainda tecircm duacutevidas sobre as diferentes tecnologias de celulares existentes Vamos tentar defini-las e diferencia-las em poucas palavras sendo que este natildeo eacute o enfoque principal deste Tutorial

- TDMA (time division multiple access ou acesso muacuteltiplo por divisatildeo do tempo) ou seja ele natildeo diferencia voz e dados entatildeo para navegar na internet(dados) vocecirc paga o mesmo preccedilo que pagaria por fazer uma ligaccedilatildeo de voz Quem tem algum celular tdma sabe o quatildeo caro e lento eacute isso Somente para estabelecer a conexatildeo leva-se uns 8 segundos e a transferecircncia de dados daacute-se a 9600bps(conseguindo-se taxa maacutexima)

- CDMA (code division multiple access ou acesso muacuteltiplo por divisatildeo de coacutedigos) ou seja eacute separado voz de dados e tanto esta tecnologia quando a GSM satildeo conexatildeo 100 ativa ou seja natildeo existe este delay de conexatildeo vocecirc requisita uma informaccedilatildeo e ela vem diretamente Aleacutem de a taxa de transferecircncia que eacute maior chegando a 256Kbps usando CDMA 1xRTT que eacute o que esta em vigor

- GSM (global system for communication ou sistema global de comunicaccedilatildeo) ou seja tem as mesmas caracteriacutesticas da tecnologia CDMA poreacutem opera usando GPRS

Como foi falado acima as conexotildees eram para ser 100 ativas ou seja on-line todo tempo poreacutem pelo provado pelo uso hoje dessas tecnologias vemos que ele precisa de uma primeira conexatildeo o que tambeacutem despende alguns segundos para somente depois poder transmitir

Caso haja maior interesse nas tecnologias de transmissatildeo e na evoluccedilatildeo e tudo mais que diz respeito recomendo estes sites httpwwwsitcombrSeparataTELCO50htm

e httpidgnowterracombridgnowtelecom2002090043 ainda em wwwgsmworldnet

9

Tutorial J2ME Copyrightreg - 2005

- Diferenccedila entre MIDP 10 e 20

Existem algumas diferenccedilas entre as versotildees como todos sabemos a cada versatildeo mais nova eacute sempre incrementado mais funccedilotildees Aleacutem desses meacutetodos a mais e algumas facilidades maiores da 20 como classes para jogos e tratamento de sons temos a diferenccedila na comunicaccedilatildeo de dados que eacute o mais interessante aqui como por exemplo as conexotildees no CLDC10 satildeo feitas atraveacutes do protocolo http que no caso eacute inseguro no envio de informaccedilotildees jaacute na 10 estaacute implementado o https (ssl) conexatildeo com criptografia que jaacute eacute conhecida de todos

Aqui listamos os Packages disponiacuteveis para as versotildees

javalang

javalangref (somente CLDC11)

javaio

javautil

javaxmicroeditionio

javaxmicroeditionlcdui

javaxmicroeditionlcduigame (somente na 20)

javaxmicroeditionmedia (somente na 20)

javaxmicroeditionmediacontrol (somente na 20)

javaxmicroeditionmidlet

javaxmicroeditionrms

javaxmicroeditionpki (somente na 20)

Opcionalmente fabricantes podem fornecer APIs JAVA para acesso a partes especificas de cada aparelho

Com relaccedilatildeo agrave seguranccedila o CLDC11 traz bastante recursos e jaacute se aproxima mais do J2SE com Permissions Types Protection Domains baseados em IPs e PKIs

- APIs

A CLDC 10 natildeo possui suporte a ponto flutuante ou seja se desejas trabalhar com contas e valores reais teraacutes que manuseaacute-los em coacutedigo mesmo A versatildeo 11 do CLDC jaacute possui suporte a ponto flutuante poreacutem mesmo com a versatildeo 10 vocecirc pode baixar programas especiacuteficos pra isso como esse programa encontrado em httphomerochesterrrcomohommesMathFP

Vocecirc tem ainda outras restriccedilotildees como

Sem user classLoading

Sem finalizaccedilatildeo de objetos (finallize() de javalangObject)

Garbage collector existe poreacutem natildeo executa meacutetodo automaacutetico

Sem RMI e sem JINI

Sem meacutetodos nativos a natildeo ser os fornecidos pela JVM nativa

MultiThreading (sem interrupt() pause() resume() e stop())

Sem thread groups e thread Deamons

- Criando projetos Compilando e Executando

10

Tutorial J2ME Copyrightreg - 2005

Bom depois de muita teoria a qual nos deu um embasamento melhor para sabermos o que estamos fazendo vamos a uma parte mais praacutetica e a mais esperada por todos

O processo de desenvolvimento de MIDlets eacute um pouco mais complexo do que de outros programas feitos em JAVA pois eacute feito segundo estes passos

Editar coacutedigo fonte

Compilar

Preacute-Verificar

Empacotar

Testar eou Instalar

Depois de tudo instalado corretamente devemos primeiramente abrir o Wireless ToolKit e criar um Projeto para isso clique em New Project

Depois em Project Name defina o nome do seu projeto e logo abaixo o nome da classe de sua midlet que deve ser igual ao nome do projeto

11

Tutorial J2ME Copyrightreg - 2005

Feito isso ele teraacute criado vaacuterios diretoacuterios dentro de path_WTKappsSua_Aplicacao para cada aplicaccedilatildeo eacute criado uma aacutervore de diretoacuterios conforme ilustrado abaixo

Em seguida abriraacute uma tela que conteacutem informaccedilotildees sobre a sua aplicaccedilatildeo (aconselho a natildeo mudar o que estaacute laacute) pois eacute por esse arquivo que o celular reconheceraacute seu aplicativo antes de ser baixado se ele eacute apto a rodar ou natildeo seu programa a uacutenica

coisa que poderias mudar seria o Vendor Name o qual vocecirc pode colocar o nome de sua empresa ou o que desejares Se vocecircs verificarem a uacuteltima aba desta tela (aba MIDlets)

tem um link para uma figura png que eacute o icone que apareceraacute no celular de sua aplicaccedilatildeo vocecirc pode modificaacute-lo colocando o nome de uma figura personalizada apenas

lembre-se que a figura deve ficar no devido diretoacuterio (path_WTKappsSua_Aplicacaores) e sempre para qualquer aplicaccedilatildeo deve-se por dentro do diretoacuterio res

12

Tutorial J2ME Copyrightreg - 2005

Existem dois bototildees que seratildeo muito utilizados por nos BUILD e RUN os quais satildeo auto-explicativos

Apoacutes a criaccedilatildeo do projeto estamos aptos e finalmente a criar nossos coacutedigos

Obfuscator Como vimos dispositivos celulares possuem memoacuteria muito reduzida e quanto

menor sua aplicaccedilatildeo for melhor seraacute para o celular Para isso usamos o Obfuscator que eacute usado para diminuir o tamanho dos arquivos eliminando redundacircncia e tambeacutem para evitar engenharia reversa

Este programa renomeia classes variaacuteveis e meacutetodos para nomes mais compactos removem classes meacutetodos natildeo usados e ainda inserem dados ilegais ou questionaacuteveis para confundir Descompiladores

Para criar um pacote obfuscado vocecirc precisa de algum programa Obfuscator um bom programa o Retroguard pode ser encontrado em wwwretrologiccom depois de baixado vocecirc deve copiar o arquivo retroguardjar dentro do diretoacuterio bin do wirelessToolkit (Ex cWTK104bin)

Tome um pouco de cuidado com os obfuscators pois em alguns celulares a sua aplicaccedilatildeo pode acabar natildeo funcionando

13

Tutorial J2ME Copyrightreg - 2005

- Ciclo de Vida de uma MIDlet

O Aplication Manager (AM) de cada dispositivo eacute quem vai controlar os aplicativos a serem instalados onde e como seratildeo armazenados e como seratildeo executados As classes de cada aplicativo estatildeo em um arquivo JAR o qual vem acompanhado de um descritor JAD que teraacute todas as informaccedilotildees as quais jaacute vimos anteriormente

Assim que a MIDlet eacute invocada o AM invoca o meacutetodo startApp() o qual coloca a midlet no estado Active Enquanto ela estiver executando o AM pode pausar ela invocando o meacutetodo pauseApp() no caso de uma chamada sendo recebida ou SMS chegando A aplicaccedilatildeo pode pausar a si mesma bastando invocar notifyPaused() Assim como a AM pode pausar a aplicaccedilatildeo e esta a si mesma ocorre o mesmo com o DestroyApp() que eacute invocado pela AM para fechar a aplicaccedilatildeo ou ateacute mesmo pode ser fechada atraveacutes da proacutepria aplicaccedilatildeo invocando o notifyDestroyed()

- Interface

As MIDlets devem poder ser executadas em qualquer dispositivo contendo a VM sem alteraccedilotildees poreacutem isso torna-se bastante difiacutecil na parte de Interface com usuaacuterio pois dispositivos variam de tamanho de tela cores teclados touch-Screens e outros aspectos

As aplicaccedilotildees satildeo desenvolvidas com uma certa abstraccedilatildeo de tela pois os comandos e insersatildeo de dados satildeo feitos atraveacutes dos bototildees do celular e isto natildeo eacute sabido previamente As aplicaccedilotildees descobrem isto em Runtime e se comportam de maneira apropriada a cada celular Jaacute no desenvolvimento de jogos a aplicaccedilatildeo eacute bem mais especiacutefica pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos como disposiccedilatildeo em tela por exemplo

A tela do dispositivo eacute representada por uma instacircncia da classe Display a qual eacute obtida pelo meacutetodo getDisplay() geralmente contida no meacutetodo startApp() pois o meacutetodo getDisplay() somente fica disponiacutevel apoacutes o inicio da Aplicaccedilatildeo (startApp()) Nessa instancia de Display satildeo inseridos heranccedilas de Displayable

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 9: Tutorial J2ME

9

Tutorial J2ME Copyrightreg - 2005

- Diferenccedila entre MIDP 10 e 20

Existem algumas diferenccedilas entre as versotildees como todos sabemos a cada versatildeo mais nova eacute sempre incrementado mais funccedilotildees Aleacutem desses meacutetodos a mais e algumas facilidades maiores da 20 como classes para jogos e tratamento de sons temos a diferenccedila na comunicaccedilatildeo de dados que eacute o mais interessante aqui como por exemplo as conexotildees no CLDC10 satildeo feitas atraveacutes do protocolo http que no caso eacute inseguro no envio de informaccedilotildees jaacute na 10 estaacute implementado o https (ssl) conexatildeo com criptografia que jaacute eacute conhecida de todos

Aqui listamos os Packages disponiacuteveis para as versotildees

javalang

javalangref (somente CLDC11)

javaio

javautil

javaxmicroeditionio

javaxmicroeditionlcdui

javaxmicroeditionlcduigame (somente na 20)

javaxmicroeditionmedia (somente na 20)

javaxmicroeditionmediacontrol (somente na 20)

javaxmicroeditionmidlet

javaxmicroeditionrms

javaxmicroeditionpki (somente na 20)

Opcionalmente fabricantes podem fornecer APIs JAVA para acesso a partes especificas de cada aparelho

Com relaccedilatildeo agrave seguranccedila o CLDC11 traz bastante recursos e jaacute se aproxima mais do J2SE com Permissions Types Protection Domains baseados em IPs e PKIs

- APIs

A CLDC 10 natildeo possui suporte a ponto flutuante ou seja se desejas trabalhar com contas e valores reais teraacutes que manuseaacute-los em coacutedigo mesmo A versatildeo 11 do CLDC jaacute possui suporte a ponto flutuante poreacutem mesmo com a versatildeo 10 vocecirc pode baixar programas especiacuteficos pra isso como esse programa encontrado em httphomerochesterrrcomohommesMathFP

Vocecirc tem ainda outras restriccedilotildees como

Sem user classLoading

Sem finalizaccedilatildeo de objetos (finallize() de javalangObject)

Garbage collector existe poreacutem natildeo executa meacutetodo automaacutetico

Sem RMI e sem JINI

Sem meacutetodos nativos a natildeo ser os fornecidos pela JVM nativa

MultiThreading (sem interrupt() pause() resume() e stop())

Sem thread groups e thread Deamons

- Criando projetos Compilando e Executando

10

Tutorial J2ME Copyrightreg - 2005

Bom depois de muita teoria a qual nos deu um embasamento melhor para sabermos o que estamos fazendo vamos a uma parte mais praacutetica e a mais esperada por todos

O processo de desenvolvimento de MIDlets eacute um pouco mais complexo do que de outros programas feitos em JAVA pois eacute feito segundo estes passos

Editar coacutedigo fonte

Compilar

Preacute-Verificar

Empacotar

Testar eou Instalar

Depois de tudo instalado corretamente devemos primeiramente abrir o Wireless ToolKit e criar um Projeto para isso clique em New Project

Depois em Project Name defina o nome do seu projeto e logo abaixo o nome da classe de sua midlet que deve ser igual ao nome do projeto

11

Tutorial J2ME Copyrightreg - 2005

Feito isso ele teraacute criado vaacuterios diretoacuterios dentro de path_WTKappsSua_Aplicacao para cada aplicaccedilatildeo eacute criado uma aacutervore de diretoacuterios conforme ilustrado abaixo

Em seguida abriraacute uma tela que conteacutem informaccedilotildees sobre a sua aplicaccedilatildeo (aconselho a natildeo mudar o que estaacute laacute) pois eacute por esse arquivo que o celular reconheceraacute seu aplicativo antes de ser baixado se ele eacute apto a rodar ou natildeo seu programa a uacutenica

coisa que poderias mudar seria o Vendor Name o qual vocecirc pode colocar o nome de sua empresa ou o que desejares Se vocecircs verificarem a uacuteltima aba desta tela (aba MIDlets)

tem um link para uma figura png que eacute o icone que apareceraacute no celular de sua aplicaccedilatildeo vocecirc pode modificaacute-lo colocando o nome de uma figura personalizada apenas

lembre-se que a figura deve ficar no devido diretoacuterio (path_WTKappsSua_Aplicacaores) e sempre para qualquer aplicaccedilatildeo deve-se por dentro do diretoacuterio res

12

Tutorial J2ME Copyrightreg - 2005

Existem dois bototildees que seratildeo muito utilizados por nos BUILD e RUN os quais satildeo auto-explicativos

Apoacutes a criaccedilatildeo do projeto estamos aptos e finalmente a criar nossos coacutedigos

Obfuscator Como vimos dispositivos celulares possuem memoacuteria muito reduzida e quanto

menor sua aplicaccedilatildeo for melhor seraacute para o celular Para isso usamos o Obfuscator que eacute usado para diminuir o tamanho dos arquivos eliminando redundacircncia e tambeacutem para evitar engenharia reversa

Este programa renomeia classes variaacuteveis e meacutetodos para nomes mais compactos removem classes meacutetodos natildeo usados e ainda inserem dados ilegais ou questionaacuteveis para confundir Descompiladores

Para criar um pacote obfuscado vocecirc precisa de algum programa Obfuscator um bom programa o Retroguard pode ser encontrado em wwwretrologiccom depois de baixado vocecirc deve copiar o arquivo retroguardjar dentro do diretoacuterio bin do wirelessToolkit (Ex cWTK104bin)

Tome um pouco de cuidado com os obfuscators pois em alguns celulares a sua aplicaccedilatildeo pode acabar natildeo funcionando

13

Tutorial J2ME Copyrightreg - 2005

- Ciclo de Vida de uma MIDlet

O Aplication Manager (AM) de cada dispositivo eacute quem vai controlar os aplicativos a serem instalados onde e como seratildeo armazenados e como seratildeo executados As classes de cada aplicativo estatildeo em um arquivo JAR o qual vem acompanhado de um descritor JAD que teraacute todas as informaccedilotildees as quais jaacute vimos anteriormente

Assim que a MIDlet eacute invocada o AM invoca o meacutetodo startApp() o qual coloca a midlet no estado Active Enquanto ela estiver executando o AM pode pausar ela invocando o meacutetodo pauseApp() no caso de uma chamada sendo recebida ou SMS chegando A aplicaccedilatildeo pode pausar a si mesma bastando invocar notifyPaused() Assim como a AM pode pausar a aplicaccedilatildeo e esta a si mesma ocorre o mesmo com o DestroyApp() que eacute invocado pela AM para fechar a aplicaccedilatildeo ou ateacute mesmo pode ser fechada atraveacutes da proacutepria aplicaccedilatildeo invocando o notifyDestroyed()

- Interface

As MIDlets devem poder ser executadas em qualquer dispositivo contendo a VM sem alteraccedilotildees poreacutem isso torna-se bastante difiacutecil na parte de Interface com usuaacuterio pois dispositivos variam de tamanho de tela cores teclados touch-Screens e outros aspectos

As aplicaccedilotildees satildeo desenvolvidas com uma certa abstraccedilatildeo de tela pois os comandos e insersatildeo de dados satildeo feitos atraveacutes dos bototildees do celular e isto natildeo eacute sabido previamente As aplicaccedilotildees descobrem isto em Runtime e se comportam de maneira apropriada a cada celular Jaacute no desenvolvimento de jogos a aplicaccedilatildeo eacute bem mais especiacutefica pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos como disposiccedilatildeo em tela por exemplo

A tela do dispositivo eacute representada por uma instacircncia da classe Display a qual eacute obtida pelo meacutetodo getDisplay() geralmente contida no meacutetodo startApp() pois o meacutetodo getDisplay() somente fica disponiacutevel apoacutes o inicio da Aplicaccedilatildeo (startApp()) Nessa instancia de Display satildeo inseridos heranccedilas de Displayable

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 10: Tutorial J2ME

10

Tutorial J2ME Copyrightreg - 2005

Bom depois de muita teoria a qual nos deu um embasamento melhor para sabermos o que estamos fazendo vamos a uma parte mais praacutetica e a mais esperada por todos

O processo de desenvolvimento de MIDlets eacute um pouco mais complexo do que de outros programas feitos em JAVA pois eacute feito segundo estes passos

Editar coacutedigo fonte

Compilar

Preacute-Verificar

Empacotar

Testar eou Instalar

Depois de tudo instalado corretamente devemos primeiramente abrir o Wireless ToolKit e criar um Projeto para isso clique em New Project

Depois em Project Name defina o nome do seu projeto e logo abaixo o nome da classe de sua midlet que deve ser igual ao nome do projeto

11

Tutorial J2ME Copyrightreg - 2005

Feito isso ele teraacute criado vaacuterios diretoacuterios dentro de path_WTKappsSua_Aplicacao para cada aplicaccedilatildeo eacute criado uma aacutervore de diretoacuterios conforme ilustrado abaixo

Em seguida abriraacute uma tela que conteacutem informaccedilotildees sobre a sua aplicaccedilatildeo (aconselho a natildeo mudar o que estaacute laacute) pois eacute por esse arquivo que o celular reconheceraacute seu aplicativo antes de ser baixado se ele eacute apto a rodar ou natildeo seu programa a uacutenica

coisa que poderias mudar seria o Vendor Name o qual vocecirc pode colocar o nome de sua empresa ou o que desejares Se vocecircs verificarem a uacuteltima aba desta tela (aba MIDlets)

tem um link para uma figura png que eacute o icone que apareceraacute no celular de sua aplicaccedilatildeo vocecirc pode modificaacute-lo colocando o nome de uma figura personalizada apenas

lembre-se que a figura deve ficar no devido diretoacuterio (path_WTKappsSua_Aplicacaores) e sempre para qualquer aplicaccedilatildeo deve-se por dentro do diretoacuterio res

12

Tutorial J2ME Copyrightreg - 2005

Existem dois bototildees que seratildeo muito utilizados por nos BUILD e RUN os quais satildeo auto-explicativos

Apoacutes a criaccedilatildeo do projeto estamos aptos e finalmente a criar nossos coacutedigos

Obfuscator Como vimos dispositivos celulares possuem memoacuteria muito reduzida e quanto

menor sua aplicaccedilatildeo for melhor seraacute para o celular Para isso usamos o Obfuscator que eacute usado para diminuir o tamanho dos arquivos eliminando redundacircncia e tambeacutem para evitar engenharia reversa

Este programa renomeia classes variaacuteveis e meacutetodos para nomes mais compactos removem classes meacutetodos natildeo usados e ainda inserem dados ilegais ou questionaacuteveis para confundir Descompiladores

Para criar um pacote obfuscado vocecirc precisa de algum programa Obfuscator um bom programa o Retroguard pode ser encontrado em wwwretrologiccom depois de baixado vocecirc deve copiar o arquivo retroguardjar dentro do diretoacuterio bin do wirelessToolkit (Ex cWTK104bin)

Tome um pouco de cuidado com os obfuscators pois em alguns celulares a sua aplicaccedilatildeo pode acabar natildeo funcionando

13

Tutorial J2ME Copyrightreg - 2005

- Ciclo de Vida de uma MIDlet

O Aplication Manager (AM) de cada dispositivo eacute quem vai controlar os aplicativos a serem instalados onde e como seratildeo armazenados e como seratildeo executados As classes de cada aplicativo estatildeo em um arquivo JAR o qual vem acompanhado de um descritor JAD que teraacute todas as informaccedilotildees as quais jaacute vimos anteriormente

Assim que a MIDlet eacute invocada o AM invoca o meacutetodo startApp() o qual coloca a midlet no estado Active Enquanto ela estiver executando o AM pode pausar ela invocando o meacutetodo pauseApp() no caso de uma chamada sendo recebida ou SMS chegando A aplicaccedilatildeo pode pausar a si mesma bastando invocar notifyPaused() Assim como a AM pode pausar a aplicaccedilatildeo e esta a si mesma ocorre o mesmo com o DestroyApp() que eacute invocado pela AM para fechar a aplicaccedilatildeo ou ateacute mesmo pode ser fechada atraveacutes da proacutepria aplicaccedilatildeo invocando o notifyDestroyed()

- Interface

As MIDlets devem poder ser executadas em qualquer dispositivo contendo a VM sem alteraccedilotildees poreacutem isso torna-se bastante difiacutecil na parte de Interface com usuaacuterio pois dispositivos variam de tamanho de tela cores teclados touch-Screens e outros aspectos

As aplicaccedilotildees satildeo desenvolvidas com uma certa abstraccedilatildeo de tela pois os comandos e insersatildeo de dados satildeo feitos atraveacutes dos bototildees do celular e isto natildeo eacute sabido previamente As aplicaccedilotildees descobrem isto em Runtime e se comportam de maneira apropriada a cada celular Jaacute no desenvolvimento de jogos a aplicaccedilatildeo eacute bem mais especiacutefica pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos como disposiccedilatildeo em tela por exemplo

A tela do dispositivo eacute representada por uma instacircncia da classe Display a qual eacute obtida pelo meacutetodo getDisplay() geralmente contida no meacutetodo startApp() pois o meacutetodo getDisplay() somente fica disponiacutevel apoacutes o inicio da Aplicaccedilatildeo (startApp()) Nessa instancia de Display satildeo inseridos heranccedilas de Displayable

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 11: Tutorial J2ME

11

Tutorial J2ME Copyrightreg - 2005

Feito isso ele teraacute criado vaacuterios diretoacuterios dentro de path_WTKappsSua_Aplicacao para cada aplicaccedilatildeo eacute criado uma aacutervore de diretoacuterios conforme ilustrado abaixo

Em seguida abriraacute uma tela que conteacutem informaccedilotildees sobre a sua aplicaccedilatildeo (aconselho a natildeo mudar o que estaacute laacute) pois eacute por esse arquivo que o celular reconheceraacute seu aplicativo antes de ser baixado se ele eacute apto a rodar ou natildeo seu programa a uacutenica

coisa que poderias mudar seria o Vendor Name o qual vocecirc pode colocar o nome de sua empresa ou o que desejares Se vocecircs verificarem a uacuteltima aba desta tela (aba MIDlets)

tem um link para uma figura png que eacute o icone que apareceraacute no celular de sua aplicaccedilatildeo vocecirc pode modificaacute-lo colocando o nome de uma figura personalizada apenas

lembre-se que a figura deve ficar no devido diretoacuterio (path_WTKappsSua_Aplicacaores) e sempre para qualquer aplicaccedilatildeo deve-se por dentro do diretoacuterio res

12

Tutorial J2ME Copyrightreg - 2005

Existem dois bototildees que seratildeo muito utilizados por nos BUILD e RUN os quais satildeo auto-explicativos

Apoacutes a criaccedilatildeo do projeto estamos aptos e finalmente a criar nossos coacutedigos

Obfuscator Como vimos dispositivos celulares possuem memoacuteria muito reduzida e quanto

menor sua aplicaccedilatildeo for melhor seraacute para o celular Para isso usamos o Obfuscator que eacute usado para diminuir o tamanho dos arquivos eliminando redundacircncia e tambeacutem para evitar engenharia reversa

Este programa renomeia classes variaacuteveis e meacutetodos para nomes mais compactos removem classes meacutetodos natildeo usados e ainda inserem dados ilegais ou questionaacuteveis para confundir Descompiladores

Para criar um pacote obfuscado vocecirc precisa de algum programa Obfuscator um bom programa o Retroguard pode ser encontrado em wwwretrologiccom depois de baixado vocecirc deve copiar o arquivo retroguardjar dentro do diretoacuterio bin do wirelessToolkit (Ex cWTK104bin)

Tome um pouco de cuidado com os obfuscators pois em alguns celulares a sua aplicaccedilatildeo pode acabar natildeo funcionando

13

Tutorial J2ME Copyrightreg - 2005

- Ciclo de Vida de uma MIDlet

O Aplication Manager (AM) de cada dispositivo eacute quem vai controlar os aplicativos a serem instalados onde e como seratildeo armazenados e como seratildeo executados As classes de cada aplicativo estatildeo em um arquivo JAR o qual vem acompanhado de um descritor JAD que teraacute todas as informaccedilotildees as quais jaacute vimos anteriormente

Assim que a MIDlet eacute invocada o AM invoca o meacutetodo startApp() o qual coloca a midlet no estado Active Enquanto ela estiver executando o AM pode pausar ela invocando o meacutetodo pauseApp() no caso de uma chamada sendo recebida ou SMS chegando A aplicaccedilatildeo pode pausar a si mesma bastando invocar notifyPaused() Assim como a AM pode pausar a aplicaccedilatildeo e esta a si mesma ocorre o mesmo com o DestroyApp() que eacute invocado pela AM para fechar a aplicaccedilatildeo ou ateacute mesmo pode ser fechada atraveacutes da proacutepria aplicaccedilatildeo invocando o notifyDestroyed()

- Interface

As MIDlets devem poder ser executadas em qualquer dispositivo contendo a VM sem alteraccedilotildees poreacutem isso torna-se bastante difiacutecil na parte de Interface com usuaacuterio pois dispositivos variam de tamanho de tela cores teclados touch-Screens e outros aspectos

As aplicaccedilotildees satildeo desenvolvidas com uma certa abstraccedilatildeo de tela pois os comandos e insersatildeo de dados satildeo feitos atraveacutes dos bototildees do celular e isto natildeo eacute sabido previamente As aplicaccedilotildees descobrem isto em Runtime e se comportam de maneira apropriada a cada celular Jaacute no desenvolvimento de jogos a aplicaccedilatildeo eacute bem mais especiacutefica pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos como disposiccedilatildeo em tela por exemplo

A tela do dispositivo eacute representada por uma instacircncia da classe Display a qual eacute obtida pelo meacutetodo getDisplay() geralmente contida no meacutetodo startApp() pois o meacutetodo getDisplay() somente fica disponiacutevel apoacutes o inicio da Aplicaccedilatildeo (startApp()) Nessa instancia de Display satildeo inseridos heranccedilas de Displayable

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 12: Tutorial J2ME

12

Tutorial J2ME Copyrightreg - 2005

Existem dois bototildees que seratildeo muito utilizados por nos BUILD e RUN os quais satildeo auto-explicativos

Apoacutes a criaccedilatildeo do projeto estamos aptos e finalmente a criar nossos coacutedigos

Obfuscator Como vimos dispositivos celulares possuem memoacuteria muito reduzida e quanto

menor sua aplicaccedilatildeo for melhor seraacute para o celular Para isso usamos o Obfuscator que eacute usado para diminuir o tamanho dos arquivos eliminando redundacircncia e tambeacutem para evitar engenharia reversa

Este programa renomeia classes variaacuteveis e meacutetodos para nomes mais compactos removem classes meacutetodos natildeo usados e ainda inserem dados ilegais ou questionaacuteveis para confundir Descompiladores

Para criar um pacote obfuscado vocecirc precisa de algum programa Obfuscator um bom programa o Retroguard pode ser encontrado em wwwretrologiccom depois de baixado vocecirc deve copiar o arquivo retroguardjar dentro do diretoacuterio bin do wirelessToolkit (Ex cWTK104bin)

Tome um pouco de cuidado com os obfuscators pois em alguns celulares a sua aplicaccedilatildeo pode acabar natildeo funcionando

13

Tutorial J2ME Copyrightreg - 2005

- Ciclo de Vida de uma MIDlet

O Aplication Manager (AM) de cada dispositivo eacute quem vai controlar os aplicativos a serem instalados onde e como seratildeo armazenados e como seratildeo executados As classes de cada aplicativo estatildeo em um arquivo JAR o qual vem acompanhado de um descritor JAD que teraacute todas as informaccedilotildees as quais jaacute vimos anteriormente

Assim que a MIDlet eacute invocada o AM invoca o meacutetodo startApp() o qual coloca a midlet no estado Active Enquanto ela estiver executando o AM pode pausar ela invocando o meacutetodo pauseApp() no caso de uma chamada sendo recebida ou SMS chegando A aplicaccedilatildeo pode pausar a si mesma bastando invocar notifyPaused() Assim como a AM pode pausar a aplicaccedilatildeo e esta a si mesma ocorre o mesmo com o DestroyApp() que eacute invocado pela AM para fechar a aplicaccedilatildeo ou ateacute mesmo pode ser fechada atraveacutes da proacutepria aplicaccedilatildeo invocando o notifyDestroyed()

- Interface

As MIDlets devem poder ser executadas em qualquer dispositivo contendo a VM sem alteraccedilotildees poreacutem isso torna-se bastante difiacutecil na parte de Interface com usuaacuterio pois dispositivos variam de tamanho de tela cores teclados touch-Screens e outros aspectos

As aplicaccedilotildees satildeo desenvolvidas com uma certa abstraccedilatildeo de tela pois os comandos e insersatildeo de dados satildeo feitos atraveacutes dos bototildees do celular e isto natildeo eacute sabido previamente As aplicaccedilotildees descobrem isto em Runtime e se comportam de maneira apropriada a cada celular Jaacute no desenvolvimento de jogos a aplicaccedilatildeo eacute bem mais especiacutefica pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos como disposiccedilatildeo em tela por exemplo

A tela do dispositivo eacute representada por uma instacircncia da classe Display a qual eacute obtida pelo meacutetodo getDisplay() geralmente contida no meacutetodo startApp() pois o meacutetodo getDisplay() somente fica disponiacutevel apoacutes o inicio da Aplicaccedilatildeo (startApp()) Nessa instancia de Display satildeo inseridos heranccedilas de Displayable

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 13: Tutorial J2ME

13

Tutorial J2ME Copyrightreg - 2005

- Ciclo de Vida de uma MIDlet

O Aplication Manager (AM) de cada dispositivo eacute quem vai controlar os aplicativos a serem instalados onde e como seratildeo armazenados e como seratildeo executados As classes de cada aplicativo estatildeo em um arquivo JAR o qual vem acompanhado de um descritor JAD que teraacute todas as informaccedilotildees as quais jaacute vimos anteriormente

Assim que a MIDlet eacute invocada o AM invoca o meacutetodo startApp() o qual coloca a midlet no estado Active Enquanto ela estiver executando o AM pode pausar ela invocando o meacutetodo pauseApp() no caso de uma chamada sendo recebida ou SMS chegando A aplicaccedilatildeo pode pausar a si mesma bastando invocar notifyPaused() Assim como a AM pode pausar a aplicaccedilatildeo e esta a si mesma ocorre o mesmo com o DestroyApp() que eacute invocado pela AM para fechar a aplicaccedilatildeo ou ateacute mesmo pode ser fechada atraveacutes da proacutepria aplicaccedilatildeo invocando o notifyDestroyed()

- Interface

As MIDlets devem poder ser executadas em qualquer dispositivo contendo a VM sem alteraccedilotildees poreacutem isso torna-se bastante difiacutecil na parte de Interface com usuaacuterio pois dispositivos variam de tamanho de tela cores teclados touch-Screens e outros aspectos

As aplicaccedilotildees satildeo desenvolvidas com uma certa abstraccedilatildeo de tela pois os comandos e insersatildeo de dados satildeo feitos atraveacutes dos bototildees do celular e isto natildeo eacute sabido previamente As aplicaccedilotildees descobrem isto em Runtime e se comportam de maneira apropriada a cada celular Jaacute no desenvolvimento de jogos a aplicaccedilatildeo eacute bem mais especiacutefica pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos como disposiccedilatildeo em tela por exemplo

A tela do dispositivo eacute representada por uma instacircncia da classe Display a qual eacute obtida pelo meacutetodo getDisplay() geralmente contida no meacutetodo startApp() pois o meacutetodo getDisplay() somente fica disponiacutevel apoacutes o inicio da Aplicaccedilatildeo (startApp()) Nessa instancia de Display satildeo inseridos heranccedilas de Displayable

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 14: Tutorial J2ME

14

Tutorial J2ME Copyrightreg - 2005

public void startApp()

Display d = DisplaygetDisplay(this)

Na tela satildeo mostrados componentes objetos jaacute instanciados os quais satildeo chamados pelo meacutetodo setCurrent() o qual seta o objeto que seraacute mostrado

O ciclo baacutesico de uma MIDlet pode ser definido por

Mostrar um Displayable

Esperar por Accedilatildeo do Usuaacuterio

Decidir qual Displyable mostrar em seguida

Repetir

As accedilotildees do usuaacuterio satildeo gerenciadas por comandos (commands) os quais satildeo adicionados a componentes visuais E tambeacutem temos as classes Screen e Canvas as quais podemos dividir em duas classes

High-level APIs que engloba a classe Screen e suas heranccedilas pois satildeo classificados como objetos de Interface

Low-level APIs que engloba a classe Canvas e suas heranccedilas as quais proporcionam uma aacuterea livre para graacuteficos

- Commands

Os commands como vimos satildeo usados para interaccedilatildeo do usuaacuterio com a aplicaccedilatildeo Sua aplicaccedilatildeo baacutesica eacute na troca de Displayables os quais satildeo acionados por elementos reais do dispositivo que podem ser softkeys itens de menu bototildees e

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 15: Tutorial J2ME

15

Tutorial J2ME Copyrightreg - 2005

dispositivos de acionamento Esses commands satildeo entidades abstratas e podem ser adicionados

arbitrariamente para cada elemento Screen ou Canvas Os commands tem trecircs propriedades

Label texto mostrado ao usuaacuterio na interface

Type tipo do comando

Priority prioridade dos comandos que satildeo utilizados para mostrar os comandos mais utilizados com maior facilidade

Command(String Label int Type int Priority) Ex ComandoSair = new Command( Sair CommandEXIT 0)

As accedilotildees dos commands satildeo totalmente dependente do coacutedigo ou seja vocecirc teraacute que implementar a accedilatildeo de cada command selecionado os quais ficaratildeo dentro de um meacutetodo chamado commandAction que vem como heranccedila quando a MIDlet herda CommandListener Para cada objeto que herda de Diplayable existem os meacutetodos addCommand(Command) e removeCommand(Command) os quais satildeo auto-explicativos Os commands satildeo geralmente relacionados a SoftKeys ou SoftButtons que satildeo bototildees existentes nos celulares os quais satildeo usados para menus e navegaccedilatildeo em geral sem uma funccedilatildeo uacutenica Geralmente possui-se dois bototildees de SoftKeys poreacutem isso natildeo significa que vocecirc precisa soacute ter dois commands sendo implementados pois se houver mais commands que bototildees eles satildeo agrupados e eacute aberto um menu Para isso que serve a prioridade setada nos bototildees ou seja a prioridade 0 (mais prioritaacuterio) indica que esse command deve ser mostrado nas softKeys ou em primeiro lugar no menu

Dica busque sempre a utilizaccedilatildeo dos correta dos tipos de Commands (CommandSCREEN CommandEXIT CommandOK CommandBACK etc) pois em runtime eacute que eles iratildeo definir o local apropriado para se posicionarem na tela por exemplo se um command eacute setado com o tipo EXIT ele vai ficar onde normalmente fica os comandos de Exit do proacuteprio celular

O tratamento dos commands eacute feito com o conceito de Listeners ou seja comandos satildeo adicionados a Displayables cada displayable pode possuir um CommandListener o qual eacute invocado assim que um command eacute acionado

public void setCommandListener(CommandListener)

Exemplo TextBox t1 = new TextBox( Texto 10TextFieldANY) t1setCommandListener(this) t1addCommand(ComandoSair) comando feito acima

Meacutetodo commandAction public void commandAction(Command c Displayable d)

if (c==thiscomando1)

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 16: Tutorial J2ME

16

Tutorial J2ME Copyrightreg - 2005

- TextBox

Eacute um componente baacutesico que serve para entrada de texto(string) em celulares Todos sabemos o quatildeo entediante eacute a entrada de dados em celulares e por isso temos que aprimorar essa teacutecnica e manter o bom padratildeo de uma MIDlet e de qualquer outro programa que eacute deixar o usuaacuterio feliz e menos cansado e entediado

O construtor de um TextBox eacute public TextBox(String titulo String texto int tam_Max int constraints) onde

Titulo eacute mostrado no topo da tela

Texto eacute mostrado dentro do textbox como string inicial

tam_Max tamanho maacuteximo de caracteres que seraacute alcanccedilado pelo textBox

Constraints satildeo as constantes da classe TextField que determinam que tipo de dado o campo aceitaraacute ex NUMERIC ANY(para numeric e texto) PASSWORD(mascara o texto) etc

Exemplos TextBox t1 = new TextBox( Nome 30 TextFieldANY) TextBox t2 = new TextBox( Nome 20 TextFieldANY | TextFieldPASSWORD)

- Tickers

Ticker nada mais eacute que um texto que corre no topo da tela semelhante as tickers de mercados de accedilotildees e semelhante ao ltmarqueegt de html O recurso de Ticker serve para algum texto informativo que possa ser importante ficar lembrando toda hora ou algo de enfeite que vocecirc queira colocar Mas lembre-se a tela do celular jaacute eacute pequena para sua aplicaccedilatildeo e o ticker tomara mais uma linha para si a qual natildeo poderaacute ser usada Sua criaccedilatildeo eacute simples

Displayable d = Ticker ticker = new Ticker( Esta mensagem deve passar na tela )

dsetTicker(ticker)

E os meacutetodos para manuseio dessas Tickers natildeo poderiam ser outros senatildeo public void setTicker(Ticker ticker) public Ticker getTicker

- Forms

Form eacute uma heranccedila de Screen e Displayable o qual pode conter mais de um controle de interface chamados Item Um form tem a mesma funccedilatildeo de um Container em AWTSWING mas com as limitaccedilotildees da MIDlet eacute claro ele serve para poder-se colocar mais de um componente na tela Apesar de haver rolagem automaacutetica quando todos os objetos natildeo cabem na tela cuidado para natildeo deixar um form muito grande com muitos componentes pois a rolagem dos forms tende a ser confuso nos dispositivos pois cada um implementa isso da sua maneira e por isso natildeo deve se tornar uma praacutetica corriqueira aleacutem de tornar seu aplicativo esteticamente mal feito pois o usuaacuterio muitas vezes natildeo iraacute saber se haacute mais objetos a serem preenchidos

Para criarmos um form temos duas sobrecargas

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 17: Tutorial J2ME

17

Tutorial J2ME Copyrightreg - 2005

public Form(String Titulo)

public Form(String Titulo Item[] itens)

Como vimos os forms recebem itens os quais satildeo divididos em diversos tipos cada um com sua finalidade

Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados Os meacutetodos de trabalho com os forms satildeo

append(Item item)

set(int Indice Item item)

insert(int Indice Item item)

delete(int Indice) Lembre-se que o meacutetodo append adiciona um novo item no final da lista e o

meacutetodo insert adiciona um item no iacutendice indicado movendo os outros existentes para baixo

- Item

Como jaacute foi falado existem vaacuterios tipos de itens e cada um com sua determinada funccedilatildeo Esses diversos tipos de itens estendem da classe Item Esses itens satildeo inseridos em forms eles podem ou natildeo ter um Label podem ou natildeo ser mostrados eles podem ter comandos associados a eles

Vamos relata-los aqui A partir de agora vamos usar o mesmo form que criaremos agora para todos os

exemplos abaixo

Form form = new Form( Form de teste )

StringItem

nada mais eacute que um simples Label com um texto Ex Coacutedigo 1 onde Codigo eacute a parte Label e 1 eacute a parte Texto

Para este Item existem os meacutetodos de manipulaccedilatildeo getLabel() setLabel() getText() setText()

StringItem( Label Text )

Ex StringItem strItem = new StringItem( Nome Juliano ) formappend(strItem)

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 18: Tutorial J2ME

18

Tutorial J2ME Copyrightreg - 2005

TextField

eacute uma string editaacutevel ou melhor exemplificando um campo para preencher

Para este item existem os meacutetodos de manipulaccedilatildeo getString() setString()

TextField(String Label String Text int TamMax int Constraints)

Ex TextField tf = new TextField( Digite seu Nome 30 TextFieldANY)

formappend(tf)

As constraints satildeo as mesmas do TextBox (ANY PASSWORD EMAILADDR NUMERIC PHONENUMBER URL)

ImageItem

mostra a instacircncia de uma Imagem dentro de um form ou seja vocecirc precisa jaacute de um objeto Image Este item possui um label um texto alternativo e pode ser posicionado segundo um layout

ImageItem(String Label Image imagem int Layout String texto_alt)

Os layouts satildeo constantes da classe e podem ser LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_CENTER LAYOUT_RIGHT LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER)

somente existentes no MIDP 20

Ex Image img = new ImagecreateImage( fotopng ) ImageItem imgItem = new ImageItem( Foto img

ImageItemLAYOUT_DEFAULT Alt Text ) formappend(imgItem)

DateField

Eacute uma interface usada para datas horas ou ambos como iraacute aparecer eacute por conta do Celular e o programador natildeo tem controle sobre isso No construtor deve ser especificado a Label e o tipo de dado que pode ser - DateFieldDATE - DateFieldTIME - DateFieldDATE_TIME

public DateField(String Label int modo)

Ex DateField data = new DateField( Data DateFieldDATE )

Gauges

Eacute uma representaccedilatildeo graacutefica de um valor inteiro e como ele seraacute mostrado depende da implementaccedilatildeo de cada aparelho Existem dois tipos de gauges o interativo que permite a accedilatildeo do usuaacuterio sobre seu valor e Natildeo interativo controlado somente pelo programa Os valores podem ser alterados em tempo de execuccedilatildeo pelos comandos getMaxValue() setMaxValue() setValue() getValue()

public Gauge(String Label boolean Interativo int ValorMaximo int ValorInicial)

Ex Gauge g = new Gauge( Gauge Interativo true 20 1)

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 19: Tutorial J2ME

19

Tutorial J2ME Copyrightreg - 2005

ChoiceGroup

eacute uma lista de escolhas semelhante a List ambos implementam a

interface Choice Os tipo de listas satildeo Exclusive e Multiple poreacutem natildeo tem o tipo Implicit Jaacute na MIDP 20 eacute implementado o tipo POPUP que deixa a lista semelhante a um menu DropDown

public ChoiceGroup(String label int tipo) public ChoiceGroup(String label int tipo String[] elementos Image[] imagens)

Eventos de Itens Os Itens possuem eventos de alteraccedilatildeo de Estado que podem ser manejados para

Aplicaccedilatildeo pode tratar eventos de alteraccedilatildeo de estado em Itens Interface ItemStateListener meacutetodo public void itemStateChanged(Item item) Registra-se o listener com o meacutetodo

setItemStateListener(ItemStateListener listener)

- Lists

Como o proacuteprio nome diz satildeo listas as quais permitem ao usuaacuterio selecionar itens (elements) de uma lista Esses elementos podem ser representados tanto por Strings quanto por Imagens

Existem trecircs tipos de listas Implicit Exclusive e Multiple Implicit deixa vocecirc escolher uma opccedilatildeo e clicar no botatildeo padratildeo de seleccedilatildeo ou em um command que vocecirc adicionar Exclusive que lembra uma lista de Radio permite somente a seleccedilatildeo de uma opccedilatildeo e para seleciona-la deve-se usar um botatildeo com um Command setado E ainda tem a list Multiple que funciona como uma CheckList jaacute conhecida de todos que nos permite selecionar vaacuterias opccedilotildees

Quando eacute selecionado um item em uma lista Implicit o meacutetodo CommandAction eacute chamado sendo que para esta List jaacute foi anteriormente adicionando um CommandListener

Existem duas sobrecargas para este construtor no qual vocecirc pode iniciar os Arrays de elementos e de Imagens ou natildeo O array de elementos se utilizado natildeo poderaacute ser nulo mas poderaacute conter elementos nulos os quais apareceratildeo em branco na tela

public List(String titulo int tipo) public List(String titulo int tipo String[] elementos Image[] imagens)

Quando uma lista tornar-se grande demais para a tela seraacute criado uma rolagem a qual natildeo cabe a noacutes implementa-la ela eacute por conta da VM

Cada elemento da list possui um iacutendice Esse iacutendice inicia em 0 Para editar uma list existem alguns meacutetodos que valem a pena ser comentados aqui Que satildeo

set altera o elemento do qual o iacutendice foi fornecido

insert insere um elemento em uma posiccedilatildeo indicada por um iacutendice Se este iacutendice estiver no meio da lista ele forccedila os outros elementos uma posiccedilatildeo agrave frente

Append inclui um elemento ao final da lista

delete remove o elemento indicado pelo iacutendice EX

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 20: Tutorial J2ME

20

Tutorial J2ME Copyrightreg - 2005

public void set(int indice String elemento Image imagem) public void insert(int indice String elemento Image imagem) public int append(String elemento Image imagem) public void delete(int indice)

Dois meacutetodos bastante utilizados que valem a pena ser comentados satildeo

public boolean isSelected(int indice) que me diz se o iacutendice esta selecionado atualmente

public int getSelectedIndex() que me retorna o iacutendice que foi escolhido somente para listas Implicit e Exclusive

- Imagens

A especificaccedilatildeo de MIDP determina que a implementaccedilatildeo deveraacute ser capaz de manipular Imagens PNG o que natildeo ocorre em todos os celulares Alguns trabalham com JPG outros com GIF BMP e ateacute mesmo PNG sem compactaccedilatildeo poreacutem eacute muito raro vocecirc conseguir encontrar a especificaccedilatildeo de cada aparelho para isso o que torna muito difiacutecil a programaccedilatildeo com imagens quando natildeo eacute usado o padratildeo

public static Image createImage(String nome) public static Image createImage(byte[] dados int offset int tamanho)

O primeiro construtor busca o arquivo indicado pelo nome na pasta res de sua aplicaccedilatildeo no caso de uso do emulador quando ele eacute compilado e empacotado a imagem eacute empacotada junto com o programa O segundo construtor obteacutem a imagem de um Arrray de Bytes partindo da posiccedilatildeo offset ateacute o tamanho indicado Essas imagens podem ser Mutaacuteveis ou Imutaacuteveis As mutaacuteveis podem ser modificadas pelo Objeto Graphics obtido pelo meacutetodo getGraphics() Poreacutem esses dois construtores citados acima geram imagens imutaacuteveis Para se criar imagens mutaacuteveis deve-se usar o seguinte meacutetodo

public static Image createImage(int largura int altura)

Lembre-se que as imagens passadas para Alerts ChoiceGroups ImageItems ou Lists devem ser Imutaacuteveis Imagens imutaacuteveis podem ser criadas a partir de outras imagens mutaacuteveis

public static Image createImage(Image imagem)

Somente um comentaacuterio agrave parte Imagens em MIDP 20 podem ser criadas agrave partir de porccedilotildees de outras imagens jaacute existentes public static Image createImage(Image image int x int y int largura int altura int transformacao)

- Alerts

Um alert nada mais eacute que uma mensagem informativa ao usuaacuterio tem a mesma ideacuteia de um alert de javascript ou VB ou qualquer outra linguagem ou seja ele eacute basicamente uma telinha que mostra uma mensagem e logo depois sai da tela

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 21: Tutorial J2ME

21

Tutorial J2ME Copyrightreg - 2005

Esses alerts podem ser tanto Timed Alerts ou Modal Alert No Timed Alert vocecirc pode setar um tempo ou natildeo o qual receberaacute o tempo padratildeo do aparelho E o alerta modal que aparece e fica esperando uma intervenccedilatildeo do usuaacuterio e possui vaacuterios tipos como Alarm Confirmation Error Info Warning cada qual com seu iacutecone e som os quais tambeacutem podem ser setados pelo desenvolvedor

public Alert() public Alert(String titulo String texto Image icone AlertType tipo)

Qualquer um ou todos os paracircmetros do segundo construtor podem ser nulos

Alerts satildeo criados com um tempo default para desaparecer tempo qual eacute implementado na VM e pode ser obtido por getDefaultTimeout() e tambeacutem configurado por setTimeout() Quando criamos um Timed Alert podemos transforma-lo em modal adicionando ao paracircmetro AlertType para AlertFOREVER

Ex Alert alerta alerta = new Alert( Alerta Acesso natildeo autorizado null null) alertasetTimeout(5000) timeout para 5 segundos

O comportamento padratildeo de um Alert eacute mostar a proacutexima tela setada se usado o meacutetodo setCurrent(atual proacuteximo) ou ele iraacute voltar para a tela atual se for usado setCurrent(Alert)

- Conexotildees

Sistemas moacuteveis geralmente oferecem acesso a dados via conexotildees OTA(Over The Air) poreacutem essas conexotildees ainda satildeo lentas pouco confiaacuteveis e intermitentes o que nos dificulta um pouco essa transmissatildeo de dados e na pior das hipoacuteteses entedia o usuaacuterio este por estar jaacute acostumado com uma conexatildeo raacutepida e confiaacutevel

A MIDP possui mecanismos geneacutericos para acesso a rede as quais satildeo definidas pela CLDC que eacute bem flexiacutevel Para isso ela usa o Package javaxmicroeditionio e eacute baseada na interface Connection O link real entre a interface Connection eacute feito atraveacutes da classe javaxmicroeditionioConnector que funciona passando-se uma string de conexatildeo para um meacutetodo estaacutetico de Connector e retorna uma Connection com resultado

A conexatildeo na CLDC 10 pode feita por HTTP atraveacutes de HttpConnection poreacutem algumas implementaccedilotildees particulares de celulares podem oferecer HttpsConnection SocketConnection entre outros Jaacute na CLDC 11 a obrigatoriedade eacute passada para a implementaccedilatildeo do HttpsConnection Ambos os meacutetodos tratam das particularidades do protocolo Http como Headers meacutetodos e outros(RFC 2616)

O Http trabalha com o processo de responserequest incluindo Headers no processo Os paracircmetros passados na url satildeo codificados antes da transmissatildeo o que garante integridade da informaccedilatildeo e padronizaccedilatildeo para isso utiliza-se de URLEncoder que transforma espaccedilos em sinais de + az AZ 09 ponto() Hiacutefen(-) Asterisco() e Underscore(_) satildeo mantidos e todo qualquer outro caractere eacute convertido em xy onde xy eacute o valor Hexadecimal que representa os 8 bits menos significativos do caractere

Revisando um pouco Http temos os meacutetodos GET POST e HEAD onde GET e POST buscam paginas GET enviando paracircmetros na URL enquanto POST envia os paracircmetro no header e o HEAD que eacute idecircntico ao GET poreacutem o servidor soacute responde

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 22: Tutorial J2ME

22

Tutorial J2ME Copyrightreg - 2005

com Headers A conexatildeo GET funciona passando-se uma URL para o meacutetodo open() da classe

connector da qual vocecirc iraacute receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois) entatildeo vocecirc deveraacute obter os streams de conexatildeo InputStream e OutputStream e entatildeo ler os dados que foram retornados para vocecirc do Servidor e trataacute-los conforme o que vocecirc precisa e para isso vocecirc deve antecipadamente conhecer o formato de retorno da informaccedilatildeo vinda do servidor

Ex String url = servidorcombrsuaPaginajsp (aqui pode ser qualquer pagina de qualquer extensatildeo inclusive Servlets que satildeo geralmente utilizados como resposta para MIDlets)

InputConnection ic = (InputConnection) Connectoropen(url) InputStream is = icopenInputStream() aqui vai todo o processo de leitura (Veja nos Exemplos) que seraacute guardado em

um array de bytes dependendo do tipo de dado que vocecirc espera do servidor natildeo esqueccedila que se vocecirc espera um dado que natildeo seja puro texto depois teraacute que converte-lo para seu estado original e caso vocecirc esteja esperando Strings como resposta use StringBuffer

icclose()

Sempre que vocecirc estabelece uma conexatildeo Http eacute aconselhaacutevel que verifique o retorno dos Headers para saber se o retorno estaacute ok atraveacutes de HttpConnectionHTTP_OK

Ex int status = -1

status = congetResponseCode() if (status == HttpConnectionHTTP_OK)

processa resultado

Dicas

Sempre que for fazer uma conexatildeo tenha uma thread separada para isso - Acesso sempre toma tempo e pode ser demorado - Mantenha algum tipo de indicaccedilatildeo de progresso para a interface com o usuaacuterio

Use GET ao inveacutes de POST - Mais simples e sem a preocupaccedilatildeo com request headers

Natildeo use URLs hard-coded - Mantenha em application descriptors o que permite alterar a URL sem

recompilaccedilatildeo

Tenha certeza de que as exceccedilotildees satildeo tratadas adequadamente Redes wireless natildeo satildeo muito confiaacuteveis prepare-se para o pior Capture todas as exceccedilotildees e proceda de forma razoaacutevel com mensagens e indicaccedilotildees

Libere memoacuteria e recursos assim que possiacutevel Em dispositivos portaacuteteis tais recursos satildeo muito escassos

- SMS via servidor

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 23: Tutorial J2ME

23

Tutorial J2ME Copyrightreg - 2005

Bom em alguns foacuteruns jaacute houve algumas perguntas sobre esse toacutepico e por isso vou comentar aqui algumas coisas Jaacute foi pedido como poderia ser feito para mandar sms de servidores remotos ou atraveacutes de uma aplicaccedilatildeo J2ME Bom o que eacute necessaacuterio eacute um contrato com uma operadora a qual lhe forneceraacute passagem livre do seu IP (computador remoto) pela rede dela lhe permitindo o envio dessas mensagens nada tem o que ver com a tecnologia J2ME E obviamente natildeo haacute a necessidade de se construir uma aplicaccedilatildeo pra isso sendo que os celulares jaacute possuem isso nativo Poreacutem existe a API Wireless Messaging API (WMA) que pode ser usada em suas aplicaccedilotildees para mandar mensagens

- Armazenamento em celulares (RecordStores)

A persistecircncia em celulares eacute tratada com RecordStores que satildeo conjuntos de registros e instacircncias de javaxmicroeditionrmsRecordStore

Cada recordStore eacute identificado por um nome que deve ser uacutenico sua criaccedilatildeo eacute feita de forma simples e bem sugestiva da seguinte forma

RecordStoreopenRecordStore( NomeQualquer true) O paracircmetro boolean da chamada do meacutetodo indica que se true o RecordStore

seraacute aberta e se natildeo existir seraacute criada O false apenas abre uma RecordStore existente Lembre-se tambeacutem que sempre que for manusear um RecordStore vocecirc precisa usar try catch pois estas operaccedilotildees geram exceccedilotildees como RecordStoreException RecordStoreFullException RecordStoreNotFoundException

Assim como abrimos os recordStores temos que fecha-los e sempre que abrir um recordStore e assim que ele natildeo for mais necessaacuterio fecha-lo pois lembremos que trabalhamos com uma memoacuteria bem reduzida natildeo esqueccedila que o meacutetodo pauseApp tambeacutem deve fechar os recordStores O meacutetodo para fechar o recordStore eacute nada mais que

ObjetoRecordStorecloseRecordStore()

A estrutura de Armazenamento do um RecordStore eacute bem simploacuteria possui apenas um id e um array de Bytes como local para armazenagem de dados Se vocecirc estaacute acostumado com banco de dados e com uma estrutura de linhas e colunas esqueccedila Se quiseres guardar mais que uma informaccedilatildeo no array de Bytes teraacutes que trabalhar com este array colocando algum caractere de controle para seu armazenamento (Ex Nome | Telefone) Somente como exemplo noacutes trabalhamos com uma aplicaccedilatildeo onde era preciso guardar um nome e uma fotografia e entatildeo colocaacutevamos o nome + carc_de_Controle +Foto[ ] e entatildeo na hora de listar essas fotos tiacutenhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto a qual tinhamos que pegar o array e entatildeo criar um Image e entatildeo colocaacutevamos em um ImageItem

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 24: Tutorial J2ME

24

Tutorial J2ME Copyrightreg - 2005

Cada registro pode ser lido ou modificado segundo seu ID que eacute retornado a cada inserccedilatildeo

public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele Para deletar records usamos o meacutetodo public void deleteRecord(int ID) Quando deletamos um record o seu id continua existindo natildeo sendo

reorganizada a lista ou seja quando vocecirc quiser listar um RecordStore deve-se testar se ainda existe aquele record por comparaccedilatildeo de Arrays atraveacutes do meacutetodo getRecordSize()

Os records podem ser listados a partir de RecordEnumeration Na Classe Recorstore temos um meacutetodo que lista todos os records de determinada recordStore retornando um RecordEnumeration Este meacutetodo eacute o

RecordStoreenumerateRecords()

Isso serve para que seja possiacutevel percorrer todos os elementos do recordStore a partir dos meacutetodos da classe RecordEnumeration nextRecord() previousRecord()

Para controlar o laccedilo de listagem desses records usa-se o meacutetodo hasNextElement() do RecordEnumeration

Importante saber que quando um record eacute excluiacutedo os iacutendices(IDs) dos elementos permanecem como estatildeo natildeo haacute reorganizaccedilatildeo dos IDs Apenas eacute possiacutevel reorganizar o Enumeration desse RecordStore

Este meacutetodo pede paracircmetros de comparaccedilatildeo que natildeo abordaremos agora poreacutem o meacutetodo pode ser usado como descrito abaixo

recEnum=rsExcluirenumerateRecords(nullnullfalse)

Ou seja retorna todos os elementos e o false informa que esse Enumeration natildeo seraacute reorganizado automaticamente caso haja alguma alteraccedilatildeo na RecordStore Para eliminar um Enumeration usa-se o meacutetodo destroy()

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 25: Tutorial J2ME

25

Tutorial J2ME Copyrightreg - 2005

- Canvas

Como jaacute vimos Canvas eacute uma classe estendida de Displayable que nos permite trabalhar livremente com graacuteficos e figuras em mais baixo niacutevel A partir da classe Graphics eacute que podemos desenhar figuras primitivas imagens e textos em qualquer lugar dentro do espaccedilo de resoluccedilatildeo da tela do dispositivo Tambeacutem eacute a partir do Canvas que podemos desenvolver animaccedilotildees como jogos e apresentaccedilotildees usando-se de recursos de Threads (processamento concorrente)

Canvas daacute liberdade ao desenvolvedor A classe Canvas necessita que o desenvolvedor implemente o meacutetodo paint() que recebe como paracircmetro um objeto da classe Graphics Mas o desenvolvedor natildeo precisa se preocupar com esse objeto Graphics pois o sistema eacute quem chama esse meacutetodo Poreacutem pode-se forccedilar a renderizaccedilatildeo da tela chamando o meacutetodo repaint() Em uma animaccedilatildeo esse meacutetodo repaint() fica dentro de um laccedilo renderizando a sequumlecircncia da animaccedilatildeo

Para jogos isso eacute muito importante pois eacute isso que daacute movimento ao jogo Para um jogo haacute algumas estrateacutegias de controle de movimentaccedilatildeo que podem ser adotadas As principais satildeo

-dependentes de frame (quadro) -dependentes de tempo -dependentes de evento

Cada uma tem sua aplicaccedilatildeo sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animaccedilatildeo iraacute rodar mais lentamente o mesmo natildeo ocorre se usarmos a estrateacutegia dependente de tempo o que veremos eacute um frameskip maior mas natildeo comprometendo o tempo exato do fim da animaccedilatildeo

Jaacute a dependente de evento eacute usada para jogos pouco interativos que natildeo tenham transiccedilatildeo graacutefica intermitente

Mas como a estrateacutegia dependente de tempo eacute considerada a mais importante delas para games eacute esta que iremos abordar aqui

Para falarmos disso precisamos antes falar sobre a classe Timer que eacute a classe que iraacute fazer os frames serem colocados na tela a cada intervalo de tempo

A classe Timer serve para agendar tarefas usando o meacutetodo schedule() podemos fazer certas tarefas serem executadas em intervalos de tempo determinados Esses tempos satildeo definidos nos paracircmetros passados ao meacutetodo schedule()

void schedule(TimerTask task Date time) Agenda uma tarefa especiacutefica em um determinado horaacuterio

void schedule(TimerTask task Date firstTime long period) Agenda uma tarefa especiacutefica que seraacute repetida num intervalo

especificado por periodo a partir do horaacuterio definido por firstTime

void schedule(TimerTask task long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado

tempo

void schedule(TimerTask task long delay long period) Agenda uma tarefa para ser repetida no intervalo de period depois de

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 26: Tutorial J2ME

26

Tutorial J2ME Copyrightreg - 2005

delay

Para parar a execuccedilatildeo de determinada tarefa utiliza-se o meacutetodo cancel() descrito abaixo

void cancel() Finaliza o agendamento da tarefa

Existem outros meacutetodos para agendar(para maiores informaccedilotildees consulte a API do J2ME localizada no diretoacuterio docs do seu Wireless Toolkit)

Ok mas agora como agendar minha tarefa para executar repetidamente Para agendar tarefas eacute necessaacuterio criar uma classe que herde de TimerTask e

implementar o meacutetodo run() com a tarefa que vocecirc deseja que seja executada E entatildeo passar essa classe como primeiro paracircmetro do meacutetodo schedule() da classe Timer

Agora que aprendemos a teoria vamos ver como ficaria uma aplicaccedilatildeo com renderizaccedilatildeo dependente de tempo

Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela

import javaxmicroeditionlcdui

class MeuCanvas extends Canvas posiccedilatildeo do objeto que se movimentaraacute na tela

private int x=0 private int y=0 int largura int altura

public MeuCanvas()

thislargura=thisgetWidth() thisaltura=thisgetHeight()

public void paint(Graphics g)

pinta o fundo da tela de branco e o objeto de preto gsetColor(255255255) gfillRect(00thislargurathisaltura) gsetColor(000) gdrawRect(xy1515)

vamos criar meacutetodos para mudarmos a posiccedilatildeo do quadrado na tela public void setPositionX(int x) thisx=x public void setPositionY(int y) thisy=y

Temos a classe que iraacute pintar objetos na tela agora precisamos de algueacutem para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos Como jaacute aprendemos para isso vamos usar a classe Timer e a TimerTask

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 27: Tutorial J2ME

27

Tutorial J2ME Copyrightreg - 2005

Ok que tarefas precisamos agendar para a nossa aplicaccedilatildeo Como nossa aplicaccedilatildeo eacute dependente de tempo e natildeo de frame temos que

separar a tarefa de pintar na tela da tarefa de movimentar o objeto Como assim Natildeo entendi Veja natildeo podemos movimentar o objeto e pintaacute-lo na tela na mesma tarefa

agendada pois se fosse assim o objeto iria movimentar-se somente quando a tela fosse pintada fazendo com que a movimentaccedilatildeo do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela Isso faz com que sua aplicaccedilatildeo rode como deveria num celular raacutepido e rode de forma insatisfatoacuteria em outro mais lento

O objeto precisa se movimentar independentemente se ele estaacute sendo mostrado na tela ou natildeo O fato de natildeo mostrar todos os movimentos do objeto eacute comumente chamado de frameskip

Por exemplo nos jogos de PC geralmente temos um jogo rodando a 20 frames por segundo numa maquina com geforce4 mx e o mesmo jogo rodando a 60 frames por segundo numa Radeon X850XT no entanto a velocidade com que vocecirc atravessa um corredor no jogo eacute a mesma

Entendido isso vamos prosseguir

Precisamos de duas tarefas para serem agendadas uma para a movimentaccedilatildeo e outra para pintar na tela

Vamos laacute

import javautilTimerTask

class TarefaMovimento extends TimerTask

como precisamos acessar o meacutetodo setPositionX() e setPositionY() da classe MeuCanvas

temos que passaacute-la como paracircmetro no construtor MeuCanvas canvas precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura int altura

precisamos do ponto de movimento e variaacuteveis pra troca de sentido do movimento int x=1 int y=1 int xs=1 int ys=1

public TarefaMovimento(MeuCanvas canv)

thiscanvas=canv thislargura=thiscanvaslargura thisaltura=thiscanvasaltura

public void run()

troca o sentido do movimento if(xlt=0 || xgt=thislargura-15) - 15 pois esa eacute a largura do quadrado xs=-1 if(ylt=0 || ygt=thisaltura-15) - 15 pois esa eacute a largura do quadrado ys=-1

incrementa ou decrementa as posiccedilotildees x+=(1xs) y+=(1ys)

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 28: Tutorial J2ME

28

Tutorial J2ME Copyrightreg - 2005

muda a posiccedilatildeo na classe MeuCanvas thiscanvassetPositionX(x) thiscanvassetPositionY(y)

Agora vamos fazer a tarefa para pintar o objeto na tela

import javautilTimerTask

class TarefaRenderizacao extends TimerTask

MeuCanvas canvas public TarefaRenderizacao(MeuCanvas canv)

thiscanvas=canv public void run() precisamos apenas pintar o objeto na posiccedilatildeo que a outra tarefa o deixou no momento

thiscanvasrepaint()

Jaacute temos as duas tarefas agora precisamos agendaacute-las Isso iremos fazer na classe principal do Aplicativo aquela que herda de MIDlet

Vamos laacute

import javaxmicroeditionmidlet import javaxmicroeditionlcdui import javautil

public class DependenteTempo extends MIDlet implements CommandListener

Command sair Display tela MeuCanvas canvas

TarefaMovimento tm TarefaRenderizacao tr Timer timerMov Timer timerRender

public DependenteTempo()

thissair=new Command(SairCommandEXIT0) thiscanvas=new MeuCanvas() thiscanvasaddCommand(thissair) thiscanvassetCommandListener(this)

criamos as tarefas de movimento e renderizaccedilatildeo thistm=new TarefaMovimento(thiscanvas) thistr=new TarefaRenderizacao(thiscanvas)

cria um Timer(Agendador) para cada tarefa thistimerMov=new Timer() thistimerRender=new Timer()

public void startApp()

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 29: Tutorial J2ME

29

Tutorial J2ME Copyrightreg - 2005

thistela=DisplaygetDisplay(this) thistelasetCurrent(thiscanvas)

agenda cada tarefa com seu tempo de repeticcedilatildeo determinado nesse caso deixei a movimentaccedilatildeo mais frequumlente que a renderizaccedilatildeo thistimerMovscheduleAtFixedRate(thistm010) thistimerRenderschedule(thistr0100)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command cDisplayable d)

if(c==thissair)

thisdestroyApp(true) thisnotifyDestroyed()

Pronto agendamos as tarefas no inicio da aplicaccedilatildeo (startApp()) e temos um quadrado se movimentando por toda a tela

Para rodar isso em seu WTK basta vocecirc criar um novo Projeto com o nome de DependenteTempo e adicionar todas as classes acima no diretoacuterio src da sua aplicaccedilatildeo

Natildeo se esqueccedila que o nome do arquivo de cada classe deve ser o nome da classe e a extensatildeo de codigos fonte java (java)

Se vocecirc conseguiu rodar vocecirc pode perceber que a movimentaccedilatildeo do objeto estaacute um pouco truncada o quadrado parece estar pulando

Agora abra o fonte DependenteTempojava e edite os tempo de repeticcedilatildeo no schedule() de renderizaccedilatildeo onde estaacute 100 coloque 10 por exemplo Agora salve e recompile

Execute e veja o que aconteceu

O que acabamos de ver eacute um dos princiacutepios mais importantes para o desenvolvimento de games

- Codificando

A estrutura baacutesica de uma MIDlet daacute-se por

inicio do coacutedigo import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class HelloWorld extends MIDlet implements CommandListener

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 30: Tutorial J2ME

30

Tutorial J2ME Copyrightreg - 2005

public HelloWorld () metodo construtor da classe

public void startApp() meacutetodo chamado sempre ao iniacutecio de uma aplicaccedilatildeo

public void pauseApp() meacutetodo chamado quando a aplicaccedilatildeo eacute interrompida por exemplo quando chega uma ligaccedilatildeo ou uma mensagem sms

public void destroyApp(boolean condicional) meacutetodo chamado quando uma aplicaccedilatildeo seraacute fechada ela fica aguardando o Garbage Collector

public void commandAction(Command c Displayable d)

meacutetodo onde seraacute implementado quase toda aplicaccedilatildeo e os comandos chamados pelas softKeys

Fim do Coacutedigo

Com isso podemos ver que a estrutura de uma aplicaccedilatildeo eacute simples poreacutem por ser assim tatildeo simples agraves vezes restringe a implementaccedilatildeo

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 31: Tutorial J2ME

31

Tutorial J2ME Copyrightreg - 2005

Coacutedigos Exemplos

Obs Comentaacuterios jaacute feitos natildeo seratildeo repetidos Sujestatildeo Copie e cole os coacutedigos em um editor para melhor visualizaccedilatildeo

ExemploCommandsAndTicker

import javaxmicroeditionmidlet import javaxmicroeditionlcdui

extends de MIDlet para que o Aplication Manager possa interpretar esse aplicativo como sendo um aplicativo MIDP e impelementa CommandListener para que a classe tenha que tratar accedilotildees de bototildees public class ExemploCommandsAndTicker extends MIDlet implements CommandListener

Display tela TextBox texto Ticker ticker Command sair opcao1 opcao2 opcao3 opcao4 opcao5

public ExemploCommandsAndTicker()

instanciar TextBox thistexto = new TextBox(Commands Aplicaccedilatildeo iniciada 20 TextFieldANY)

thisticker = new Ticker(Exemplo de ticker que deve rodar em cima da tela) seta o ticker na tela thistextosetTicker(thisticker)

comandos do TextBox thissair = new Command(Sair CommandEXIT 0) thisopcao1 = new Command(Opccedilatildeo 1 CommandSCREEN 1) thisopcao2 = new Command(Opccedilatildeo 2 CommandSCREEN 2) thisopcao3 = new Command(Opccedilatildeo 3 CommandSCREEN 3) thisopcao4 = new Command(Opccedilatildeo 4 CommandSCREEN 4) thisopcao5 = new Command(Opccedilatildeo 5 CommandSCREEN 5)

relacionar Commands com TextBox thistextoaddCommand(sair) thistextoaddCommand(opcao1) thistextoaddCommand(opcao2) thistextoaddCommand(opcao3) thistextoaddCommand(opcao4) thistextoaddCommand(opcao5)

registrar TextBox com o CommandListener thistextosetCommandListener(this)

public void startApp() obter tela do dispositivo thistela = DisplaygetDisplay(this)

setar Displayable corrente para a tela thistelasetCurrent(thistexto)

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 32: Tutorial J2ME

32

Tutorial J2ME Copyrightreg - 2005

public void pauseApp()

public void destroyApp(boolean i)

aqui precisamos de um command e um displayable o displyable seraacute o componente ativo na tela porque ele extende de Display public void commandAction(Command c Displayable d) if (c == thissair) sair da aplicaccedilatildeo thisdestroyApp(true)esse meacutetodo internamente vai chamar o GC thisnotifyDestroyed()notifica sua destruiccedilatildeo para a VM

if (c == thisopcao1) alterar texto do TextBox thistextosetString(Opccedilatildeo 1 selecionada) thistickersetString(Opccedilatildeo 1 Selecionada)

pode-se implementar as outras opcoes aqui use a imaginacao ou espere aprender mais algumas coisas e entao acrescente

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 33: Tutorial J2ME

33

Tutorial J2ME Copyrightreg - 2005

ExemploListAndAlert

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploListAndAlert extends MIDlet implements CommandListener Display tela TextBox t1 Command sair prox prox1 Alert alarme confirmacao erro info aviso List menu exclusiva multipla

public ExemploListAndAlert() criamos os arrays de opcoes que irao aparecer nas lists em aplicaccedilotildees comerciais podem haver lists criadas dinamicamente String[] menuElementos = Alarme Confirmaccedilatildeo Erro Info Aviso Exclusiva Multipla String[] exclusivaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6 String[] multiplaElementos = Opcao1 Opcao2 Opcao3 Opcao4 Opcao5 Opcao6

instancia todos os alerts vamos deixar todos eles com null no campo de icone thisalarme = new Alert(AlarmeAlerta de AlarmenullAlertTypeALARM)

setamos o tempo que ele ficaraacute na tela antes de sumir lembrando que o tempo decorrido natildeo seraacute exatamente esse thisalarmesetTimeout(5000) thisconfirmacao = new Alert(ConfirmacaoAlerta de confirmacaonullAlertTypeCONFIRMATION) thisconfirmacaosetTimeout(4000) thiserro = new Alert(ErroAlerta de ErronullAlertTypeERROR)

fizemos deste alert um alert modal que esperaraacute uma intervencao do usuario thiserrosetTimeout(AlertFOREVER) thisinfo = new Alert(InfoAlerta de InfonullAlertTypeINFO) thisaviso = new Alert(AvisoAlerta de AvisonullAlertTypeWARNING)

instancia os comandos thisprox = new Command(ProxCommandSCREEN1) thisprox1 = new Command(Prox CommandSCREEN1) thissair = new Command(SairCommandEXIT0)

instancia os textbox thist1 = new TextBox(Result200TextFieldANY)

relacionar comandos as textboxes thist1addCommand(sair) thist1setCommandListener(this)

instanciar lists criando a lista exclusiva com o array de elementos criado acima thisexclusiva = new List(Exclusiva ChoiceEXCLUSIVE exclusivaElementos null) thisexclusivaaddCommand(thissair) thisexclusivaaddCommand(thisprox)

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 34: Tutorial J2ME

34

Tutorial J2ME Copyrightreg - 2005

criando a lista multipla com o array de elementos criado acima thismultipla = new List(Multipla ChoiceMULTIPLE multiplaElementos null) thismultiplaaddCommand(thissair) thismultiplaaddCommand(thisprox1)

criando a lista implicita com o array de elementos criado acima esta lista sera noss menu principal thismenu = new List(MenuChoiceIMPLICITmenuElementosnull) thismenuaddCommand(thissair) thismenusetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void destroyApp(boolean i)

public void pauseApp()

public void commandAction(Command c Displayable d) String opcao =

if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

if (c == thisprox) pega a String do item selecionado para por no textbox opcao = thisexclusivagetString(thisexclusivagetSelectedIndex()) thist1setString(opcao) thistelasetCurrent(thist1)

if (c == thisprox1) usamos esse laccedilo para verificar quais opccedilotildees foram selecionadas para entao apresentalas for(int count=0 countlt6 count++) if (thismultiplaisSelected(count)) adicionamos as opcoes em uma string soacute opcao = opcao+thismultiplagetString(count)+n thist1setString(opcao) thistelasetCurrent(thist1)

aqui comparamos se o comando veio de uma lista e tambem se a lista era a lista menu if ((c == ListSELECT_COMMAND) ampamp (d == thismenu)) int selecionado = thismenugetSelectedIndex() aqui verificamos se foi selecionado um dos Alerts

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 35: Tutorial J2ME

35

Tutorial J2ME Copyrightreg - 2005

entao ele eh acionado e apos ser mostrado a tela anterior que eacute o menu eh mostrado novamente switch (selecionado) case 0 thistelasetCurrent(thisalarme) break case 1 thistelasetCurrent(thisconfirmacao) break case 2 thistelasetCurrent(thiserro) break case 3 thistelasetCurrent(thisinfo) break case 4 thistelasetCurrent(thisaviso) break aqui temos as outras listas case 5 thisexclusivasetCommandListener(this) thistelasetCurrent(thisexclusiva) break case 6 thismultiplasetCommandListener(this) thistelasetCurrent(thismultipla) break

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 36: Tutorial J2ME

36

Tutorial J2ME Copyrightreg - 2005

ExemploTextBox

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploTextBox extends MIDlet implements CommandListener

TextBox nome mail resultado senha Command sair proximo login fim Display tela

public ExemploTextBox()

construtores dos atributos defindos acima thisnome = new TextBox(Nome 20 TextFieldANY) thissenha = new TextBox(Senha 20 TextFieldPASSWORD) thismail = new TextBox(Mail 20 TextFieldEMAILADDR) thisresultado = new TextBox(Resultado 30 TextFieldANY)

construtores dos commands que irao ser adicionados aos objetos thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Proximo CommandSCREEN 1) thislogin = new Command(Login CommandSCREEN 1) thisfim = new Command(Fim CommandSCREEN 1)

adicao dos commands aos aos objetos e satildeo setados como commandListener thisnomeaddCommand(thissair) thisnomeaddCommand(thisproximo) thisnomesetCommandListener(this)

thissenhaaddCommand(thissair) thissenhaaddCommand(thislogin) thissenhasetCommandListener(this)

thismailaddCommand(thissair) thismailaddCommand(thisfim) thismailsetCommandListener(this)

thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

meacutetodo executado ao inicio de Execuccedilao da MIDlet public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisnome)

meacutetodo executado se a MIDlet foir pausada por ela mesma ou por um evento externo public void pauseApp()

meacutetodo chamado quando a aplicaccedilatildeo for encerrada natildeo haacute necessidade de ser implementada public void destroyApp(boolean condicional)

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 37: Tutorial J2ME

37

Tutorial J2ME Copyrightreg - 2005

meacutetodo chamado assim que um command for adicionado public void commandAction(Command c Displayable d) definiccedilao do que seraacute feito quando um command for acionado if (c == thissair) thisnotifyDestroyed() notifica que seraacute destruido thisdestroyApp(true) chama o destrutor

if (c == thisproximo) thistelasetCurrent(thissenha) seta como ativo na tela

if (c == thislogin) thistelasetCurrent(thismail)

if (c == thisfim) seta a String do objeto resultado pegando o que foi inserido nos campos anteriores thisresultadosetString(thisnomegetString()+ +thismailgetString()) thistelasetCurrent(thisresultado)

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 38: Tutorial J2ME

38

Tutorial J2ME Copyrightreg - 2005

ExemploForm1

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

public class ExemploForm1 extends MIDlet implements CommandListener

Display tela Form login resultado TextField nome senha StringItem resultadoMsg Command sair proximo

public ExemploForm1() inicializar Commands thissair = new Command(Sair CommandEXIT 0) thisproximo = new Command(Prox CommandSCREEN 1)

form de login thislogin = new Form(Login) thisnome = new TextField(Nome 20 TextFieldANY) thissenha = new TextField(Senha 20 TextFieldANY | TextFieldPASSWORD)

adiciona-se os componentes ao Form Login thisloginappend(thisnome) thisloginappend(thissenha) thisloginaddCommand(thissair) thisloginaddCommand(thisproximo) thisloginsetCommandListener(this)

form de resultado thisresultado = new Form(Resultado) thisresultadoMsg = new StringItem()

adiciona-se o componente ao Form Resultado thisresultadoappend(thisresultadoMsg) thisresultadoaddCommand(thissair) thisresultadosetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thislogin)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 39: Tutorial J2ME

39

Tutorial J2ME Copyrightreg - 2005

if (c == thisproximo) O Label sempre apareceraacute antes do Text natildeo importando a ordem que vc adicione ele ao componente faccedila o teste trocando de ordem as chamdas thisresultadoMsgsetLabel(thisnomegetString()+ ) thisresultadoMsgsetText(thissenhagetString()) thistelasetCurrent(thisresultado)

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 40: Tutorial J2ME

40

Tutorial J2ME Copyrightreg - 2005

ExemploGauge

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

neste exemplo vamos implementar mais duas interfaces o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais do teclado do dispositivo e a interface Runnable desempenha o papel de uma Thread onde poderiamos ter usado uma classe extra extendendo de Thread no entanto preferimos simplificar a implementaccedilatildeo O processamente paralelo seraacute usado afim de mostrar o movimento do gauge nao interativo usamos o recurso de Thread por que natildeo haveria possibilidade de incrementar nosso gauge e mostra-lo na tela na mesma linha de execuccedilao

public class ExemploGauge extends MIDlet implements CommandListener ItemStateListener Runnable

Display tela List menu Form gauge1 gauge2 Gauge inter ninter Command sairCommand menuCommand Thread minhaThread

public ExemploGauge() inicializar Commands thissairCommand = new Command(Sair CommandEXIT 0) thismenuCommand = new Command(Menu CommandSCREEN 1)

menu principal String[] menuElementos = Interativo Natildeo Interativo thismenu = new List(Menu Principal ListIMPLICIT menuElementos null) thismenuaddCommand(thissairCommand) thismenusetCommandListener(this)

declararemos um for para cada gauge gauge interativo thisgauge1 = new Form(Interativo) setamos o label inicial do gauge true para torna-lo interativo 50 eacute o numero de toques qeu ele necessitaraacute para ser completado 0 para indicar seu inicio thisinter = new Gauge(0 true 50 0) thisgauge1append(thisinter) thisgauge1addCommand(thissairCommand) thisgauge1addCommand(thismenuCommand) thisgauge1setCommandListener(this) preparamos este form para ouvir os direcionais do teclado thisgauge1setItemStateListener(this)

gauge nao-interativo thisgauge2 = new Form(Natildeo Interativo) mesma coisa que o gauge anterior somente do false indica qeu este gauge esta somente sobre controle do programa thisninter = new Gauge(0 false 100 0) thisgauge2append(thisninter)

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 41: Tutorial J2ME

41

Tutorial J2ME Copyrightreg - 2005

thisgauge2addCommand(thissairCommand) thisgauge2addCommand(thismenuCommand) thisgauge2setCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thismenu)

public void pauseApp()

public void destroyApp(boolean condicional)

public void commandAction(Command c Displayable d) if (c == thissairCommand) thisdestroyApp(true) thisnotifyDestroyed() if (c == thismenuCommand) thistelasetCurrent(thismenu)

verifica qual item da lista do menu principal foi selecionado if (c == ListSELECT_COMMAND ampamp d == thismenu) se for o primeiro item que eacute o gauge interativo ele apresenta o gauge e espera por comandos if (thismenugetSelectedIndex() == 0) thistelasetCurrent(thisgauge1)

se for o gauge nao interativo ele inicial nossa thread a qual controlaraacute nosso gauge fazendo-o aumentar ateacute onde determinarmos if (thismenugetSelectedIndex() == 1) thistelasetCurrent(thisgauge2) thisminhaThread = new Thread(this) minhaThreadstart()

controle do gauge interativo conforme o valor vai mudando ele vai aprensentando na tela o valor correspondente e como setamos ele para que fosse somente ateh 50 multiplicamos por 2 os valores para supostamente chegar a 100 public void itemStateChanged(Item i) if (i == thisinter)

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 42: Tutorial J2ME

42

Tutorial J2ME Copyrightreg - 2005

thisintersetLabel( +(thisintergetValue()2)+)

controle do gauge Nao interativo execuccedilatildeo da nossa Thread (Runnable) public void run() for (int cont = 1 cont lt= 100 cont++) usamos este try-catch porque precisamos usar o sleep para dar uma pausa pequena para melhor vizualizacao do incremento por curiosidade auemnte e dimunua o valor do sleep lembre-se o valor eacute dado em milisegundos try Threadsleep(30) catch (Exception e) thisnintersetValue(cont) thisnintersetLabel( +cont+)

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 43: Tutorial J2ME

43

Tutorial J2ME Copyrightreg - 2005

ExemploConnectionImage

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ConnectionImage extends MIDlet implements CommandListener Display tela form onde seraacute exibida a imagem Form imageForm ImageItem onde a foto que viraacute do servidor seraacute salva ImageItem foto comandos Command buscarCommand sairCommand string com a url para a imagem colocamos a url diretamente aqui somente para exemplo uma ideacuteia seria vc deixar o usuario setar esse link em um textbox ou algo do genero

String url = httpwwwseusitecombrsuafotopng public ConnectionImage()

thisimageForm = new Form()

imageItem onde seraacute posta a imagem que vier do server inicializamos ela com zero o qual poderia ser feito na hora de postar thisfoto = new ImageItem(fotonull0)

thissairCommand = new Command(Sair CommandEXIT 0) thisbuscarCommand = new Command(Buscar CommandSCREEN 1)

thisimageFormaddCommand(thissairCommand) thisimageFormaddCommand(thisbuscarCommand)

thisimageFormsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisimageForm)

public void pauseApp()

public void destroyApp(boolean bool)

public void commandAction(Command c Displayable d) if (c == thissairCommand)

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 44: Tutorial J2ME

44

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed() else if(c == buscarCommand) se jaacute houver um ImageItem no form ele iraacute deleta-lo antes de jogar uma nova imagem if (imageFormsize() gt 0)

for (int i = 0 i lt imageFormsize() i++) imageFormdelete(i)

try Image im chama o meacutetodo que busca a imagem im = getImage(thisurl) thisfotosetImage(im) imageFormappend(thisfoto) Display the form with the image thistelasetCurrent(imageForm) catch(Exception e)

Abre uma conexatildeo http e baixa um arquivo png em um array de bytes private Image getImage(String url) throws IOException usamos aqui ao inveacutes de httpconnection a conexao padrao o qual nao nos garante nada embora a conexao http tambem nao seja muito confiavel ContentConnection connection = (ContentConnection) Connectoropen(url) DataInputStream iStrm = connectionopenDataInputStream()

Image im = null

try byte imageData[] int length = (int) connectiongetLength() if (length = -1) imageData = new byte[length]

Le um png em um array iStrmreadFully(imageData) else se o tamanho natildeo estaacute disponiacutevel ByteArrayOutputStream bStrm = new ByteArrayOutputStream()

int ch while ((ch = iStrmread()) = -1) bStrmwrite(ch)

imageData = bStrmtoByteArray()

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 45: Tutorial J2ME

45

Tutorial J2ME Copyrightreg - 2005

bStrmclose()

Cria a imagem de um array de bytes im = ImagecreateImage(imageData 0 imageDatalength) finally Clean up if (iStrm = null) iStrmclose() if (connection = null) connectionclose() return (im == null null im)

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 46: Tutorial J2ME

46

Tutorial J2ME Copyrightreg - 2005

ExemploHttpConnection

Este exemplo faz uma conexao http com um server o qual retorna um lista de usuarios dos quais nos podemos entao fazer uma consulta apenas selecionando ele da lista e a outra url nos retornaraacute os dados da pessoa Isto eacute soacute um exemplo a parte ServerSide fica de sua responsabilidade visto que nao eacute este nosso objetivo As paginas podem tanto ser jsp como Servlets

import javaxmicroeditionlcdui import javaxmicroeditionmidlet import javaxmicroeditionio import javaio

public class ExemploConnect extends MIDlet implements CommandListener

Display tela List registros result Command sair listar voltar String url = wwwseusitecombrsuaPaginajsp

public ExemploConnect() thissair = new Command(SairCommandEXIT 0) thislistar = new Command(ListarCommandSCREEN 1) thisvoltar = new Command(Voltar CommandSCREEN 0)

thisregistros = new List(ClientesListIMPLICIT) thisregistrosaddCommand(thissair) thisregistrosaddCommand(thislistar) thisregistrossetCommandListener(this)

thisresult = new List(Dados Cliente ListIMPLICIT) thisresultaddCommand(thisvoltar) thisresultsetCommandListener(this)

public void startApp() thistela = DisplaygetDisplay(this) thistelasetCurrent(thisregistros)

public void pauseApp()

public void destroyApp(boolean b)

public void commandAction(Command c Displayable d) if(c == thissair) thisdestroyApp(true) thisnotifyDestroyed()

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 47: Tutorial J2ME

47

Tutorial J2ME Copyrightreg - 2005

chama a funccedilatildeo que faz a conexao com a pagina if(c == thislistar) thisconecta(thisregistros)

quando chamar o voltar limpa a lista para evitar que sejam readicionados os mesmo itens na proxima conexao if(c == thisvoltar) int tamanho = thisresultsize() for(int i= 0 i lt tamanho i++) thisresultdelete(i) thistelasetCurrent(thisregistros)

verifica o item escolhido e entao pega o codigo e o junta com a url para fazer a busca no servidor if(c == ListSELECT_COMMAND) String linha = thisregistrosgetString (thisregistrosgetSelectedIndex()) String cod = linhasubstring(0linhaindexOf(-)) String urlBusca = wwwseusitecombrBuscaCodigojspcod= thisurl = urlBusca+cod

passamos a lista como parametro pois eacute onde sera montado o resultado da busca thisconecta(result) thistelasetCurrent(thisresult)

public void conecta(List lista) try estabelecemos uma conexao http com a url HttpConnection con = (HttpConnection) Connectoropen(thisurl) int status = -1 status = congetResponseCode()

como a conexao foi http eacute verificado o status da conexao if(status == HttpConnectionHTTP_OK) InputStream is = conopenInputStream() StringBuffer sb = new StringBuffer()

int lido = isread()

como podemos perceber abaixo eacute lido byte a byte do servidor while (lido = -1) byte b1 = (byte)lido

if(b1 == (byte)n) listaappend(sbtoString()null) sbsetLength(0) else

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 48: Tutorial J2ME

48

Tutorial J2ME Copyrightreg - 2005

sbappend((char)b1) lido = isread() se nao conseguir estabelecer conexao colocamos esta mensagem como padrao else listaappend(Nenhum Registro Encontrado null) catch (IOException io1)

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 49: Tutorial J2ME

49

Tutorial J2ME Copyrightreg - 2005

ExemploCanvas

Vamos construir um exemplo do uso do Canvas em J2ME Canvas eacute o uso de graficos em nivel baixo Vamos a ele

import javaxmicroeditionlcdui import javaxmicroeditionmidlet

Toda a aplicacao tem que extender de MIDlet e implementar a interface CommandListener caso vc queira interagir com a aplicaccedilatildeo

public class ExemploCanvas extends MIDlet implements CommandListener Display tela Command sair para desenhar na tela precisamos da Classe Canvas como nossa classe principal natildeo pode extender a classe Canvas criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas classe criada mais a baixo

public ExemploCanvas() thistela=DisplaygetDisplay(this)

thissair=new Command(SairCommandEXIT0)

inicia o NossoCanvas thiscanvas=new NossaCanvas()

adiciona o comando sair ao canvas thiscanvasaddCommand(thissair)

prepara o canvas para escutar os comandos thiscanvassetCommandListener(this)

public void startApp() define a tela para o objeto NossoCanvas que vai desenhar na tela thistelasetCurrent(thiscanvas)

public void pauseApp() natildeo precisa executar nada se natildeo quiser

public void destroyApp(boolean b) natildeo precisa executar nada se natildeo quiser

metodo abstrato da interface CommandListener eacute ativado quando algum comando eacute acionado public void commandAction(Command c Displayable d) reconhece que o comando foi o sair e executa if(c==thissair)

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 50: Tutorial J2ME

50

Tutorial J2ME Copyrightreg - 2005

thisdestroyApp(true) thisnotifyDestroyed()

classe criada extendendo de Canvas class NossaCanvas extends Canvas public NossaCanvas()

metodo abstrato de Canvas que pinta na tela ele eacute acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) gsetColor(255255255) define uma cor RGB

gfillRect(009664) cria um retangulo ja pintado com a cor definida

gsetColor(128) existe tambeacutem uma sobrecarga para este meacutetodo com cor de 8 bits gdrawRect(558859) desenha um retangulo sem preenchimento gsetColor(192) cria-se uma variavel String porque o meacutetodo drawString() nao aceita o uso de lala diretamente no meacutetodo String teste=NoSSo Canvas define o texto as coordenadas e onde as coordenadas devem ser consideradas na string gdrawString(teste77GraphicsLEFT|GraphicsTOP)

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 51: Tutorial J2ME

51

Tutorial J2ME Copyrightreg - 2005

Referecircncias Bibliograacuteficas

Keogh James - J2ME The Complete Reference Editora Osborne

Knudsen Jonathan Wireless Java Developing with J2ME Editora Apress

Almeida Leandro Batista de - Material de Apoio

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 52: Tutorial J2ME

52

Tutorial J2ME Copyrightreg - 2005

Copyright

Natildeo eacute autorizado o uso desta apostila indevidamente sem autorizaccedilatildeo entenda-se reproduccedilatildeo para fins lucrativos ou disponibilizaccedilatildeo sem preacutevia autorizaccedilatildeo

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only

Page 53: Tutorial J2ME

This document was created with Win2PDF available at httpwwwdaneprairiecomThe unregistered version of Win2PDF is for evaluation or non-commercial use only