P. 1
Tutorial J2ME

Tutorial J2ME

|Views: 111|Likes:
Publicado porGustavo Souza

More info:

Published by: Gustavo Souza on Jul 23, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

03/28/2013

pdf

text

original

Sections

  • - Entendendo J2ME
  • - Configuration
  • - Profiles
  • - Tecnologias Wireless
  • - Diferença entre MIDP 1.0 e 2.0
  • - API's
  • - Criando projetos, Compilando e Executando
  • - Ciclo de Vida de uma MIDlet
  • - Interface
  • - Commands
  • - TextBox
  • - Tickers
  • - Forms
  • - Item
  • - Lists
  • - Imagens
  • - Alerts
  • - SMS via servidor
  • - Armazenamento em celulares (RecordStores)
  • - Canvas
  • - Codificando
  • Códigos Exemplos
  • ExemploCommandsAndTicker
  • ExemploListAndAlert
  • ExemploTextBox
  • ExemploForm1
  • ExemploGauge
  • ExemploConnectionImage
  • ExemploHttpConnection
  • ExemploCanvas
  • Copyright

1

Apostila de J2ME
versão 1.1 Juliano Carniel - juliano@portaljava.com Clóvis Teixeira - clv@portaljava.com

Tutorial J2ME Copyright® - 2005

2

Índice
- INTRODUÇÃO: ..............................................................................................................................4 - ENTENDENDO J2ME ....................................................................................................................5 - CONFIGURATION.........................................................................................................................5 - PROFILES........................................................................................................................................5 - SEGURANÇA ..................................................................................................................................7 - TECNOLOGIAS WIRELESS ........................................................................................................8 - DIFERENÇA ENTRE MIDP 1.0 E 2.0..........................................................................................9 - API'S .................................................................................................................................................9 - CRIANDO PROJETOS, COMPILANDO E EXECUTANDO ...................................................9 - CICLO DE VIDA DE UMA MIDLET ........................................................................................13 - INTERFACE ..................................................................................................................................13 - COMMANDS .................................................................................................................................14 - TEXTBOX ......................................................................................................................................16 - TICKERS........................................................................................................................................16 - FORMS ...........................................................................................................................................16 - ITEM ...............................................................................................................................................17 - LISTS ..............................................................................................................................................19 - IMAGENS ......................................................................................................................................20 - ALERTS..........................................................................................................................................20 - CONEXÕES ...................................................................................................................................21 - SMS VIA SERVIDOR ...................................................................................................................22 - ARMAZENAMENTO EM CELULARES (RECORDSTORES) .............................................23 - CANVAS .........................................................................................................................................25 - CODIFICANDO ............................................................................................................................29 CÓDIGOS EXEMPLOS..................................................................................................................31
Tutorial J2ME Copyright® - 2005

3 EXEMPLOCOMMANDSANDTICKER ..................................................................................................31 EXEMPLOLISTANDALERT ...............................................................................................................33 EXEMPLOTEXTBOX.........................................................................................................................36 EXEMPLOFORM1 .............................................................................................................................38 EXEMPLOGAUGE .............................................................................................................................40 EXEMPLOCONNECTIONIMAGE .........................................................................................................43 EXEMPLOHTTPCONNECTION ...........................................................................................................46 EXEMPLOCANVAS ...........................................................................................................................49 REFERÊNCIAS BIBLIOGRÁFICAS ...........................................................................................51 COPYRIGHT ...................................................................................................................................52

Tutorial J2ME Copyright® - 2005

4

Apostila de J2ME
- Introdução:
Comecemos com uma pergunta básica, porém não menos importante. O que vem a ser esse J2ME? E para que serve? Java 2 Micro Edition é 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 1.0 voltada para aplicações gráficas, porém não vamos tratar de jogos aqui, embora após a leitura deste, você pode ter um embasamento para começar a desenvolver algo na área. As aplicações criadas usando-se MIDP são chamadas MIDlets (assim como Servlets e Applets). Usamos os programas: - Wireless Tollkit que é um software gratuito feito pela Sun para simplificar o ciclo de desenvolvimento do J2ME o qual pode ser encontrado em http://wireless.java.sun.com/allsoftware/ (é necessário que você já tenha o j2sdk instalado http://java.sun.com/j2se), você ainda pode baixar outros emuladores encontrados na mesma pagina do Wireless Toolkit para posteriores testes. - E o editor GEL que é free, e é um ótimo editor facilitando muito na edição com auto-complete de métodos e muitas outras facilidades que este programa provê, e pode ser encontrado em www.gexperts.com . Caso você já tenha algum outro programa como o Eclipse (www.eclipse.org), por exemplo, pode-se usa-lo também fazendo as devidas modificações, existe um plugin chamado EclipseME (http://eclipseme.sourceforge.net) que pode ser utilizado para auxiliar nesse desenvolvimento. A abordagem desta apostila foca-se no MIDP1.0 e CLDC1.0 por ainda ser maioria no mercado e também para que possamos contemplar bem os recursos para se desenvolver uma aplicação J2ME. Se fossemos discutir a fundo os novos recursos do MIDP2.0 e CLDC1.1 teríamos que dar uma abrangência muito maior do que a que já damos nesta apostila e esse não é o nosso objetivo para esta versão do material.

Tutorial J2ME Copyright® - 2005

5

- Entendendo J2ME
J2ME basicamente é dividido em configurations, profiles e API's opcionais.

- Configuration
A configuration mais básica do J2ME é o CLDC (Connected Limited Device Configuration) e também 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 provê algumas bibliotecas básicas 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 é que uma série de API s padrões que combinadas com alguma configuration, no nosso caso o CLDC, prove um serviço completo para que aplicações possam ser rodadas. E a profile que nós iremos trabalhar é a MIDP. Celulares, em sua quase totalidade hoje no mercado trabalha com o MIDP1.0 e CLDC1.0. Para entendermos melhor, pensemos da seguinte maneira, Profiles são mais específicos que configurations, e fazendo analogia a um velho exemplo, temos uma
Tutorial J2ME Copyright® - 2005

Limited Device Configuration). Podem haver vários Profiles vamos citar dois aqui os quais são os mais importantes para este estudo. porém é muito difícil dizer ao certo pois o acesso a informações desse tipo nas especificações dos fabricantes é bem restrito. pois no mínimo 16MHz são requeridos. que rege as configurações para aparelhos bem pequenos como celulares ou PDA's. Você não leu errado e nem nós trocamos unidades de medidas.2005 . os quais despedem de muito processamento e uso de memória.6 abstração sobre o que é um carro e como ele é fabricado (configuration) e como um Ford é fabricado (profile). o que nos faz pensar muito em termos de aplicações que podem rodar neles. embora já nos faz analisar melhor códigos e métodos usados. CLDC como já vimos. ele foi desenvolvido para dispositivos de no mínimo 160KB e algumas dezenas de MHz de processamento. existem dois "configurations". um configuration é o CLDC (Connected. rege as configurações para aparelhos extremamente pequenos. tipicamente de Tutorial J2ME Copyright® . mas mesmo assim pequenos. e se tratando de aparelhos tops de linha podem chegar até 300MHz ou um pouco mais (até a composição desta matéria). mais tecnicamente falando profile é baseado em configuration e ainda acima dos profiles estão as API's que na nossa analogia seria um modelo específico da Ford. MIDP (Mobile Information Device Profile) e também o PDAP (Personal Digital Assistant Profile) e ambos estão acima do CLDC. a memória está realmente certa. o qual fica acima das diretrizes J2ME juntamente com CDC (Connected Device Configuration) o que rege as configurações para aparelhos um pouco maiores. Como já foi citado. e nos traz de volta a certas programações para DOS no que diz respeito à memória. mas muito mesmo. E também a conexão lenta. E falando em memória relevemos também o processamento que é muito fraco.

MIDP tem as seguintes características: .8KB de memória não-volátil de para armazenamento de dados. os quais dizem ter uma tela ampla de 96x54. teclado externo ou mesmo Touch-screen.Possibilidade de enviar e receber dados em conexão possivelmente intermitente e banda reduzida.Uma tela de pelo menos 96x54 pixels (aqui já cai por terra a propaganda de muitos celulares. No caso dos jogos de celulares. ou programas maliciosos? Por meio do J2ME.Um processador de 16 bits ou 32 bits com um clock de no mínimo 16MHz.2005 . Tutorial J2ME Copyright® . . um pouco diferente do J2SE. .32KB de memória volátil para tempo de execução. a (WORA) "Write Once. . podendo assim aproveitar melhor o desempenho do aparelho.Pelo menos 192KB livres para Java. . muito difícil. cada fabricante disponibiliza uma API específica para os jogos.Segurança Uma pergunta freqüentemente feita é: Agora com programas rodando nos celulares não iremos ter problemas de vírus.7 9. apesar de ser mais seguro. porém cai por terra a forte característica de vida do JAVA. A maquina virtual tem um espaço independente de memória (sand-box). Run Anywhere!". .600bps para aparelhos TDMA/CDMA e de 128Kbps para GPRS/CDMA 1xRTT. .Capacidade de entrada de dados seja por teclado (do celular). . perde-se um pouco a funcionalidade. . o que é o mínimo necessário). porém ja temos visto celulares sendo atacados por vírus que exploram falhas do Sistema operacional e não de uma aplicação J2ME.Mínimo de 160kB de memória não-volátil para JAVA. e não pode acessar a memória correspondente às aplicações nativas do celular assim como é feito com os Applets.

2005 . Vamos tentar defini-las e diferencia-las em poucas palavras.net . embora seja chamado de vírus. ou seja.600bps(conseguindo-se taxa máxima). Além de a taxa de transferência que é maior chegando a 256Kbps usando CDMA 1xRTT.br/SeparataTELCO50.sit. tem as mesmas características da tecnologia CDMA.terra. on-line todo tempo. para uma série específica da Nokia. sendo que este não é o enfoque principal deste Tutorial. não existe este delay de conexão você requisita uma informação e ela vem diretamente. . porém este worm não faz nada no celular.Tecnologias Wireless Muitas pessoas ainda têm dúvidas sobre as diferentes tecnologias de celulares existentes.GSM: (global system for communication. ou seja. que é o que esta em vigor. e tanto esta tecnologia quando a GSM são conexão 100% ativa. ou sistema global de comunicação).com. porém opera usando GPRS.htm e http://idgnow. Caso haja maior interesse nas tecnologias de transmissão e na evolução e tudo mais que diz respeito recomendo estes sites http://www. pois se propaga sozinho através da interface de Bluetooth do celular. ou acesso múltiplo por divisão de códigos). O vírus. para somente depois poder transmitir. www. Quem tem algum celular tdma sabe o quão caro e lento é isso. se encaixa mais na qualidade de WORM. apenas tenta se propagar para outros celulares. é separado voz de dados. Somente para estabelecer a conexão leva-se uns 8 segundos e a transferência de dados dá-se a 9.br/idgnow/telecom/2002/09/0043 ainda em. ou seja. . Tutorial J2ME Copyright® . ou acesso múltiplo por divisão do tempo). . ou seja. ele não diferencia voz e dados então para navegar na internet(dados) você paga o mesmo preço que pagaria por fazer uma ligação de voz. Como foi falado acima.TDMA: (time division multiple access.CDMA: (code division multiple access. . ou seja. porém pelo provado pelo uso hoje dessas tecnologias.8 Nota dos Autores: Pouco tempo antes da revisão dessa segunda versão da apostila. pois fica com a interface de Bluetooth ligada e procurando alguém que responda para se retransmitir. Um malefício provocado é gastar bateria do celular. aquela que usa SymbianOS. as conexões eram para ser 100% ativas.com.gsmworld. vemos que ele precisa de uma primeira conexão o que também despende alguns segundos. surgiu o primeiro vírus para celulares. não danifica nada.

Você tem ainda outras restrições como: Sem user classLoading Sem finalização de objetos (finallize() de java. se desejas trabalhar com contas. Sem RMI e sem JINI Sem métodos nativos. a não ser os fornecidos pela JVM nativa.1 do CLDC já possui suporte a ponto flutuante.0) Opcionalmente.9 .microedition. e já se aproxima mais do J2SE.1 traz bastante recursos. . temos a diferença na comunicação de dados que é o mais interessante aqui como.Object) Garbage collector existe.lang. por exemplo.2005 . MultiThreading (sem interrupt(). o CLDC1.io java.Diferença entre MIDP 1.0 não possui suporte a ponto flutuante.0 e 2. ou seja. as conexões no CLDC1.microedition. Além desses métodos a mais.0 Existem algumas diferenças entre as versões.lang java.control (somente na 2. pause(). resume() e stop()) Sem thread groups e thread Deamons .media. e tratamento de sons.lcdui. e valores reais terás que manuseá-los em código mesmo.util javax. fabricantes podem fornecer API's JAVA para acesso a partes especificas de cada aparelho. já na 1.pki (somente na 2.0 são feitas através do protocolo http que no caso é inseguro no envio de informações.microedition. Compilando e Executando Tutorial J2ME Copyright® .game (somente na 2.rms javax.0 como classes para jogos.com/ohommes/MathFP . com Permissions Types.rr. Com relação à segurança.microedition.midlet javax.1) java.Criando projetos.0 você pode baixar programas específicos pra isso como esse programa encontrado em http://home. como todos sabemos a cada versão mais nova é sempre incrementado mais funções.API's A CLDC 1.microedition.rochester.0) javax. A versão 1.microedition.ref (somente CLDC1.media (somente na 2.io javax.lcdui javax.microedition.0 está implementado o https (ssl) conexão com criptografia que já é conhecida de todos. porém não executa método automático.lang. porém mesmo com a versão 1. java.0) javax. e algumas facilidades maiores da 2. Aqui listamos os Packages disponíveis para as versões.microedition.0) javax. Protection Domains baseados em IP's e PKI's.

pois é feito segundo estes passos: Editar código fonte. Compilar. devemos primeiramente abrir o Wireless ToolKit e criar um Projeto. Empacotar. Depois em Project Name defina o nome do seu projeto. Depois de tudo instalado corretamente. a qual nos deu um embasamento melhor para sabermos o que estamos fazendo. Tutorial J2ME Copyright® . e logo abaixo o nome da classe de sua midlet que deve ser igual ao nome do projeto. Testar e/ou Instalar. Pré-Verificar.10 Bom depois de muita teoria.2005 . e a mais esperada por todos. para isso clique em New Project. O processo de desenvolvimento de MIDlet's é um pouco mais complexo do que de outros programas feitos em JAVA. vamos a uma parte mais prática.

png. Tutorial J2ME Copyright® .2005 . que é o icone que aparecerá no celular de sua aplicação você pode modificá-lo colocando o nome de uma figura personalizada. tem um link para uma figura . apenas lembre-se que a figura deve ficar no devido diretório (path_WTK/apps/Sua_Aplicacao/res). para cada aplicação é criado uma árvore de diretórios conforme ilustrado abaixo. a única coisa que poderias mudar seria o Vendor Name. Em seguida abrirá uma tela que contém informações sobre a sua aplicação. pois é por esse arquivo que o celular reconhecerá seu aplicativo antes de ser baixado. o qual você pode colocar o nome de sua empresa.11 Feito isso ele terá criado vários diretórios dentro de path_WTK/apps/Sua_Aplicacao/. (aconselho a não mudar o que está lá). se ele é apto a rodar ou não seu programa. Se vocês verificarem a última aba desta tela (aba MIDlets). e sempre para qualquer aplicação deve-se por dentro do diretório /res. ou o que desejares.

depois de baixado você deve copiar o arquivo retroguard. Tome um pouco de cuidado com os obfuscators. BUILD.2005 . e RUN. métodos não usados e ainda inserem dados ilegais ou questionáveis para confundir Descompiladores. e quanto menor sua aplicação for. Este programa. Para criar um pacote obfuscado você precisa de algum programa Obfuscator.com.jar dentro do diretório bin do wirelessToolkit. Obfuscator Como vimos dispositivos celulares possuem memória muito reduzida.retrologic. a criar nossos códigos. pode ser encontrado em www. Para isso usamos o Obfuscator que é usado para diminuir o tamanho dos arquivos eliminando redundância e também para evitar engenharia reversa. melhor será para o celular. estamos aptos. pois em alguns celulares a sua aplicação pode acabar não funcionando. Após a criação do projeto.12 Existem dois botões que serão muito utilizados por nos. variáveis e métodos para nomes mais compactos. um bom programa. Tutorial J2ME Copyright® . removem classes. os quais são auto-explicativos. e finalmente. (Ex: c:\WTK104\bin). o Retroguard. renomeia classes.

contendo a VM. Nessa instancia de Display são inseridos heranças de Displayable. As aplicações são desenvolvidas com uma certa abstração de tela. pois o desenvolvedor precisa conhecer o dispositivo previamente para melhor aproveitamento de recursos. As classes de cada aplicativo estão em um arquivo JAR. onde e como serão armazenados e como serão executados.Ciclo de Vida de uma MIDlet O Aplication Manager (AM) de cada dispositivo é quem vai controlar os aplicativos a serem instalados. o qual vem acompanhado de um descritor JAD. ou SMS chegando. o AM invoca o método startApp(). pois os comandos e insersão de dados são feitos através dos botões do celular.13 . A tela do dispositivo é representada por uma instância da classe Display. somente fica disponível após o inicio da Aplicação (startApp()). sem alterações porém isso torna-se bastante difícil na parte de Interface com usuário. touch-Screens e outros aspectos. Já no desenvolvimento de jogos a aplicação é bem mais específica.2005 . e isto não é sabido previamente. ocorre o mesmo com o DestroyApp() que é invocado pela AM para fechar a aplicação ou até mesmo pode ser fechada através da própria aplicação invocando o notifyDestroyed(). pois dispositivos variam de tamanho de tela. a qual é obtida pelo método getDisplay(). como disposição em tela por exemplo. Tutorial J2ME Copyright® . cores. geralmente contida no método startApp(). . Assim como a AM pode pausar a aplicação e esta a si mesma. teclados. As aplicações descobrem isto em Runtime e se comportam de maneira apropriada a cada celular. Assim que a MIDlet é invocada.Interface As MIDlets devem poder ser executadas em qualquer dispositivo. A aplicação pode pausar a si mesma. Enquanto ela estiver executando o AM pode pausar ela invocando o método pauseApp() no caso de uma chamada sendo recebida. bastando invocar notifyPaused(). que terá todas as informações as quais já vimos anteriormente. o qual coloca a midlet no estado Active. pois o método getDisplay().

os quais são adicionados a componentes visuais. itens de menu.Commands Os commands como vimos. Esperar por Ação do Usuário. são usados para interação do usuário com a aplicação.14 public void startApp() { Display d = Display. os quais são chamados pelo método setCurrent() o qual seta o objeto que será mostrado. que podem ser: softkeys. Low-level API's que engloba a classe Canvas e suas heranças. botões e Tutorial J2ME Copyright® . As ações do usuário são gerenciadas por comandos (commands). . objetos já instanciados. . } Na tela são mostrados componentes. as quais proporcionam uma área livre para gráficos. os quais são acionados por elementos reais do dispositivo.getDisplay(this). Sua aplicação básica é na troca de Displayables.. pois são classificados como objetos de Interface.2005 . Repetir.. E também temos as classes Screen e Canvas as quais podemos dividir em duas classes: High-level API's que engloba a classe Screen e suas heranças. Decidir qual Displyable mostrar em seguida. O ciclo básico de uma MIDlet pode ser definido por: Mostrar um Displayable.

Command. public void setCommandListener(CommandListener) Exemplo: TextBox t1 = new TextBox( Texto .comando1) { . e navegação em geral. comandos são adicionados a Displayables. Para isso que serve a prioridade setada nos botões.SCREEN. Os commands são geralmente relacionados a SoftKeys ou SoftButtons. . pois em runtime é que eles irão definir o local apropriado para se posicionarem na tela. etc). Esses commands são entidades abstratas e podem ser adicionados arbitrariamente para cada elemento Screen ou Canvas.addCommand(ComandoSair). } } Tutorial J2ME Copyright® . Geralmente possui-se dois botões de SoftKeys. Command. Displayable d) { if (c==this. ou seja. os quais são auto-explicativos. Command(String Label. cada displayable pode possuir um CommandListener o qual é invocado assim que um command é acionado. porém isso não significa que você precisa só ter dois commands sendo implementados. que vem como herança quando a MIDlet herda CommandListener. pois se houver mais commands que botões eles são agrupados e é aberto um menu. você terá que implementar a ação de cada command selecionado. 0). O tratamento dos commands é feito com o conceito de Listeners. ou seja. os quais ficarão dentro de um método chamado commandAction. Command. ou em primeiro lugar no menu. ele vai ficar onde normalmente fica os comandos de Exit do próprio celular. //comando feito acima Método commandAction public void commandAction(Command c.15 dispositivos de acionamento.. t1.. Para cada objeto que herda de Diplayable existem os métodos addCommand(Command) e removeCommand(Command). t1.2005 . As ações dos commands são totalmente dependente do código. Os commands tem três propriedades: Label: texto mostrado ao usuário na interface. int Type. que são botões existentes nos celulares os quais são usados para menus. 10. Priority: prioridade dos comandos que são utilizados para mostrar os comandos mais utilizados com maior facilidade.EXIT.OK. a prioridade 0 (mais prioritário) indica que esse command deve ser mostrado nas softKeys. Ex: ComandoSair = new Command( Sair . Type: tipo do comando.EXIT. sem uma função única. por exemplo.TextField. Command. ou seja.ANY).BACK. int Priority).setCommandListener(this). Dica: busque sempre a utilização dos correta dos tipos de Commands (Command. se um command é setado com o tipo EXIT.

E os métodos para manuseio dessas Tickers não poderiam ser outros senão: public void setTicker(Ticker ticker) public Ticker getTicker . String texto. Constraints são as constantes da classe TextField. pois cada um implementa isso da sua maneira. Ticker ticker = new Ticker( Esta mensagem deve passar na tela ). ele serve para poder-se colocar mais de um componente na tela. pois a rolagem dos forms tende a ser confuso nos dispositivos. Mas lembre-se. a qual não poderá ser usada. ficar lembrando toda hora. ANY(para numeric e texto). e de qualquer outro programa que é deixar o usuário feliz e menos cansado e entediado. TextBox t2 = new TextBox( Nome: . int constraints). .. . d. Texto é mostrado dentro do textbox. e o ticker tomara mais uma linha para si.16 . tam_Max tamanho máximo de caracteres que será alcançado pelo textBox. o qual pode conter mais de um controle de interface chamados Item. semelhante as tickers de mercados de ações. TextField. a tela do celular já é pequena para sua aplicação.2005 . . como string inicial. etc. e semelhante ao <marquee> de html. além de tornar seu aplicativo esteticamente mal feito. TextField. Exemplos: TextBox t1 = new TextBox( Nome: .setTicker(ticker). 30. ou algo de enfeite que você queira colocar. O recurso de Ticker serve para algum texto informativo que possa ser importante. O construtor de um TextBox é: public TextBox(String titulo. cuidado para não deixar um form muito grande com muitos componentes.ANY | TextField. onde: Titulo é mostrado no topo da tela. pois o usuário muitas vezes não irá saber se há mais objetos a serem preenchidos.PASSWORD). // Displayable d = . int tam_Max. 20..Forms Form é uma herança de Screen e Displayable.ANY). e por isso temos que aprimorar essa técnica e manter o bom padrão de uma MIDlet. que determinam que tipo de dado o campo aceitará ex: NUMERIC. Para criarmos um form temos duas sobrecargas: Tutorial J2ME Copyright® .Tickers Ticker nada mais é que um texto que corre no topo da tela.TextBox É um componente básico que serve para entrada de texto(string) em celulares. Todos sabemos o quão entediante é a entrada de dados em celulares. Sua criação é simples. e por isso não deve se tornar uma prática corriqueira. mas com as limitações da MIDlet é claro. Apesar de haver rolagem automática quando todos os objetos não cabem na tela. PASSWORD(mascara o texto). Um form tem a mesma função de um Container em AWT/SWING.

e cada um com sua determinada função.17 public Form(String Titulo). insert(int Indice.2005 . e o método insert adiciona um item no índice indicado movendo os outros existentes para baixo. podem ou não ser mostrados. setText(). Juliano ). Os métodos de trabalho com os forms são: append(Item item). Vamos relata-los aqui. getText(). Tutorial J2ME Copyright® . Text ). . StringItem nada mais é que um simples Label com um texto. Esses itens são inseridos em forms. Item item). public Form(String Titulo. set(int Indice. Item item). eles podem ter comandos associados a eles. Os itens podem ser adicionados e removidos mesmo com os forms sendo mostrados. StringItem( Label: . . onde Codigo é a parte Label.Item Como já foi falado existem vários tipos de itens. Ex: StringItem strItem = new StringItem( Nome: form. Como vimos os forms recebem itens os quais são divididos em diversos tipos cada um com sua finalidade. existem os métodos de manipulação: getLabel(). Ex: Código: 1. Item[] itens). eles podem ou não ter um Label. para todos os exemplos abaixo: Form form = new Form( Form de teste ). A partir de agora vamos usar o mesmo form que criaremos agora.append(strItem). Lembre-se que o método append adiciona um novo item no final da lista. setLabel(). e 1 é a parte Texto. delete(int Indice). Para este Item. Esses diversos tipos de itens estendem da classe Item.

No construtor deve ser especificado a Label e o tipo de dado. int Constraints) Ex: TextField tf = new TextField( Digite seu Nome: 30. DateField É uma interface usada para datas. e podem ser: LAYOUT_DEFAULT. setValue(). PASSWORD. Este item possui um label. que permite a ação do usuário sobre seu valor.LAYOUT_DEFAULT. Para este item existem os métodos de manipulação: getString(). URL).2005 .18 TextField é uma string editável. *somente existentes no MIDP 2. um texto alternativo e pode ser posicionado segundo um layout.ANY). form. ImageItem. TextField.append(imgItem). LAYOUT_CENTER. Alt Text ). int TamMax. ou seja. 1). String texto_alt).DateField. horas ou ambos. PHONENUMBER. true. ImageItem(String Label.png ). String Text. Image imagem. ImageItem mostra a instância de uma Imagem dentro de um form. LAYOUT_NEWLINE_BEFORE*. o interativo. como irá aparecer é por conta do Celular e o programador não tem controle sobre isso. getValue(). Os valores podem ser alterados em tempo de execução. 20.0 Ex: Image img = new Image. e como ele será mostrado depende da implementação de cada aparelho. img. int modo).append(tf). Tutorial J2ME Copyright® . pelos comandos getMaxValue(). Ex: Gauge g = new Gauge( Gauge Interativo . EMAILADDR. e Não interativo controlado somente pelo programa.DATE_TIME public DateField(String Label. setMaxValue(). public Gauge(String Label. int ValorInicial). NUMERIC. boolean Interativo. DateField. ImageItem imgItem = new ImageItem( Foto . form. setString(). LAYOUT_RIGHT. LAYOUT_NEWLINE_AFTER*).DateField. Gauges É uma representação gráfica de um valor inteiro. TextField(String Label.DATE . As constraints são as mesmas do TextBox (ANY. que pode ser: . int ValorMaximo. . você precisa já de um objeto Image.createImage( /foto. Ex: DateField data = new DateField( Data: .TIME . .DATE ). ou melhor exemplificando um campo para preencher. LAYOUT_LEFT.DateField. Existem dois tipos de gauges. Os layouts são constantes da classe. int Layout.

int tipo. que deixa a lista semelhante a um menu DropDown. Já na MIDP 2.0 é implementado o tipo POPUP. public ChoiceGroup(String label. int tipo. Quando é selecionado um item em uma lista Implicit. não poderá ser nulo. Existem três tipos de listas. Esses elementos podem ser representados tanto por Strings quanto por Imagens. sendo que para esta List já foi anteriormente adicionando um CommandListener. Cada elemento da list possui um índice. E ainda tem a list Multiple. Esse índice inicia em 0. Aplicação pode tratar eventos de alteração de estado em Itens Interface ItemStateListener método public void itemStateChanged(Item item) Registra-se o listener com o método: setItemStateListener(ItemStateListener listener) . int tipo) public List(String titulo. Existem duas sobrecargas para este construtor.19 ChoiceGroup é uma lista de escolhas semelhante a List. Implicit. existem alguns métodos que valem a pena ser comentados aqui. insert: insere um elemento em uma posição indicada por um índice. será criado uma rolagem.2005 . no qual você pode iniciar os Arrays de elementos e de Imagens ou não. que lembra uma lista de Radio. public List(String titulo. ela é por conta da VM. Image[] imagens) Quando uma lista tornar-se grande demais para a tela. Append: inclui um elemento ao final da lista. Exclusive.Lists Como o próprio nome diz são listas. a qual não cabe a nós implementa-la. ele força os outros elementos uma posição à frente. que nos permite selecionar várias opções. o método CommandAction é chamado. porém não tem o tipo Implicit. se utilizado. que funciona como uma CheckList já conhecida de todos. Os tipo de listas são Exclusive e Multiple. as quais permitem ao usuário selecionar itens (elements) de uma lista. mas poderá conter elementos nulos. delete: remove o elemento indicado pelo índice. String[] elementos. Image[] imagens) Eventos de Itens Os Itens possuem eventos de alteração de Estado. permite somente a seleção de uma opção e para seleciona-la deve-se usar um botão com um Command setado. Que são: set: altera o elemento do qual o índice foi fornecido. String[] elementos. Implicit deixa você escolher uma opção e clicar no botão padrão de seleção ou em um command que você adicionar. Para editar uma list. Se este índice estiver no meio da lista. os quais aparecerão em branco na tela. ambos implementam a interface Choice. EX: Tutorial J2ME Copyright® . O array de elementos. int tipo) public ChoiceGroup(String label. que podem ser manejados para. Exclusive e Multiple.

até o tamanho indicado. Image imagem). public static Image createImage(int largura. outros com GIF. Essas imagens podem ser Mutáveis ou Imutáveis. . quando ele é compilado e empacotado. O segundo construtor obtém a imagem de um Arrray de Bytes. Image imagem).Alerts Um alert nada mais é que uma mensagem informativa ao usuário. Imagens em MIDP 2. int tamanho) O primeiro construtor busca o arquivo indicado pelo nome na pasta /res.20 public void set(int indice. de sua aplicação no caso de uso do emulador. BMP. ele é basicamente uma telinha que mostra uma mensagem e logo depois sai da tela. int x.2005 . Imagens imutáveis podem ser criadas a partir de outras imagens mutáveis. As mutáveis podem ser modificadas pelo Objeto Graphics. ImageItems. tem a mesma idéia de um alert de javascript. public void insert(int indice. o que não ocorre em todos os celulares. int largura. obtido pelo método getGraphics(). a imagem é empacotada junto com o programa. Alguns trabalham com JPG. partindo da posição offset. public static Image createImage(Image image. public int getSelectedIndex(): que me retorna o índice que foi escolhido. ChoiceGroups. int transformacao) . int altura) Lembre-se que as imagens passadas para Alerts.Imagens A especificação de MIDP determina que a implementação deverá ser capaz de manipular Imagens PNG. String elemento. int y. public static Image createImage(Image imagem) Somente um comentário à parte. Para se criar imagens mutáveis deve-se usar o seguinte método. porém é muito raro você conseguir encontrar a especificação de cada aparelho para isso. e até mesmo PNG sem compactação. esses dois construtores citados acima geram imagens imutáveis. ou Lists devem ser Imutáveis. String elemento. ou qualquer outra linguagem. somente para listas Implicit e Exclusive.0 podem ser criadas à partir de porções de outras imagens já existentes. Dois métodos bastante utilizados que valem a pena ser comentados são: public boolean isSelected(int indice): que me diz se o índice esta selecionado atualmente. Porém. quando não é usado o padrão. Tutorial J2ME Copyright® . int offset. public int append(String elemento. o que torna muito difícil a programação com imagens. ou VB. public void delete(int indice). public static Image createImage(String nome) public static Image createImage(byte[] dados. Image imagem). int altura. ou seja.

Asterisco(*) e Underscore(_) são mantidos. . porém algumas implementações particulares de celulares podem oferecer HttpsConnection.microedition.microedition. e possui vários tipos. cada qual com seu ícone e som.io e é baseada na interface Connection. como Alarm..Connector. O Http trabalha com o processo de response/request incluindo Headers no processo. métodos e outros(RFC 2616).// timeout para 5 segundos O comportamento padrão de um Alert é mostar a próxima tela setada. Alerts são criados com um tempo default para desaparecer. se usado o método setCurrent(atual.io. e todo qualquer outro caractere é convertido em %xy. temos os métodos GET. Os parâmetros passados na url são codificados antes da transmissão o que garante integridade da informação e padronização. Ex: Alert alerta. próximo). Confirmation. e na pior das hipóteses entedia o usuário. A conexão na CLDC 1. onde xy é o valor Hexadecimal que representa os 8 bits menos significativos do caractere. alerta.z. No Timed Alert. null).). E o alerta modal que aparece e fica esperando uma intervenção do usuário. que funciona passando-se uma string de conexão para um método estático de Connector e retorna uma Connection com resultado. alerta = new Alert( Alerta . porém essas conexões ainda são lentas. a.. public Alert() public Alert(String titulo. porém o servidor só responde Tutorial J2ME Copyright® . as quais são definidas pela CLDC que é bem flexível. A.FOREVER. Hífen(-). null. este por estar já acostumado com uma conexão rápida e confiável. Ambos os métodos tratam das particularidades do protocolo Http como Headers. podemos transforma-lo em modal adicionando ao parâmetro AlertType para Alert.2005 .1 a obrigatoriedade é passada para a implementação do HttpsConnection. os quais também podem ser setados pelo desenvolvedor. ou ele irá voltar para a tela atual se for usado. Warning. e também configurado por setTimeout().. Info. tempo qual é implementado na VM. através de HttpConnection. POST e HEAD. GET enviando parâmetros na URL.. Para isso ela usa o Package javax.Z.. o que nos dificulta um pouco essa transmissão de dados. O link real entre a interface Connection é feito através da classe javax. . e pode ser obtido por getDefaultTimeout(). Quando criamos um Timed Alert. Error. Image icone.9. Já na CLDC 1.0 pode feita por HTTP. para isso utiliza-se de URLEncoder. A MIDP possui mecanismos genéricos para acesso a rede. SocketConnection entre outros. e o HEAD que é idêntico ao GET. onde GET e POST buscam paginas. 0. AlertType tipo) *Qualquer um ou todos os parâmetros do segundo construtor podem ser nulos. setCurrent(Alert). você pode setar um tempo ou não o qual receberá o tempo padrão do aparelho. Acesso não autorizado.Conexões Sistemas móveis geralmente oferecem acesso a dados via conexões OTA(Over The Air). String texto. ponto(. pouco confiáveis e intermitentes. enquanto POST envia os parâmetro no header. Revisando um pouco Http.setTimeout(5000).. que transforma espaços em sinais de +. ou Modal Alert.21 Esses alerts podem ser tanto Timed Alerts.

Capture todas as exceções e proceda de forma razoável.SMS via servidor Tutorial J2ME Copyright® . (aqui pode ser qualquer pagina de qualquer extensão. . status = con.2005 . passando-se uma URL para o método open() da classe connector. com mensagens e indicações. Ex: String url = servidor. que será guardado em um array de bytes dependendo do tipo de dado que você espera do servidor. Libere memória e recursos assim que possível Em dispositivos portáteis.HTTP_OK. e então ler os dados que foram retornados para você do Servidor e tratá-los conforme o que você precisa. através de HttpConnection.22 com Headers. Ex: int status = -1. Sempre que você estabelece uma conexão Http. prepare-se para o pior. não esqueça que se você espera um dado que não seja puro texto depois terá que converte-lo para seu estado original.Mais simples e sem a preocupação com request headers Não use URLs hard-coded . if (status == HttpConnection. Use GET ao invés de POST .Mantenha em application descriptors.Acesso sempre toma tempo e pode ser demorado. //aqui vai todo o processo de leitura (Veja nos Exemplos).close().openInputStream().HTTP_OK) { // processa resultado } Dicas: Sempre que for fazer uma conexão tenha uma thread separada para isso. então você deverá obter os streams de conexão InputStream e OutputStream.br/suaPagina. . da qual você irá receber o resultado como um HttpConnection ou um InputConnection (trataremos disso depois). e caso você esteja esperando Strings como resposta.open(url). use StringBuffer. é aconselhável que verifique o retorno dos Headers para saber se o retorno está ok.Mantenha algum tipo de indicação de progresso para a interface com o usuário. tais recursos são muito escassos. A conexão GET funciona.jsp . . o que permite alterar a URL sem recompilação Tenha certeza de que as exceções são tratadas adequadamente Redes wireless não são muito confiáveis. inclusive Servlets que são geralmente utilizados como resposta para MIDlets) InputConnection ic = (InputConnection) Connector. e para isso você deve antecipadamente conhecer o formato de retorno da informação vinda do servidor. ic.com.getResponseCode(). InputStream is = ic.

e sempre que abrir um recordStore. Se você está acostumado com banco de dados. existe a API Wireless Messaging API (WMA).RecordStore. e então na hora de listar essas fotos tínhamos que trabalhar com cada registro percorrendo o array inteiro para primeiro listar o nome e depois a foto. e uma fotografia. nada tem o que ver com a tecnologia J2ME. lhe permitindo o envio dessas mensagens. A estrutura de Armazenamento do um RecordStore é bem simplória. e com uma estrutura de linhas e colunas. Assim como abrimos os recordStores temos que fecha-los. O método para fechar o recordStore é nada mais que: ObjetoRecordStore. sua criação é feita de forma simples e bem sugestiva.microedition. o que é necessário é um contrato com uma operadora a qual lhe fornecerá passagem livre do seu IP (computador remoto) pela rede dela. O parâmetro boolean da chamada do método indica que se true o RecordStore será aberta e se não existir será criada. colocando algum caractere de controle para seu armazenamento (Ex: Nome | Telefone). nós trabalhamos com uma aplicação onde era preciso guardar um nome. E obviamente não há a necessidade de se construir uma aplicação pra isso sendo que os celulares já possuem isso nativo. possui apenas um id e um array de Bytes como local para armazenagem de dados. não esqueça que o método pauseApp. pois estas operações geram exceções como: RecordStoreException. como poderia ser feito para mandar sms de servidores remotos. esqueça! Se quiseres guardar mais que uma informação no array de Bytes. Tutorial J2ME Copyright® . Somente como exemplo. Cada recordStore é identificado por um nome que deve ser único. também deve fechar os recordStores. O false apenas abre uma RecordStore existente. e então colocávamos em um ImageItem. RecordStoreNotFoundException. Já foi pedido.rms. true). . a qual tinhamos que pegar o array e então criar um Image. da seguinte forma: RecordStore. e então colocávamos o nome + carc_de_Controle +Foto[ ]. fecha-lo. que pode ser usada em suas aplicações para mandar mensagens. ou através de uma aplicação J2ME. pois lembremos que trabalhamos com uma memória bem reduzida.Armazenamento em celulares (RecordStores) A persistência em celulares é tratada com RecordStores que são conjuntos de registros e instâncias de javax.2005 .23 Bom em alguns fóruns já houve algumas perguntas sobre esse tópico e por isso vou comentar aqui algumas coisas. Porém.openRecordStore( NomeQualquer . RecordStoreFullException. terás que trabalhar com este array.closeRecordStore(). Bom. Lembre-se também que sempre que for manusear um RecordStore você precisa usar try{} catch{}. e assim que ele não for mais necessário.

retorna todos os elementos e o "false" informa que esse Enumeration não será reorganizado automaticamente. não há reorganização dos IDs. o seu id. Para eliminar um Enumeration usa-se o método destroy(). através do método. Ou seja. previousRecord(). Para controlar o laço de listagem desses records.enumerateRecords(). usa-se o método hasNextElement() do RecordEnumeration. porém o método pode ser usado como descrito abaixo: recEnum=rsExcluir. Este método é o: RecordStore. usamos o método: public void deleteRecord(int ID) Quando deletamos um record. getRecordSize().24 Cada registro pode ser lido ou modificado. que é retornado a cada inserção. nextRecord(). Tutorial J2ME Copyright® . Os records podem ser "listados" a partir de RecordEnumeration.2005 . Apenas é possível reorganizar o Enumeration desse RecordStore. segundo seu ID. Este método pede parâmetros de comparação que não abordaremos agora. os índices(IDs) dos elementos permanecem como estão. não sendo reorganizada a lista. public byte[] getRecord(int recordID) Nos retorna um array de bytes para podermos trabalhar com ele.enumerateRecords(null. caso haja alguma alteração na RecordStore. continua existindo. Isso serve para que seja possível percorrer todos os elementos do recordStore a partir dos métodos da classe RecordEnumeration. ou seja. Na Classe Recorstore temos um método que lista todos os records de determinada recordStore.null. por comparação de Arrays. Importante saber que quando um record é excluído. quando você quiser listar um RecordStore deve-se testar se ainda existe aquele record.false). Para deletar records. retornando um RecordEnumeration.

Porém. Em uma animação esse método repaint() fica dentro de um laço. Para jogos isso é muito importante. pode-se forçar a renderização da tela chamando o método repaint(). void schedule(TimerTask task. Esses tempos são definidos nos parâmetros passados ao método schedule(). void schedule(TimerTask task. pois é isso que dá movimento ao jogo.25 . long delay. Canvas é uma classe estendida de Displayable. Também é a partir do Canvas que podemos desenvolver animações como jogos e apresentações. long period) Agenda uma tarefa específica que será repetida num intervalo especificado por periodo a partir do horário definido por firstTime. que recebe como parâmetro um objeto da classe Graphics. renderizando a seqüência da animação. long delay) Agenda uma tarefa para executar uma tarefa depois de um determinado tempo. void schedule(TimerTask task. podemos fazer certas tarefas serem executadas em intervalos de tempo determinados. Para falarmos disso precisamos antes falar sobre a classe Timer. void schedule(TimerTask task. pois o sistema é quem chama esse método. Canvas dá liberdade ao desenvolvedor. usando-se de recursos de Threads (processamento concorrente). imagens e textos em qualquer lugar dentro do espaço de resolução da tela do dispositivo.Canvas Como já vimos. Mas como a estratégia dependente de tempo é considerada a mais importante delas para games. Date firstTime. Já a dependente de evento é usada para jogos pouco interativos. o mesmo não ocorre se usarmos a estratégia dependente de tempo. o que veremos é um frameskip maior. As principais são: -dependentes de frame (quadro) -dependentes de tempo -dependentes de evento Cada uma tem sua aplicação. long period) Agenda uma tarefa para ser repetida no intervalo de period depois de Tutorial J2ME Copyright® . Date time) Agenda uma tarefa específica em um determinado horário. que não tenham transição gráfica intermitente. Para um jogo há algumas estratégias de controle de movimentação que podem ser adotadas.2005 . é esta que iremos abordar aqui. mas não comprometendo o tempo exato do fim da animação. que é a classe que irá fazer os frames serem colocados na tela a cada intervalo de tempo. A partir da classe Graphics é que podemos desenhar figuras primitivas. A classe Timer serve para agendar tarefas. que nos permite trabalhar livremente com gráficos e figuras em mais baixo nível. sendo que se for usada uma dependente de frame e seu celular for lento(baixa capacidade de processamento) a animação irá rodar mais lentamente. A classe Canvas necessita que o desenvolvedor implemente o método paint(). usando o método schedule(). Mas o desenvolvedor não precisa se preocupar com esse objeto Graphics.

y=y. é necessário criar uma classe que herde de TimerTask e implementar o método run() com a tarefa que você deseja que seja executada.this. para isso vamos usar a classe Timer e a TimerTask. vamos ver como ficaria uma aplicação com renderização dependente de tempo.26 delay. Primeiro cria-se uma classe que herda de Canvas para desenharmos o que queremos na tela.this.getWidth(). utiliza-se o método cancel() descrito abaixo: void cancel() Finaliza o agendamento da tarefa.altura=this. Existem outros métodos para agendar(para maiores informações.0).15). } public void paint(Graphics g) { // pinta o fundo da tela de branco e o objeto de preto g.lcdui. E então passar essa classe como primeiro parâmetro do método schedule() da classe Timer.altura). agora precisamos de alguém para mandar essa classe pintar o desenho na tela repetidas vezes numa constancia definida por um intervalo de tempo em milisegundos.15.255.255).*. int altura. g.x=x.microedition.y.0. int largura.largura=this. import javax.largura.} } Temos a classe que irá pintar objetos na tela. Agora que aprendemos a teoria.drawRect(x. } // vamos criar métodos para mudarmos a posição do quadrado na tela public void setPositionX(int x) {this. Para parar a execução de determinada tarefa. g. private int y=0. Como já aprendemos. public MeuCanvas() { this. mas agora como agendar minha tarefa para executar repetidamente? Para agendar tarefas. g. consulte a API do J2ME localizada no diretório docs do seu Wireless Toolkit) Ok. class MeuCanvas extends Canvas { // posição do objeto que se movimentará na tela private int x=0.getHeight().fillRect(0.setColor(255.} public void setPositionY(int y) {this.setColor(0. Tutorial J2ME Copyright® .0.2005 . this.

15 pois esa é a largura do quadrado {ys*=-1.. no entanto a velocidade com que você atravessa um corredor no jogo é a mesma.15 pois esa é a largura do quadrado {xs*=-1. public TarefaMovimento(MeuCanvas canv) { this. this. int y=1. Tutorial J2ME Copyright® .canvas. O objeto precisa se movimentar independentemente se ele está sendo mostrado na tela ou não. import java. Precisamos de duas tarefas para serem agendadas. não podemos movimentar o objeto e pintá-lo na tela na mesma tarefa agendada.canvas=canv. o objeto iria movimentar-se somente quando a tela fosse pintada. Como assim? Não entendi! Veja. class TarefaMovimento extends TimerTask { // como precisamos acessar o método setPositionX() e setPositionY() da classe MeuCanvas. this.largura-15)// . int xs=1. Isso faz com que sua aplicação rode como deveria num celular rápido e rode de forma insatisfatória em outro mais lento. 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.altura-15)// . que tarefas precisamos agendar para a nossa aplicação? Como nossa aplicação é dependente de tempo e não de frame.} //incrementa ou decrementa as posições x+=(1*xs). //precisamos do ponto de movimento e variáveis pra troca de sentido do movimento int x=1. pois se fosse assim. y+=(1*ys). } public void run() { //troca o sentido do movimento if(x<=0 || x>=this. // precisamos da altura e largura da tela para fazermos o algoritmo do movimento int largura..altura=this.} if(y<=0 || y>=this. uma para a movimentação e outra para pintar na tela.27 Ok. Vamos lá. int altura.altura.util. Entendido isso vamos prosseguir.canvas. //temos que passá-la como parâmetro no construtor MeuCanvas canvas. O fato de não mostrar todos os movimentos do objeto é comumente chamado de frameskip. temos que separar a tarefa de pintar na tela da tarefa de movimentar o objeto.2005 . int ys=1.TimerTask. Por exemplo.largura. fazendo com que a movimentação do objeto dependesse do desempenho do aparelho em renderizar o desenho na tela.largura=this.

import javax.canvas=canv. } public void run() { //precisamos apenas pintar o objeto na posição que a outra //tarefa o deixou no momento this. import javax.midlet. Vamos lá.2005 . public TarefaRenderizacao(MeuCanvas canv) { this.tm=new TarefaMovimento(this.canvas. this. aquela que herda de MIDlet.. MeuCanvas canvas.timerMov=new Timer().canvas).*.*. } } Agora vamos fazer a tarefa para pintar o objeto na tela.timerRender=new Timer(). TarefaRenderizacao tr.canvas).util.addCommand(this.sair=new Command("Sair".repaint().canvas.util. this. Timer timerRender.canvas=new MeuCanvas()..setPositionX(x).microedition. } public void startApp() Tutorial J2ME Copyright® . public class DependenteTempo extends MIDlet implements CommandListener { Command sair. this. import java. Display tela. TarefaMovimento tm. // criamos as tarefas de movimento e renderização this.setPositionY(y).tr=new TarefaRenderizacao(this. Isso iremos fazer na classe principal do Aplicativo. } } Já temos as duas tarefas.EXIT.sair). this.microedition. public DependenteTempo() { this. this.TimerTask.28 // muda a posição na classe MeuCanvas this.canvas. class TarefaRenderizacao extends TimerTask { MeuCanvas canvas. Timer timerMov. this.*.setCommandListener(this). // cria um Timer(Agendador) para cada tarefa this.Command.lcdui.0). import java. agora precisamos agendá-las.canvas.canvas.

tela=Display. basta você criar um novo Projeto com o nome de: DependenteTempo e adicionar todas as classes acima no diretório /src da sua aplicação. Agora salve e recompile.0. coloque 10 por exemplo.midlet. o quadrado parece estar pulando. onde está 100.*.timerMov.tm.schedule(this. Não se esqueça que o nome do arquivo de cada classe deve ser o nome da classe e a extensão de codigos fonte java (.tr.notifyDestroyed(). Se você conseguiu rodar. Agora abra o fonte DependenteTempo.java e edite os tempo de repetição no schedule() de renderização.lcdui.setCurrent(this.scheduleAtFixedRate(this. } public void pauseApp() { } public void destroyApp(boolean b) { } public void commandAction(Command c.Codificando A estrutura básica de uma MIDlet dá-se por: /*********** inicio do código **********************/ import javax.timerRender.*. Para rodar isso em seu WTK.java).Displayable d) { if(c==this. public class HelloWorld extends MIDlet implements CommandListener { Tutorial J2ME Copyright® . import javax. você pode perceber que a movimentação do objeto está um pouco truncada.100). } } } Pronto.2005 .destroyApp(true). this.getDisplay(this).microedition. Execute e veja o que aconteceu! O que acabamos de ver é um dos princípios mais importantes para o desenvolvimento de games. .10).canvas). agendamos as tarefas no inicio da aplicação (startApp()) e temos um quadrado se movimentando por toda a tela. this. this.sair) { this.tela.29 { this.0. // agenda cada tarefa com seu tempo de repetição determinado // nesse caso deixei a movimentação mais freqüente que a renderização this.microedition.

Tutorial J2ME Copyright® .2005 . e os comandos chamados pelas softKeys } } /******************** Fim do Código ************************/ Com isso podemos ver que a estrutura de uma aplicação é simples. Displayable d) { //método onde será implementado quase toda aplicação. por ser assim tão simples às vezes restringe a implementação.30 public HelloWorld () { } //metodo construtor da classe. quando chega uma ligação. ou uma mensagem sms. public void destroyApp(boolean condicional) { } //método chamado quando uma aplicação será fechada. porém. { } //método chamado sempre ao início de public void startApp() uma aplicação public void pauseApp() { } //método chamado quando a aplicação é interrompida. ela fica aguardando o Garbage Collector public void commandAction(Command c. por exemplo.

= new Command("Opção 3". Command sair.*. = new Command("Opção 4".microedition. //seta o ticker na tela this.tela. opcao4.opcao4 this.texto. import javax.ANY).texto.setTicker(this. // setar Displayable corrente para a tela this. 4). 5). opcao5.lcdui.EXIT.sair = this.texto.addCommand(opcao2).*. // registrar TextBox com o CommandListener this. } public void startApp() { // obter tela do dispositivo this. this.midlet.setCurrent(this. Command.opcao5 do TextBox new Command("Sair". = new Command("Opção 5". this. Command. 20.SCREEN.texto).tela = Display. // comandos this. "Aplicação iniciada". Command.setCommandListener(this). this.SCREEN. Command.addCommand(opcao1).addCommand(opcao5). public ExemploCommandsAndTicker() { // instanciar TextBox this.SCREEN.ticker).ticker = new Ticker("Exemplo de ticker que deve rodar em cima da tela"). TextField. this.texto. opcao1. this.opcao1 this. opcao2.texto.texto.SCREEN.texto = new TextBox("Commands".microedition.texto.SCREEN. //extends de //aplicativo //para que a public class { MIDlet para que o Aplication Manager possa interpretar esse como sendo um aplicativo MIDP e impelementa CommandListener classe tenha que tratar ações de botões . Command.texto. opcao3. Command. Ticker ticker.addCommand(opcao3).getDisplay(this).31 Códigos Exemplos Obs: Comentários já feitos não serão repetidos.opcao3 this. Sujestão: Copie e cole os códigos em um editor para melhor visualização ExemploCommandsAndTicker import javax. 0). this. TextBox texto. } Tutorial J2ME Copyright® . 3). 2).2005 . = new Command("Opção 1". ExemploCommandsAndTicker extends MIDlet implements CommandListener Display tela. = new Command("Opção 2". 1).addCommand(sair).addCommand(opcao4).opcao2 this. // relacionar Commands com TextBox this.

.opcao1) { // alterar texto do TextBox this..//esse método internamente vai chamar o GC this.notifyDestroyed().ticker. } //. Displayable d) { if (c == this.destroyApp(true). this.setString("Opção 1 Selecionada").sair) { // sair da aplicação this.2005 ."). //pode-se implementar as outras opcoes aqui //use a imaginacao //ou espere aprender mais algumas coisas e entao acrescente } } Tutorial J2ME Copyright® .//notifica sua destruição para a VM } if (c == this.texto.32 public void pauseApp() { } public void destroyApp(boolean i) { } //aqui precisamos de um command e um displayable //o displyable será o componente ativo na tela //porque ele extende de Display public void commandAction(Command c.setString("Opção 1 selecionada.

public class ExemploListAndAlert extends MIDlet implements CommandListener { Display tela.ERROR). "Opcao3".setTimeout(5000). this.null."Alerta de Erro". "Opcao6" }.confirmacao.1). Alert alarme.null.*.SCREEN.AlertType.confirmacao = new Alert("Confirmacao".EXIT. "Opcao2".t1.alarme.FOREVER)."Alerta de confirmacao".exclusiva = new List("Exclusiva".setTimeout(Alert. this.null.addCommand(this. aviso.microedition. "Opcao2". //fizemos deste alert. Command.info = new Alert("Info". "Opcao4".Command.ANY).Command. this."".addCommand(sair).33 ExemploListAndAlert import javax. "Opcao5".prox). TextBox t1. "Aviso".alarme = new Alert("Alarme". prox1. this.midlet.TextField.setCommandListener(this). confirmacao."Alerta de Alarme". String[] multiplaElementos = { "Opcao1". "Erro". import javax.INFO). public ExemploListAndAlert() { //criamos os arrays de opcoes que irao aparecer nas lists //em aplicações comerciais podem haver lists criadas dinamicamente String[] menuElementos = { "Alarme".t1. info. Command sair.microedition.ALARM). this. //instancia os comandos this.AlertType."Alerta de Info". this.200. this. "Opcao6" }. "Multipla" }.lcdui. "Confirmação". this. um alert modal //que esperará uma intervencao do usuario this. //instancia todos os alerts //vamos deixar todos eles com null no campo de icone this.*. "Opcao4".null. "Exclusiva". //instanciar lists //criando a lista exclusiva com o array de elementos criado acima this.null."Alerta de Aviso". "Info".SCREEN. exclusiva. null).CONFIRMATION).t1 = new TextBox("Result". //relacionar comandos as textboxes this.AlertType.2005 . this.AlertType.EXCLUSIVE.setTimeout(4000).exclusiva.aviso = new Alert("Aviso".erro. List menu. "Opcao3". Tutorial J2ME Copyright® .prox = new Command("Prox".erro = new Alert("Erro". exclusivaElementos.WARNING). prox.sair).addCommand(this.1).prox1 = new Command("Prox". String[] exclusivaElementos = { "Opcao1".exclusiva. "Opcao5". this.sair = new Command("Sair".AlertType. //setamos o tempo que ele ficará na tela antes de sumir //lembrando que o tempo decorrido não será exatamente esse. erro. Choice. this. multipla.0). //instancia os textbox this.

Choice.getDisplay(this).multipla. } public void startApp() { this.sair).setCurrent(this.MULTIPLE.tela. } if (c == this.menu. null).getString(this. } } this.34 //criando a lista multipla com o array de elementos criado acima this.addCommand(this. this.addCommand(this.prox1) { //usamos esse laço para verificar quais opções //foram selecionadas para entao apresentalas for(int count=0. //aqui verificamos se foi selecionado um dos Alerts Tutorial J2ME Copyright® . this. count++) { if (this. } //aqui comparamos se o comando veio de uma lista //e tambem se a lista era a lista menu if ((c == List. if (c == this.null). this.tela.menu). Displayable d) { String opcao = "".SELECT_COMMAND) && (d == this.t1).menu = new List("Menu".exclusiva. this.tela = Display.setString(opcao).setString(opcao). //criando a lista implicita com o array de elementos criado acima //esta lista sera noss menu principal this.multipla.destroyApp(true). this. this.sair) { this.IMPLICIT.getString(count)+"\n".getSelectedIndex().setCurrent(this.notifyDestroyed(). this. } public void destroyApp(boolean i) { } public void pauseApp() { } public void commandAction(Command c.menu.sair).t1.t1. this. this. } if (c == this.menu.Choice.prox1).t1).setCommandListener(this).menu)) { int selecionado = this.multipla = new List("Multipla".setCurrent(this.menuElementos.multipla.2005 .getSelectedIndex()).prox) { //pega a String do item selecionado para por no textbox opcao = this.isSelected(count)) { //adicionamos as opcoes em uma string só opcao = opcao+this. count<6.exclusiva.addCommand(this.tela.multipla. multiplaElementos.

case 5: this. this.tela.2005 .setCurrent(this. break.exclusiva.setCurrent(this.confirmacao). break.setCurrent(this.setCommandListener(this). break. case 4: this.tela.erro).35 //entao ele eh acionado. break.. //aqui temos as outras listas.exclusiva). break.setCurrent(this. e apos ser mostrado //a tela anterior que é o menu //eh mostrado novamente switch (selecionado) { case 0: this. break.tela. case 6: this.tela. } } } } Tutorial J2ME Copyright® .multipla)..multipla.alarme).setCommandListener(this).tela.setCurrent(this. case 3: this.info). this. break.tela.setCurrent(this. case 2: this. case 1: this.aviso).setCurrent(this.tela.

addCommand(this. Command. } //método executado se a MIDlet foir pausada por ela mesma //ou por um evento externo public void pauseApp() { } //método chamado quando a aplicação for encerrada.nome.microedition. Command.nome. this.addCommand(this.sair).setCommandListener(this).resultado = new TextBox("Resultado".resultado. this. 1). Command.ANY).sair). } //método executado ao inicio de Execuçao da MIDlet public void startApp() { this.senha = new TextBox("Senha".mail.midlet. this.senha.tela = Display.2005 .addCommand(this.fim). TextField.sair = new Command("Sair".EXIT.sair). 20. 1).SCREEN.ANY). this.nome. Command sair.setCommandListener(this). "". this. //construtores dos commands que irao ser adicionados aos objetos this.fim = new Command("Fim".setCommandListener(this).sair).36 ExemploTextBox import javax. this. //não há necessidade de ser implementada public void destroyApp(boolean condicional) { } Tutorial J2ME Copyright® . 30.nome = new TextBox("Nome".SCREEN. this. public class ExemploTextBox extends MIDlet implements CommandListener { TextBox nome. this. Display tela. this.senha.*.resultado. 20. senha. TextField. Command. this. mail.microedition. this. public ExemploTextBox() { //construtores dos atributos defindos acima this. login. resultado.login).setCurrent(this.addCommand(this. fim.getDisplay(this).proximo = new Command("Proximo".*.PASSWORD). TextField.EMAILADDR).login = new Command("Login". import javax. this.mail = new TextBox("Mail".addCommand(this. 20. "". proximo. this.senha.tela.mail. 0). this."". this.proximo). e são setados como commandListener this.mail.addCommand(this. 1).lcdui.addCommand(this.setCommandListener(this). this.nome).SCREEN. TextField."". this. //adicao dos commands aos aos objetos.

sair) { this.setCurrent(this.37 //método chamado assim que um command for adicionado. public void commandAction(Command c.senha).tela. //chama o destrutor } if (c == this.setString(this.fim) { //seta a String do objeto resultado pegando o que foi inserido //nos campos anteriores.mail).tela.getString()). this.resultado).notifyDestroyed().tela. Displayable d) { //definiçao do que será feito quando um command for acionado if (c == this.setCurrent(this. } if (c == this. } } } Tutorial J2ME Copyright® .getString()+" "+this.login) { this.2005 .resultado.destroyApp(true). this. //seta como ativo na tela } if (c == this.nome. //notifica que será destruido this.mail.proximo) { this.setCurrent(this.

destroyApp(true).append(this.midlet.PASSWORD).senha).login = new Form("Login").38 ExemploForm1 import javax.resultado.login.*.login. this.login.ANY).resultado. 0). this.login. //adiciona-se os componentes ao Form Login this. TextField nome.""). "".sair).resultadoMsg = new StringItem("". 20.addCommand(this. this.microedition.proximo). this.lcdui. this. //adiciona-se o componente ao Form Resultado this. this. this.login). proximo.sair = new Command("Sair". this.sair). } public void pauseApp() { } public void destroyApp(boolean condicional) { } public void commandAction(Command c.setCommandListener(this). this. this. TextField.setCurrent(this. Form login. 1). "". Command sair.addCommand(this. Displayable d) { if (c == this. senha. Command.2005 . this. import javax.append(this.getDisplay(this).addCommand(this.EXIT. // form de resultado this.notifyDestroyed().nome).senha = new TextField("Senha:". StringItem resultadoMsg. Tutorial J2ME Copyright® .sair) { this. Command. TextField. 20.*.login. public class ExemploForm1 extends MIDlet implements CommandListener { Display tela.tela = Display. } public void startApp() { this.tela.ANY | TextField. // form de login this.nome = new TextField("Nome:". public ExemploForm1() { // inicializar Commands this.SCREEN.resultado = new Form("Resultado").setCommandListener(this).microedition.append(this.proximo = new Command("Prox".resultadoMsg).resultado. this. resultado.

getString()+" "). this.proximo) { //O Label sempre aparecerá antes do Text não importando //a ordem que vc adicione ele ao componente //faça o teste trocando de ordem as chamdas.getString()).resultado).2005 .39 } if (c == this. this.senha. this.setText(this.setLabel(this.resultadoMsg.nome. } } } Tutorial J2ME Copyright® .tela.setCurrent(this.resultadoMsg.

100. "Não Interativo"}.gauge2.gauge1. Runnable { Display tela. import javax.menu = new List("Menu Principal".IMPLICIT. * O processamente paralelo será usado afim de mostrar o * movimento do gauge nao interativo. this. 0). public ExemploGauge() { // inicializar Commands this. // gauge interativo this. this.gauge1.microedition. this. menuElementos. ItemStateListener.*. false.lcdui.gauge1. 0). * usamos o recurso de Thread por que não haveria possibilidade * de incrementar nosso gauge.inter).gauge1.gauge1. this. this.microedition.midlet.gauge1 = new Form("Interativo"). 50. e mostra-lo na tela * na mesma linha de execuçao.40 ExemploGauge import javax. * 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 implementação.2005 . //mesma coisa que o gauge anterior. //preparamos este form para "ouvir" os direcionais do teclado.ninter = new Gauge("0%". 1). true. /** * neste exemplo vamos implementar mais duas interfaces * o ItemStateListener vai nos ajudar a reconhecer as Setas direcionais * do teclado do dispositivo. Form gauge1. **/ public class ExemploGauge extends MIDlet implements CommandListener. 0). // gauge nao-interativo this.menu. menuCommand. //setamos o label inicial do gauge //true para torna-lo interativo //50 é o numero de toques qeu ele necessitará para ser completado //0 para indicar seu inicio. this. Command. this. List. //somente do false indica qeu este gauge esta somente //sobre controle do programa this.addCommand(this. // menu principal String[] menuElementos = {"Interativo".menu. null). this. List menu.SCREEN. Command.menuCommand = new Command("Menu".*. this.addCommand(this.setCommandListener(this).setCommandListener(this). Tutorial J2ME Copyright® .EXIT.append(this. Thread minhaThread.menuCommand). ninter.append(this.sairCommand = new Command("Sair".gauge2 = new Form("Não Interativo"). gauge2.addCommand(this.setItemStateListener(this).sairCommand).sairCommand). //declararemos um for para cada gauge. Command sairCommand. this. Gauge inter.inter = new Gauge("0 %". this.ninter).

} //verifica qual item da lista do menu principal foi selecionado if (c == List.gauge2). this.tela.menu.tela.tela = Display. minhaThread.getSelectedIndex() == 0) { this.setCurrent(this.menu. ele inicial nossa "thread" //a qual controlará nosso gauge fazendo-o aumentar até onde determinarmos if (this.SELECT_COMMAND && d == this.menuCommand) { this.2005 .41 this. } } } /** * 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 == this. Displayable d) { if (c == this. this.setCurrent(this. this. } public void pauseApp() { } public void destroyApp(boolean condicional) { } public void commandAction(Command c.gauge2. if (this.sairCommand) { this.minhaThread = new Thread(this).menuCommand).gauge2.start().gauge2.setCurrent(this. } //se for o gauge nao interativo. this.menu).setCommandListener(this).getSelectedIndex() == 1) { this.getDisplay(this). } if (c == this.inter) { Tutorial J2ME Copyright® .setCurrent(this. } public void startApp() { this.tela.sairCommand).tela. this.gauge1).addCommand(this.addCommand(this.menu).menu) { //se for o primeiro item que é o gauge interativo //ele apresenta o gauge e espera por comandos.destroyApp(true).notifyDestroyed().

**/ try { Thread.setLabel(" } } //controle do gauge Nao interativo //execução da nossa Thread (Runnable) public void run() { for (int cont = 1.inter.ninter.2005 . cont++) { /** * usamos este try-catch porque precisamos usar o sleep * para dar uma pausa pequena para melhor vizualizacao * do incremento.ninter. cont <= 100.setLabel(" "+cont+"%").sleep(30). } catch (Exception e) { } this. * por curiosidade.inter. auemnte e dimunua o valor do sleep * lembre-se o valor é dado em milisegundos.42 this. Tutorial J2ME Copyright® . this.getValue()*2)+"%"). } } } "+(this.setValue(cont).

tela. this.null.lcdui.com. 1).EXIT. public class ConnectionImage extends MIDlet implements CommandListener { Display tela.br/suafoto.addCommand(this. javax.setCurrent(this. } public void pauseApp() { } public void destroyApp(boolean bool) { } public void commandAction(Command c.io.seusite.sairCommand). Command. Displayable d) { if (c == this.setCommandListener(this).foto = new ImageItem("foto". this. Command. this. //form onde será exibida a imagem Form imageForm.addCommand(this.*.SCREEN. this. //o qual poderia ser feito na hora de postar.microedition.sairCommand) Tutorial J2ME Copyright® .imageForm).tela = Display.getDisplay(this).*. this. //string com a url para a imagem //colocamos a url diretamente aqui somente para exemplo //uma idéia seria vc deixar o usuario setar esse link //em um textbox ou algo do genero. javax.2005 .imageForm.0. this. } public void startApp() { this. 0).buscarCommand = new Command("Buscar".midlet. public ConnectionImage() { this. String url = "http://www. ImageItem foto.*. //ImageItem onde a foto que virá do servidor será salva. this.sairCommand = new Command("Sair".43 ExemploConnectionImage import import import import javax. //imageItem onde será posta a imagem que vier do server //inicializamos ela com zero. //comandos Command buscarCommand. java.microedition."").png".imageForm.io. sairCommand.imageForm = new Form("").microedition.*.imageForm.buscarCommand).

2005 .readFully(imageData).tela.read()) != -1) bStrm. int ch. } else //se o tamanho não está disponível { ByteArrayOutputStream bStrm = new ByteArrayOutputStream(). }catch(Exception e) { } } } /** * Abre uma conexão http e baixa um arquivo png * em um array de bytes **/ private Image getImage(String url) throws IOException { /** * usamos aqui ao invés de httpconnection * a conexao padrao.toByteArray(). while ((ch = iStrm. //chama o método que busca a imagem im = getImage(this. imageData = bStrm.openDataInputStream().size() > 0){ for (int i = 0. o qual nao nos garante nada. Tutorial J2ME Copyright® . } else if(c == buscarCommand) { //se já houver um ImageItem no form //ele irá deleta-lo antes de jogar uma nova imagem if (imageForm. try { byte imageData[]. i++) imageForm. i < imageForm.destroyApp(true). this.setImage(im). if (length != -1) { imageData = new byte[length].foto).44 { this. **/ ContentConnection connection = (ContentConnection) Connector.delete(i). int length = (int) connection.setCurrent(imageForm). Image im = null.getLength(). // Display the form with the image this.open(url). imageForm.size(). DataInputStream iStrm = connection.append(this.write(ch). * embora a conexao http tambem nao seja muito confiavel.url). // Le um png em um array iStrm. } try { Image im.notifyDestroyed(). this.foto.

} } Tutorial J2ME Copyright® .close().2005 .createImage(imageData. imageData. } return (im == null ? null : im). } finally { // Clean up if (iStrm != null) iStrm. if (connection != null) connection.close(). } //Cria a imagem de um array de bytes im = Image. 0.close().45 bStrm.length).

List. Tutorial J2ME Copyright® .destroyApp(true). Command sair.SCREEN.listar = new Command("Listar". } public void pauseApp() { } public void destroyApp(boolean b) { } public void commandAction(Command c.*.List.result.getDisplay(this). **/ import import import import javax.registros). Command.*.addCommand(this. a parte ServerSide fica de sua responsabilidade. this. public ExemploConnect() { this. this. javax. Displayable d) { if(c == this. this.notifyDestroyed().*.microedition.br/suaPagina. this.EXIT.seusite.sair = new Command("Sair".SCREEN. this.registros. da pessoa.microedition. 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 retornará os dados.microedition.IMPLICIT). List registros.tela = Display.result.registros. Isto é só um exemplo.voltar).io.setCurrent(this. listar. visto que nao é este nosso objetivo. this.tela.addCommand(this.registros.46 ExemploHttpConnection /** Este exemplo faz uma conexao http com um server. 0).Command. 1). this.setCommandListener(this). As paginas podem tanto ser .listar).io.sair).voltar = new Command("Voltar".*.addCommand(this. como Servlets. voltar. public class ExemploConnect extends MIDlet implements CommandListener { Display tela.com.jsp". this.result = new List("Dados Cliente".sair) { this.setCommandListener(this). this. this. result.registros = new List("Clientes".jsp. 0).lcdui.2005 . java.midlet. javax. } public void startApp() { this. String url = "www.Command. this.IMPLICIT).

int status = -1.voltar) { int tamanho = this.indexOf("-")). if(b1 == (byte)'\n') { lista.toString(). while (lido != -1) { byte b1 = (byte)lido. for(int i= 0.getResponseCode().result.setLength(0).conecta(result).tela.47 } //chama a função que faz a conexao com a pagina.openInputStream(). String cod = linha.getSelectedIndex()).delete(i). //como podemos perceber abaixo //é lido byte a byte do servidor.registros.url). String urlBusca = "www.linha.setCurrent(this.read(). this. //passamos a lista como parametro //pois é onde sera montado o resultado da busca this.conecta(this.append(sb.open(this.registros. HttpConnection con = (HttpConnection) Connector. int lido = is. status = con.getString (this.url = urlBusca+cod. } else { Tutorial J2ME Copyright® . //como a conexao foi http.com.result). i++) { this.jsp?cod=". StringBuffer sb = new StringBuffer().setCurrent(this.2005 .HTTP_OK) { InputStream is = con.registros).size().br/BuscaCodigo.registros). } //quando chamar o voltar limpa a lista para evitar //que sejam readicionados os mesmo itens na proxima conexao if(c == this. sb. é verificado o status da conexao if(status == HttpConnection. i < tamanho. } } public void conecta(List lista) { try { //estabelecemos uma conexao http com a url.substring(0.seusite. } //verifica o item escolhido e entao pega o codigo //e o junta com a url para fazer a busca no servidor if(c == List.result.tela. if(c == this.listar) { this.null). } this. this.SELECT_COMMAND) { String linha = this.

append((char)b1).read(). else { lista.48 sb. //colocamos esta mensagem como padrao. } } catch (IOException io1) { } } } Tutorial J2ME Copyright® . null).2005 . } lido = is.append("Nenhum Registro Encontrado!". } } //se nao conseguir estabelecer conexao.

. if(c==this.EXIT.sair=new Command("Sair".tela.tela=Display. } public void startApp() { //define a tela para o objeto NossoCanvas que vai desenhar na tela this. // inicia o NossoCanvas this.0).getDisplay(this).49 ExemploCanvas /** * Vamos construir um exemplo do uso do Canvas em J2ME. Command sair. * Vamos a ele.canvas.midlet. // para desenhar na tela precisamos da Classe Canvas // como nossa classe principal não pode extender a classe Canvas // criaremos uma outra Classe que extenda de Canvas NossaCanvas canvas. caso vc queira interagir com a aplicação! public class ExemploCanvas extends MIDlet implements CommandListener { Display tela.2005 .*.lcdui.microedition.*.microedition. // Toda a aplicacao tem que extender de MIDlet. this. é ativado quando algum comando é acionado public void commandAction(Command c. import javax.sair) { Tutorial J2ME Copyright® .setCommandListener(this). * Canvas é o uso de graficos em nivel baixo. e implementar //a interface CommandListener.canvas. //adiciona o comando sair ao canvas this.setCurrent(this. Displayable d) { // reconhece que o comando foi o sair e executa. // prepara o canvas para "escutar" os comandos this. } public void pauseApp() { // não precisa executar nada se não quiser } public void destroyApp(boolean b) { // não precisa executar nada se não quiser } // metodo abstrato da interface CommandListener..canvas=new NossaCanvas().sair).addCommand(this. //classe criada mais a baixo public ExemploCanvas() { this.canvas).Command. **/ import javax.

e onde as coordenadas devem ser consideradas na string g.59).setColor(255.255).7.5.drawRect(5. // define o texto as coordenadas.7.50 this. //existe também uma sobrecarga para este método com cor de 8 bits g. //desenha um retangulo sem preenchimento g.fillRect(0. //define uma cor RGB g.255.LEFT|Graphics. } } Tutorial J2ME Copyright® .TOP).96. String teste="NoSSo Canvas".2005 .drawString(teste.setColor(192).88.0. } } } //classe criada extendendo de Canvas class NossaCanvas extends Canvas { public NossaCanvas() { } // metodo abstrato de Canvas que pinta na tela //ele é acionado na criacao do objeto e quando usa-se o metodo repaint() public void paint(Graphics g) { g.destroyApp(true). this.setColor(128). //cria-se uma variavel String porque o método drawString() nao aceita o uso de lala diretamente no método.notifyDestroyed().64). //cria um retangulo ja pintado com a cor definida g.Graphics.

Material de Apoio Tutorial J2ME Copyright® . James .J2ME Knudsen.51 Referências Bibliográficas Keogh. Jonathan The Complete Reference Wireless Java Editora Osborne Editora Apress Developing with J2ME Almeida.2005 . Leandro Batista de .

52 Copyright Não é autorizado o uso desta apostila indevidamente sem autorização. ou disponibilização sem prévia autorização. Tutorial J2ME Copyright® . entenda-se reprodução para fins lucrativos.2005 .

daneprairie.This document was created with Win2PDF available at http://www. . The unregistered version of Win2PDF is for evaluation or non-commercial use only.com.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->