Desenvolvimento de dispositivos moveis

Page 1

www.cruzeirodosulvirtual.com.br

Desenvolvimento de Dispositivos m贸veis


© ACEF S/A • Trabalho realizado pela Universidade de Franca (SP) Todos os direitos reservados. É proibida a reprodução ou transmissão total ou parcial por qualquer forma ou qualquer meio (eletrônico ou mecânico, incluindo fotocópia e gravação) ou arquivamento em qualquer sistema de banco de dados sem permissão do Núcleo de Educação a Distância – Unifran.

UNIVERSIDADE DE FRANCA Chancelaria: Dr. Clovis Eduardo Pinto Ludovice Reitoria: Prof.a Dr.a Ester Regina Vitale Pró-Reitoria de Ensino: Prof. M.e Arnaldo Nicolella Filho Pró-Reitoria de Pequisa: Prof.a Dr.a Katia Jorge Ciuffi Pró-Reitoria de Extensão: Prof.a M.a Elisabete Ferro de Sousa Touso

COORDENAÇÃO EAD Coordenação Geral de EAD: Prof.a Dr.a Ana Paula do Carmo Marcheti Ferraz Coordenação Acadêmica: Prof.a Dr.a Alessandra Aparecida Campos Coordenação Pedagógica: Prof.a M.a Carmen Lucia Tozzi Mendonça Conti

EDITORA UNIFRAN – EDIFRAN Direção de Publicações: Prof. M.e Everton de Paula Assistência Administrativa Sênior: Paula Andrea Zúñiga Muñoz Assistência Administrativa II: Munira Rochèlle Nambu Revisão de Textos: Isabella Araujo Oliveira Karina Barbosa Thaíla de Sousa Orlando Diagramação: Ana Lívia de Matos Renan Oliveira Laudares Morais Projeto Gráfico: Sérgio Ribeiro

Universidade de Franca – Av. Dr. Armando Salles Oliveira, 201 – Parque Universitário – 14.404-600 Franca – SP – PABX: (16) 3711-8888 – FAX (16) 3711-8886 – 0800 34 12 12 – www.unifran.edu.br Editora Unifran – (16) 3711-8736/8842 – editora@unifran.br



1

UNIDADE 1 INTRODUÇÃO AO DESENVOLVIMENTO PARA DISPOSITIVOS MÓVEIS Nesta Unidade você aprenderá sobre os fundamentos da área de desenvolvimento de aplicações para dispositivos móveis. Neste contexto, você estudará sobre a plataforma Java e a utilização do módulo Java Micro Edition no desenvolvimento de projetos para dispositivos móveis. Introdução Com o crescimento da utilização de dispositivos móveis, principalmente com a evolução e o barateamento dos aparelhos de smartphones e tablets, a demanda pelo desenvolvimento de aplicações para os mais variados propósitos tem aumentado de maneira expressiva. Antigamente, os aparelhos de telefonia móvel celular, por exemplo, eram utilizados apenas para falar e receber chamadas, além de permitir o envio e o recebimento de mensagens de texto, no entanto, o cenário atual é bem diferente com a possibilidade da execução de aplicações. Outro fator interessante e crucial para o crescimento da utilização dos dispositivos móveis foi o avanço tecnológico das redes de comunicação, principalmente pelo aumento da velocidade com as conexões de banda larga. Com isso, as inúmeras ofertas de aplicações para dispositivos móveis, atrelada a uma rede de alta velocidade impulsionou de maneira exorbitante a área de desenvolvimento de aplicações para dispositivos móveis. Neste cenário, as principais tecnologias existentes para desenvolvimento de aplicações móveis são: •

Plataforma Android: utilizada na construção de aplicações para dispositivos que executam o sistema operacional Android.

Plataforma iOS: que permite a construção de programas para os dispositivos da Apple: iPhone, iPad e iToch.


2 •

Java MicroEdition: possibilita a construção de aplicações para os mais variados tipos de dispositivos capazes de suportar a plataforma Java.

Microsoft Windows Phone: solução proprietária para construção de aplicações para dispositivos móveis da Microsoft.

Nesta disciplina você aprenderá como utilizar e desenvolver aplicações utilizando Java Micro Edition que é uma parte integrante da plataforma Java. Plataforma Java A plataforma Java oferece ao desenvolvedor um universo de possibilidades para o desenvolvimento de software. Independentemente do tipo de aplicação desenvolvida a plataforma utiliza uma filosofia baseada em write once, run anywhere, ou seja, escreva uma vez, executa em qualquer lugar. Este fato a plataforma Java muito vantajosa do ponto de vista de desenvolvimento, principalmente pela possibilidade de execução de aplicações multiplataformas sem a necessidade de recompilação (DEITEL & DEITEL, 2005). Estruturalmente a plataforma de desenvolvimento Java é organizada em módulos, cada qual com as suas especificadas em relação ao tipo de aplicação que pode ser desenvolvida. Assim, a plataforma Java está organizada em três módulos denominados: •

Java Standard Edition (Java SE): empregado no desenvolvimento de soluções em um cenário cliente/servidor, com a possibilidade de acesso a informações em banco de dados.

Java Enterprise Edition (Java EE): utilizado na construção de aplicações de grande porte, principalmente em projetos corporativos de grandes instituições.

Java Micro Edition (Java ME): aplicado na elaboração e teste de aplicações para dispositivos móveis, tais como, aparelhos celulares, tablets, set-top box de TV digital, entre outros.


3 A disciplina de Desenvolvimento para Dispositivos Móveis aborda a construção de projetos utilizando o módulo Java Micro Edition. Java Micro Edition (Java ME) A tecnologia Java Micro Edition, ou simplesmente Java ME, representou uma revolução histórica para a plataforma Java. Originalmente, a plataforma Java ME foi construída com o objetivo de fornecer ao desenvolver uma tecnologia limitada para a construção de aplicações para dispositivos móveis. As limitações estavam associadas as capacidades de memória, exibição e processamento dos dispositivos móveis, no entanto, atualmente com a evolução

destes

equipamentos

a

tecnologia

Java

ME

permite

o

desenvolvimento de aplicações para os mais variados propositivos (JAVA ME, 2013). As aplicações construídas utilizando a tecnologia Java ME podem ser executadas em qualquer dispositivo que tenha suporte a plataforma Java. Os dispositivos mais convencionais que executam aplicações Java ME são (ORACLE, 2013): •

Java Mobile Devices: aparelhos celulares, smartphones, dispositivos de posicionamento global (GPS), tablets, entre outros.

Java Embedded: dispositivos embarcados.

Java TV: Set-top boxes, aparelhos de blu-ray e outros dispositivos de mídia digital.

Java

Card:

smart

cards

e

dispositivos

como

capacidades

extremamente limitadas de processamento e armazenamento.

A Figura 1 apresenta uma visão geral dos componentes da tecnologia Java ME e as suas respectivas ligações com as demais tecnologias Java.


4

Figura 1: Componentes da tecnologia Java ME (JAVA ME, 2013).

O primeiro passo para o desenvolvimento de aplicações utilizando a tecnologia Java ME é a escolha de uma configuração apropriada. Uma configuração, do inglês configuration, define quais as características básicas que um dispositivo necessariamente precisa ter para executar uma aplicação Java ME. Dessa forma, as configurações definem os requisitos mínimos desejados para os dispositivos e especifica parâmetros para: •

Quantidade mínima de memória

Velocidade do processador

Conexões de rede disponíveis

Neste contexto as configurações foram organizadas em dois grupos conhecidos como:


5 •

CLDC – Connected Limited Device Configuration: que permite a construção de aplicações para dipositivos mais simples e leves. Este tipo de configuração necessita de aparelhos com poder de processamento de 16 a 32 bits, e memória de 128 a 512 Kb.

CDC

Connected

desenvolvimento

de

Device

Configuration:

aplicações

com

utilizada

maior

para

capacidade

o de

processamento e armazenamento. Nesta categoria a capacidade de processamento dos dispositivos deve ser superior ou igual a 32 bits, e a porção de memória deve ser superior ou igual a 2 megabytes.

Outro componente da tecnologia Java ME é denominado perfil, que tem como objetivo complementar as especificações definidas pelas configurações. Um perfil fornece ao desenvolvedor um conjunto de funcionalidades adicionais para a construção de aplicações para um determinado dispositivo. A escolha de um perfil está vinculada a seleção de uma configuração. Neste sentido, para a configuração CLDC, os principais perfis disponíveis são: •

MIDP – Mobile Information Device Profile: que fornece bibliotecas necessárias para a execução de aplicativos denominados MIDlets. Além disso, contém classes para a construção de interfaces gráficos com o usuário, recursos para armazenamento persistente de dados e mecanismos de acesso a rede. Este perfil será abordado em detalhes ao longo da disciplina, uma vez que é o perfil mais utilizado para o desenvolvimento de aplicativos.

PDAP – PDA Profile: oferece ao desenvolvedor um ambiente de execução e um conjunto de bibliotecas específicas para dispositivos móveis do tipo PDA´s.

Para a configuração CDC, que tem como objetivo a construção de aplicações mais robustas, os principais perfis disponíveis são:


6 •

Foundation Profile: que pode ser empregado na elaboração de aplicações para dispositivos interconectados em rede e sem interface gráfica.

Personal Basic Profile: utilizado para o desenvolvimento de aplicações para dispositivos com o foco no suporte especializado a gráficos.

Como qualquer aplicação baseada na plataforma Java a execução depende de uma máquina virtual, conhecida comumente como Java Virtual Machine ou simplesmente JVM. No cenário dos dispositivos móveis as máquinas virtuais têm funcionalidades mais limitadas, uma vez que as capacidades dos dispositivos também são limitadas. A utilização de uma máquina virtual para execução de aplicações móveis depende do tipo de configuração adotada, assim, as duas principais máquinas virtuais são: •

CVM – Compact Virtual Machine: utilizada para execução de aplicações desenvolvidas utilizando a configuração CDC.

KVM – Kilo Virtual Machine: empregada na execução de aplicativos construídos com a configuração CLDC.

Embora a tecnologia Java ME permita o desenvolvimento de aplicações para os mais variados dispositivos, existem recursos específicos dos aparelhos que não são contemplados pela plataforma. Por exemplo, um determinado modelo de aparelho celular, de um determinado fabricante, pode conter um recurso específico disponível apenas neste aparelho. Como a tecnologia Java ME não contempla a utilização deste recurso e não oferece ao programador a possibilidade de acesso, uma alternativa é utilizar os pacotes opcionais (optional packages) oferecidos pelos fabricantes dos produtos. As bibliotecas fornecidas pelos fabricantes são específicas a um determinado modelo, alguns exemplos dessas bibliotecas podem ser obtidos diretamente nos endereços dos fabricantes:


7 •

Nokia: <forum.nokia.com>

LG: <developer.lgmobile.com>

Motorola: <developer.motorola.com>

Instalação e Configuração do Ambiente para Desenvolvimento Utilizando Java ME A maneira mais simplificada de obter, instalar e configurar um ambiente de desenvolvimento integrado para Java Micro Edition é utilizando o software NetBeans. O ambiente NetBeans é uma solução completa para construção de aplicações utilizando a plataforma Java e oferece suporte integrado ao pacote de desenvolvimento do Java ME. Para obter o ambiente NetBeans você deverá acessar o endereço <netbeans.org> e selecionar o item download, conforme ilustrado na Figura 2.


8 Figura 2: Download do ambiente de desenvolvimento integrado NetBeans integrado com o Java Micro Edition. Em seguida você precisará selecionar a versão mais indicada para o desenvolvimento que, neste caso, é a versão completa. Note que a versão completa oferece suporte a tecnologia Java ME. Além disso, a versão completa possui Java Plataforma Micro Edition SDK. A Figura 3 apresenta a seleção da versão completa do ambiente NetBeans.

Figura 3: Download do ambiente de desenvolvimento integrado NetBeans integrado com o Java Micro Edition.

Para a instalação do ambiente de desenvolvimento integrado NetBeans é necessário que você tenha previamente instalado em seu computador o Java Runtime Environment que pode ser obtido (ou atualizado) no endereço: <java.com>


9 Você precisará também instalar o kit de desenvolvimento integrado da plataforma Java que é conhecido como Java Development Kit, o qual pode ser obtido no endereço: <http://www.oracle.com/technetwork/java/javase/downloads/index.html> Caso tenha preferencia por utilizar outro ambiente de desenvolvimento integrado, como o Eclipse, por exemplo, você precisará obter separadamente o kit de desenvolvimento para Java ME. Para isso, acesse o endereço para obter diretamente o Java ME SDK, conforme ilustrado na Figura 4: <http://www.oracle.com/technetwork/java/javame/javamobile/download/sdk/index.html>

Figura 4: Download do Java ME SDK separadamente para utilizando em outro ambiente de desenvolvimento, tal como o Eclipse.


10 Com a instalação do ambiente de desenvolvimento integrado de sua preferência, juntamente com o Java ME SDK, você terá todos os recursos tecnológicos necessários para o acompanhamento da disciplina. Referências Bibliográficas DEITEL, Harvey M; DEITEL, Paul, J. Java: Como Programar. São Paulo: Prentice-Hall, 2005. JAVA ME. Java ME Plataform Overview. Disponível em < Java ME Platform Overview>. Acesso em Janeiro de 2013. ORACLE. Java ME & Java Card Technology Documentation. Disponível em <http://docs.oracle.com/javame/>. Acesso em Janeiro de 2013.

Considerações Finais Nessa Unidade você conheceu os aspectos fundamentos a respeito da elaboração de projetos para dispositivos móveis utilizando a plataforma Java ME. Você aprendeu sobre os componentes da plataforma, bem como, obter e instalar o ambiente de desenvolvimento integrado para o acompanhamento da disciplina.


11

UNIDADE 2 CRIAÇÃO, CONFIGURAÇÃO E EXECUÇÃO DE MIDLETS Nesta Unidade você aprenderá a construir as suas primeiras aplicações para dispositivos móveis. Para isso, é fundamental que você já tenha instalado e configurado o ambiente de desenvolvimento integrado NetBeans. Introdução A tecnologia Java ME oferecer ao desenvolvedor um universo de possibilidade e permite a construção de aplicativos para os mais variados cenários. Neste contexto, o Java ME é constituído por um componente denominado configuração que especifica quais as características físicas (hardware) que os aparelhos devem possuir para executar as aplicações. Além disso, estabelece denominações conhecidas como perfis que determinam propriedades mais restritas que dependem do tipo de aplicação. As máquinas virtuais também possuem atributos específicos no cenário da tecnologia Java ME e são conhecidas como KVM ou CVM. Por fim, os fabricantes dos aparelhos podem oferecer pacotes opcionais para o desenvolvimento que possibilitam o acesso a recursos específicos dos aparelhos. Para demonstrar a utilização da tecnologia Java ME na construção de aplicativos para dispositivos móveis você aprenderá como desenvolver projetos utilizando o perfil MIDP, do inglês Mobile Information Device Profile. Este é o perfil mais utilizado para construção de aplicações, além disso, é baseado na configuração CLDC e utilizada a máquina virtual KVM para executar as aplicações. Com o perfil MIDP é possível construir aplicativos que contenham interface gráfica com o usuário, tanto básicas utilizando controles pré-definidos quanto avanças por meio de uma biblioteca denominada Canvas. Além disso, é possível elaborar jogos eletrônicos e controlar os principais recursos de mídia disponíveis nos aparelhos.


12 MIDlet Um MIDlet é a denominação utilizada para referenciar aplicativos para dispositivos móveis desenvolvidos utilizando o perfil MIDP e a configuração CLDC. Este é o principal tipo de aplicativo construído baseado na tecnologia Java ME. Os aplicativos MIDlet são controlados por um recurso denominado Application Manager, o qual é responsável pela instalação e execução das aplicações nos dispositivos. Este gerenciador é específico de cada dispositivo e a comunicação entre a MIDlet e o Application Manager é realizada por meio de uma classe do pacote javax.microedition.midlet.MIDlet. O Application Manager tem a possibilidade de iniciar uma nova MIDlet (start), de mudar o estado para pausado (pause) e também é capaz de destruir (destroy) uma MIDlet em execução.

Criação de um Novo Projeto Java ME no NetBeans Para criar um novo projeto com a tecnologia Java ME utilizando o ambiente de desenvolvimento integrado NetBeans, selecione o menu Arquivo, em seguida escolha Novo Projeto. Na janela NovoProjeto selecione a categoria Java ME e o tipo de projeto Aplicação Móvel. Por fim, clique no botão Próximo. A Figura 1 ilustra o procedimento inicial para criação do novo projeto. Na próxima tela você deverá especificar o nome do projeto, além de definir a localização em que os arquivos serão armazenados. Você pode nomear o projeto como Java ME e escolher a pasta de sua preferência para o armazenamento dos arquivos. Em seguida, clique no botão Próximo. A Figura 2 apresenta a tela que define o nome e a localização do projeto.


13

Figura 1: Criação de um Novo Projeto com a tecnologia Java ME

Figura 2: Criação de um Novo Projeto Java ME


14 Na próxima tela será exibida a versão do Java ME SDK instalado no seu computador, bem como as versões das configurações disponíveis e os perfis que poderão ser utilizados. Você não precisa realizar nenhum tipo de alteração na plataforma do emulador. Na configuração do dispositivo você deverá selecionar CLDC 1.1 e, no perfil do dispositivo MIDP 2.1. Neste momento você pode clicar no botão Finalizar. A Figura 3 ilustra a seleção das propriedades relativas a plataforma do emulador.

Figura 3: Criação de um Novo Projeto Java ME: Plataforma do Emulador Com isso, finalizamos a criação de um novo projeto utilizando a tecnologia Java ME. Neste momento, iniciaremos a criação de novas aplicações denominadas MIDlets Criação de uma nova MIDlet Para adicionar novas MIDlets é necessário que você tenha criado previamente um novo projeto com a tecnologia Java ME conforme descrito na seção anterior. Com isso, para adicionar uma nova MIDlet ao projeto realize a seguinte sequência: Clique com o botão direito do mouse sobre o item Pacotes


15 de Código Fonte do projeto; Selecione a opção Novo e, em seguida, o item Outro (Figura 4); Em Categoria escolha CLDC e em Tipos de Arquivos defina MIDlet (Figura 5); Por fim, clique no botão Próximo.

Figura 4: Criação de uma nova MIDlet

Figura 5: Criação de uma nova MIDlet


16 Na tela denominada Nova MIDlet você deverá especificar o nome da MIDlet, bem como, o pacote em que o arquivo será armazenado. Dessa forma, utilize como nome da nova MIDlet como MeuPrimeiroExemplo e especifique o pacote unidade2. Note que as convenções da plataforma Java foram utilizadas para nomear a MIDlet e o pacote, assim, é fundamental que você siga estritamente essas recomendações. Finalmente, clique no botão finalizar. A Figura 6 ilustra o processo de definição do nome para nova MIDlet.

Figura 6: Criação de uma nova MIDlet: Nome e Pacote Neste momento concluímos a criação de uma nova MIDlet, assim, podemos entender quais os componentes da estrutura básica de uma MIDlet. A Estrutura Básica de uma MIDlet Quando criamos uma nova MIDlet utilizando o ambiente NetBeans, um modelo básico de estrutura é automaticamente criado para facilitar a codificação. Este modelo representa a estrutura básica de uma MIDlet e pode ser entendido como os requisitos mínimos de código para um aplicativo Java ME funcionar. A


17 Figura 7 ilustra a estrutura básica de uma MIDlet para a aplicação MeuPrimeiroExemplo.

Figura 7: Estrutura Básica de uma MIDlet. Na tecnologia Java ME todas os aplicativos do tipo MIDlet devem obrigatoriamente estender a classe MIDlet. Além disso, a estrutura básica define três métodos que determinam os estados da MIDlet: startApp, pauseApp e destroyApp. Execução de uma Nova MIDlet A execução um aplicativo Java ME no ambiente NetBeans é realizada da mesma forma que as aplicações tradicionais da plataforma Java. Para executar a MIDlet você pode utilizar o menu Executar > Executar Projeto, ou simplesmente pressionar a tecla F6. A visualização do resultado da execução de uma aplicação Java ME é feita em um emulador. O objetivo do emulador é apresentar fielmente como será o aplicativo, sem a necessidade de copiar a aplicação para o dispositivo móvel real. A utilização do emulador facilita bastante o processo de


18 desenvolvimento dos aplicativos móveis, além disso, é essencial para reduzir o tempo dispendido nos testes dos aplicativos. Para demonstrar a execução de uma nova MIDlet atualize o código da classe MeuPrimeiroExemplo conforme a listagem Código 1. Código 1 1

package unidade2;

2 3

import javax.microedition.lcdui.Command;

4

import javax.microedition.lcdui.CommandListener;

5

import javax.microedition.lcdui.Display;

6

import javax.microedition.lcdui.Displayable;

7

import javax.microedition.lcdui.Form;

8

import javax.microedition.midlet.*;

9 10

public class MeuPrimeiroExemplo extends MIDlet implements

CommandListener{ 11 12

private Display tela;

13

private Command cmd;

14

private Form frm;

15 16

//Construtor

17

public MeuPrimeiroExemplo() {

18

//Requisição da tela do dispositivo

19

tela = Display.getDisplay(this);

20 21 22

//Criação de um novo Comando (Botão) cmd = new Command("Sair", Command.EXIT, 0);

23 24 25 26

//Criação do Formulário frm = new Form("Meu Primeiro Exemplo"); frm.addCommand(cmd);


19 27 28

frm.setCommandListener(this); }

29 30

public void startApp() {

31 32

//Exibição do Formulário tela.setCurrent(frm);

33

}

34 35

public void pauseApp() {

36

}

37 38

public void destroyApp(boolean unconditional) {

39

notifyDestroyed();

40

tela.setCurrent(null);

41

}

42 43

public void commandAction(Command c, Displayable d) {

44

if ( c == cmd){ destroyApp(true);

45 46

}

47 48

} }

Em seguida pressione a tecla de atalho F6 para visualizar o resultado da execução do aplicativo. A Figura 8 apresenta o resultado da execução no emulador.


20 Fechar o emulador

Sair do Aplicativo

Figura 8: Resultado da execução do aplicativo no emulador. Você pode alterar a interface gráfica do emulador para visualizar o resultado da execução em outros tipos de dispositivos. Para isso, acesse as propriedades do projeto clicando com o botão direito do mouse sobre o nome do projeto Java ME

e selecionando o item Propriedades. Na janela de


21 configurações do projeto escolha categoria Plataforma e no item Dispositivo altere para ClamshellJavaMEPhone1. A Figura 8 ilustra este procedimento.

Figura 9: Escolha do tipo de dispositivo para o emulador. Neste momento você deverá executar novamente a sua aplicação para visualizar as alterações no tipo do dispositivo, conforme ilustrado na Figura 10. Para uma visualização mais precisa do aplicativo em um determinado modelo de aparelho você poderá obter junto ao fabricante um pacote de desenvolvimento opcional. Para o fabricante de aparelhos celulares Nokia, por exemplo, você poderá obter um kit de desenvolvimento específico no endereço: <http://www.developer.nokia.com/Develop/Java/>


22

Figura 10: Resultado da execução com outro tipo de dispositivo. Referências Bibliográficas DEITEL, Harvey M; DEITEL, Paul, J. Java: Como Programar. São Paulo: Prentice-Hall, 2005. ORACLE. Java ME & Java Card Technology Documentation. Disponível em <http://docs.oracle.com/javame/>. Acesso em Janeiro de 2013. Considerações Finais Nesta Unidade você aprendeu como criar novos projetos utilizando a tecnologia Java ME. Além disso, conheceu o processo de criação e execução de novos aplicativos denominados MIDlets.


23

UNIDADE 3 CONTROLES BÁSICOS PARA CRIAÇÃO DE MIDLETS: COMANDOS, CAIXAS DE TEXTO E ALERTAS Nesta Unidade você aprenderá como construir aplicativos Java ME utilizando os controles básicos denominados caixa de texto e alerta. Além disso, conhecerá o modelo de tratamento de eventos, o qual está associado a botões de comando. Introdução No desenvolvimento de aplicativos utilizando a tecnologia Java ME o primeiro passo é solicitar acesso a tela do dispositivo. Com isso, é possível exibir informações para o usuário por meio dos mais variados tipos de controle, ou ainda receber dados utilizando os botões de comandos. Para realizar uma referência a tela do dispositivo é necessária a chamada: Display.getDisplay(this) Para a apresentação de algum tipo de informação na tela é preciso passar como parâmetro para o método de exibição um objeto Displayable o qual faz parte das classes Screen ou Canvas. A classe Screen permite a exibição de controles pré-definidos, tais como Alert, List, Form ou TextBox. Por outro lado, a classe Canvas pode ser utilizada para a elaboração de interfaces gráficas mais elaboradas, como por exemplos, jogos eletrônicos. Dessa forma, a exibição de informação é efetuada com a chamada: setCurrent(Displayable objeto) Praticamente todas as aplicações Java ME realizam algum tipo de interação com o usuário. Para isso, o usuário pode acionar botões no teclado do dispositivo, ou ainda utilizar as telas sensíveis a toque (touch screen). As interações entre o usuário e o aplicativo podem ser mapeadas por meio de botões de comando a partir de uma classe denominada Command.


24 Para realizar o tratamento dos eventos disparados pelo usuário é necessário a implementação de uma interface chamada CommandLister. Além disso, o código relativo ao evento disparado é implementado em um método abstrato denominado CommandAction, em que é possível identificar qual comando foi acionado. A implementação da interface deve ser identificada na declaração da classe da seguinte maneira, bem como a especificação do método abstrato, conforme ilustrado na listagem Código 1. Código 1 1

public

class

MinhaClasse

extends

MIDlet

implementsCommandListener{ 2 3

...

4 5 6

public void commandAction(Command c, Displayable d) { ...

7 8

} }

A listagem Código 2 demonstra a declaração de um botão de comando capaz de finalizar a aplicação. Neste exemplo, você pode visualizar a declaração do botão de comando denominado cmd, bem como, o tratamento do evento no método CommandAction. Código 2 1

public class MeuPrimeiroExemplo extends MIDlet implements CommandListener{

2 3

private Command cmd= new Command("Sair", Command.EXIT,

0); 4 5 6

public void startApp() { }


25 7

public void pauseApp() {

8

}

9 10

public void destroyApp(boolean unconditional) {

11

notifyDestroyed();

12

tela.setCurrent(null);

13

}

14 15

public void commandAction(Command c, Displayable d) {

16

if ( c == cmd){

17

destroyApp(true);

18

} }

19 20

}

Na criação de um botão de comando é necessário especificar três parâmetros: rótulo do comando que será exibido para o usuário; tipo de comando que representa o posicionamento do botão na tela do dispositivo e prioridade do comando que geralmente é definida como zero (imediata). Caixa de Texto (TextBox) As caixas de texto são utilizadas para entrada ou saída de informações textuais. Esses controles podem ser utilizados para a exibição dos mais variados tipos de informações, bem como para o recebimento de dados textuais fornecidos pelo usuário. Para a criação de uma caixa de texto é necessário informar pelo menos quatro parâmetros: •

Título (title): que especifica o informação que será exibida no topo da caixa de texto.


26 •

Texto (text): que representa o conteúdo textual que será exibido, ou caso seja uma caixa de texto para entrada de dados este parâmetro pode ser definido como vazio (“”).

Tamanho máximo (maxSize): que é utilizado para especificar o número máximo de caracteres suportado pela caixa de texto.

Restrições (constraints): que permite restringir a entrada do usuário em que as restrições mais comuns são: TextField.ANY qualquer tipo de caractere;

TextField.NUMERIC

TextField.DECIMAL

apenas

apenas

para

números

números

com

casas

inteiros; decimais;

TextField.PASSWORD para entrada de senhas; TextField.UNEDITABLE que desabilita a edição; entre outras.

A listagem Código 3 apresenta um exemplo de aplicativo Java ME que utiliza as caixas de texto para exibição de informações. Código 3 1

package unidade3;

2 3

import javax.microedition.lcdui.Command;

4

import javax.microedition.lcdui.CommandListener;

5

import javax.microedition.lcdui.Display;

6

import javax.microedition.lcdui.Displayable;

7

import javax.microedition.lcdui.TextBox;

8

import javax.microedition.lcdui.TextField;

9

import javax.microedition.midlet.*;

10 11

public

class

CaixaTexto

CommandListener{ 12 13

private Display tela;

extends

MIDlet

implements


27 14 15

private Command cmd; private TextBox texto;

16 17

public CaixaTexto() {

18

criarComandos();

19

criarCaixaTexto();

20

}

21 22

public void startApp() {

23

tela = Display.getDisplay(this);

24

tela.setCurrent(texto);

25

}

26 27

public void pauseApp() {

28 29

}

30 31

public void destroyApp(boolean unconditional) {

32

notifyDestroyed();

33

tela.setCurrent(null);

34

}

35 36

public void commandAction(Command c, Displayable d) {

37

if ( c == cmd){

38

destroyApp(true);

39

}

40

}

41 42

public void criarComandos(){

43 44

cmd = new Command("Sair",Command.EXIT,0); }

45 46

public void criarCaixaTexto(){


28 47

String titulo = "Título da Caixa de Texto";

48

String mensagem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer elementum orci purus, sit amet consequat risus. Class aptent taciti sociosqu ad litora torquent

per

conubia

nostra,

per

inceptos

himenaeos.

Vestibulum blandit, felis quis euismod malesuada, dolor ligula feugiat ipsum, id gravida neque elit nec mi. "; 49 50

texto

=

new

TextBox(titulo,

mensagem,

500,

TextField.ANY); 51

texto.addCommand(cmd);

52 53

texto.setCommandListener(this); }

54 55

}

A Figura 1 apresenta o resultado da execução da aplicação Java ME no emulador. Note que um novo aplicativo foi adicionado a lista de MIDlets com o nome de CaixaTexto.


29

Figura 1: Resultado da execução do aplicativo. Caixa de Diálogo (Alert) Para exibição de mensagens utilizando a tecnologia Java ME é possível utilizar caixas de diálogo, as quais também são conhecidas como alertas. O desenvolvedor pode definir qual o tipo de alerta que será criado conforme a necessidade do aplicativo: •

AlertType.CONFIRMATION

AlertType.ERROR

AlertType.INFO

AlertType.WARNING


30 A listagem C贸digo 2 demonstra um exemplo de utilizada das caixas de di谩logo em um aplicativo Java ME.

C贸digo 2 1

package unidade3;

2 3

import javax.microedition.lcdui.Alert;

4

import javax.microedition.lcdui.AlertType;

5

import javax.microedition.lcdui.Command;

6

import javax.microedition.lcdui.CommandListener;

7

import javax.microedition.lcdui.Display;

8

import javax.microedition.lcdui.Displayable;

9

import javax.microedition.lcdui.TextBox;

10

import javax.microedition.lcdui.TextField;

11

import javax.microedition.midlet.*;

12 13

public

class

CaixaDialogo

CommandListener { 14 15

private Display tela;

16

private Command cmdSair;

17

private Command cmdExibir;

18

private Command cmdSim;

19

private Command cmdNao;

20

private TextBox texto;

21

private Alert alerta;

22 23

public CaixaDialogo() {

24

criarComandos();

25

criarCaixaTexto();

26 27

}

extends

MIDlet

implements


31 28

public void startApp() {

29

tela = Display.getDisplay(this);

30

tela.setCurrent(texto);

31

}

32 33

public void pauseApp() {

34

}

35 36

public void destroyApp(boolean unconditional) {

37

notifyDestroyed();

38

tela.setCurrent(null);

39

}

40 41 42

public void commandAction(Command c, Displayable d) { if (c == cmdSair) {

43

criarAlertaConfirmacao();

44 45

}else if ( c == cmdExibir ){ criarAlerta();

46

}else if ( c == cmdSair){

47

destroyApp(true);

48

}else if ( c== cmdNao){ tela.setCurrent(texto);

49 50

}

51

}

52 53

public void criarComandos() {

54

cmdSair = new Command("Sair", Command.EXIT, 0);

55

cmdExibir = new Command("Exibir", Command.OK, 0);

56

cmdSim = new Command("Sim", Command.EXIT, 0);

57

cmdNao = new Command("N達o", Command.OK, 0);

58

}

59 60

public void criarCaixaTexto() {


32 61

String titulo = "Caixas de Diálogo";

62

String msg = "Este exemplo demonstra a utilização

das caixas de diálogo com a tecnologia Java ME. Para visualizar as caixas você deverá acionar os botões de comando 'Exibir' ou 'Sair'."; 63 64

texto

=

new

TextBox(titulo,

msg,

500,

TextField.ANY

|

TextField.UNEDITABLE); 65

texto.addCommand(cmdSair);

66

texto.addCommand(cmdExibir);

67

texto.setCommandListener(this);

68

}

69 70

public void criarAlerta(){

71

String titulo = "Caixa de Diálogo";

72

String msg = "Este é um exemplo de mensagem para a

caixa de diálogo"; 73

alerta = new Alert(titulo);

74

alerta.setString(msg);

75

alerta.setTimeout(Alert.FOREVER);

76

alerta.setType(AlertType.INFO); tela.setCurrent(alerta);

77 78

}

79 80

public void criarAlertaConfirmacao(){

81

alerta = new Alert("Pergunta");

82

alerta.setString("Tem certeza que deseja finalizar

o aplicativo?"); 83

alerta.setTimeout(Alert.FOREVER);

84

alerta.setType(AlertType.CONFIRMATION);

85

alerta.addCommand(cmdSim);

86

alerta.addCommand(cmdNao);

87

alerta.setCommandListener(this);


33 88 89

tela.setCurrent(alerta); }

90 91

}

A Figura 2 apresenta o resultado da execução do aplicativo. Na Figura 2a é possível visualizar tela inicial com uma mensagem previamente definida e os botões de comando Sair e Exibir. Para exibir uma das caixas de diálogo o usuário deverá acionar o botão Exibir, e o resultado pode ser visualizado na Figura 2b.

(a)

(b)

Figura 2: Resultado da execução do aplicativo.


34 A Figura 3 apresenta o resultado do acionamento do botão de comando Sair, em que é apresentado para o usuário uma caixa de diálogo do tipo confirmação (confirmation).

Figura 3: Caixa de Diálogo do tipo confirmação

Com isso, você aprendeu como utilizar os controles básicos para construções de aplicativos do tipo MIDlets denominados Comandos, Caixa de Texto e Alerta. Referências Bibliográficas


35 DEITEL, Harvey M; DEITEL, Paul, J. Java: Como Programar. São Paulo: Prentice-Hall, 2005. ORACLE. Java ME & Java Card Technology Documentation. Disponível em <http://docs.oracle.com/javame/>. Acesso em Janeiro de 2013.

Considerações Finais Nesta Unidade você estudou sobre o uso dos controles básicos para construção de aplicativos Java ME. Você elaborou exemplos utilizando caixas de texto, caixas de diálogo (alertas) e botões de comando.


36

UNIDADE 4 CONTROLES BÁSICOS PARA CRIAÇÃO DE MIDLETS: LISTAS Nesta Unidade você aprenderá como construir aplicativos Java ME capazes de apresentar conjuntos de dados. Para isso, você utilizar um controle denominado lista. Introdução No desenvolvimento de aplicativos com a tecnologia Java ME é comum a necessidade de manipular conjuntos de elementos. Essa manipulação pode estar associada a apresentação de informações, bem como, o processamento da entrada do usuário. Você pode utilizar um conjunto de elemento, por exemplo, para apresentar ao usuário um menu contendo as possibilidades de acesso a aplicação. Para solucionar este tipo de problema tecnologia Java ME possui um controle específico denominada Lista. Para utilizar este controle é necessário criar uma instância da classe javax.microedition.lcdui.List. Lista (List) O controle lista é utilizado para apresentação de conjuntos de elementos, os quais podem ser selecionados pelo usuário. Os elementos da lista podem ser adicionados por meio de um método denominado append, em que é passado como parâmetro o rótulo do elemento e a imagem associada. Os elementos da lista são indexados sequencialmente e utilizam a mesma estrutura de índices dos vetores, ou seja, o primeiro elemento da lista possui o índice zero. Na instância de um objeto da classe List é necessário definir o tipo, o qual é organizado em três categorias: •

List.IMPLICIT: que permite ao usuário selecionar apenas um elemento e não há necessidade de confirmação.


37 •

List.EXCLUSIVE: que possibilita a seleção de apenas um elemento da lista e há necessidade de confirmação.

List.MULTIPLE: em que o usuário é capaz de selecionar vários elementos e há necessidade de confirmação.

A listagem Código 1 demonstra a utilização do controle Lista. Neste exemplo é criada uma lista do tipo implícita em que não há a necessidade de confirmação. Para processar o item da lista que foi selecionado é utilizado uma opção no método CommandAction denominada List.SELECT_COMMAND. O resultado da execução do aplicativo pode ser visualizada na Figura 1.

Código 1 1

package unidade4;

2 3

import javax.microedition.lcdui.Alert;

4

import javax.microedition.lcdui.AlertType;

5

import javax.microedition.lcdui.Command;

6

import javax.microedition.lcdui.CommandListener;

7

import javax.microedition.lcdui.Display;

8

import javax.microedition.lcdui.Displayable;

9

import javax.microedition.lcdui.List;

10

import javax.microedition.midlet.*;

11 12

public class ListaSemConfirmacaoextends MIDlet implements

CommandListener { 13 14

private Display tela;

15

private Command cmdSair;

16

private List lista;

17 18

public ListaSemConfirmacao() {


38 19 20

criarComandos(); criarLista();

21

}

22 23

public void startApp() {

24

tela = Display.getDisplay(this);

25

tela.setCurrent(lista); }

26 27 28

public void pauseApp() {

29

}

30 public void destroyApp(boolean unconditional) {

31 32

notifyDestroyed();

33

tela.setCurrent(null);

34

}

35 36

public void commandAction(Command c, Displayable d) { if (c == cmdSair) {

37 38

destroyApp(true);

39

}else if ( c == List.SELECT_COMMAND){

40

int pos = lista.getSelectedIndex();

41

String txt = lista.getString(pos);

42

criarAlerta(txt);

43

}

44

}

45 public void criarComandos() {

46 47

cmdSair = new Command("Sair", Command.EXIT, 0);

48

}

49 50 51

public void criarLista(){ lista = new List("Dia da Semana", List.IMPLICIT);


39 52

lista.append("Segunda-Feira", null);

53

lista.append("Terça-Feira", null);

54

lista.append("Quarta-Feira", null);

55

lista.append("Quinta-Feira", null);

56

lista.append("Sexta-Feira", null);

57

lista.append("Sábado", null);

58

lista.append("Domingo", null);

59

lista.addCommand(cmdSair);

60

lista.setCommandListener(this);

61

}

62 63 64

public void criarAlerta(String msg){ Alert alerta = new Alert("Dia da Semana");

65

alerta.setString("O dia da semana selecionado foi "

+ msg); 66

alerta.setTimeout(Alert.FOREVER);

67 68

alerta.setType(AlertType.INFO); tela.setCurrent(alerta); }

69 70

}

A Figura 1 apresenta o resultado da execução do aplicativo. Neste exemplo é demonstrada a utilização de uma lista sem a necessidade de confirmação conhecida como lista implícita. Na Figura 1a é ilustra a lista com seus respectivos elementos, enquanto na Figura 1b o resultado da seleção de um item.


40

(a)

(b)

Figura 1: Resultado da execução do aplicativo.

A listagem Código 2 apresenta um exemplo de criação de uma lista com confirmação. Neste tipo de lista o usuário precisa escolher um elemento e acionar um botão de comando para processar a requisição. Neste exemplo foi utilizado um conjunto aleatório de frutas, além disso, para cada fruta é associada uma imagem armazenada no pacote imagens.

Código 2


41 1

package unidade4;

2 3

import javax.microedition.lcdui.Alert;

4

import javax.microedition.lcdui.AlertType;

5

import javax.microedition.lcdui.Command;

6

import javax.microedition.lcdui.CommandListener;

7

import javax.microedition.lcdui.Display;

8

import javax.microedition.lcdui.Displayable;

9

import javax.microedition.lcdui.Image;

10

import javax.microedition.lcdui.List;

11

import javax.microedition.midlet.*;

12 13

public class ListaComConfirmacao extends MIDlet implements

CommandListener { 14 15

private Display tela;

16

private Command cmdSair;

17

private Command cmdExibir;

18

private List lista;

19 20

public ListaComConfirmacao() {

21

criarComandos();

22

criarLista();

23

}

24 25

public void startApp() {

26

tela = Display.getDisplay(this); tela.setCurrent(lista);

27 28

}

29 30

public void pauseApp() {

31

}

32


42 33

public void destroyApp(boolean unconditional) {

34

notifyDestroyed();

35

tela.setCurrent(null);

36

}

37 38

public void commandAction(Command c, Displayable d) {

39

if (c == cmdSair) { destroyApp(true);

40 41

}else if ( c == cmdExibir){

42

String txt = "";

43

int contador = 0;

44

for (int i = 0; i < lista.size(); i++) { if (lista.isSelected(i)){

45 46

txt += lista.getString(i) + "\n";

47

contador++;

48

}

49

}

50

txt += "\nTotal selecionado= " + contador;

51

criarAlerta(txt);

52

}

53

}

54 55

public void criarComandos() {

56

cmdSair = new Command("Sair", Command.EXIT, 0);

57

cmdExibir = new Command("Exibir", Command.EXIT, 0);

58

}

59 60

public void criarLista(){

61

lista = new List("Dia da Semana", List.EXCLUSIVE);

62

lista.append("Banana", carregar("banana.png"));

63

lista.append("Kiwi", carregar("kiwi.png"));

64

lista.append("Limรฃo", carregar("limao.png"));

65

lista.append("Maรงa", carregar("maca.png"));


43 66

lista.append("Melancia", carregar("melancia.png"));

67

lista.append("Morango", carregar("morango.png"));

68

lista.append("Pera", carregar("pera.png"));

69

lista.append("Uva", carregar("uva.png"));

70

lista.addCommand(cmdSair);

71

lista.addCommand(cmdExibir);

72

lista.setCommandListener(this);

73

}

74 75

public void criarAlerta(String msg){

76 77

Alert alerta = new Alert("Seleção de Fruta(s)"); alerta.setString(msg);

78

alerta.setTimeout(Alert.FOREVER);

79

alerta.setType(AlertType.INFO);

80

tela.setCurrent(alerta);

81

}

82 83

public Image carregar(String nome){ try {

84 85

return Image.createImage("imagens/"+nome);

86

} catch (Exception e) { return null;

87 88

}

89

}

90 91

}

A Figura 2 demonstra o resultado da execução do aplicativo. Na Figura 2a é apresentada a lista e os respectivos elementos que podem ser selecionados pelo usuário. Como é uma lista do tipo exclusiva, a qual necessita de confirmação, o usuário precisa selecionar o elemento e acionar o botão exibir. Na Figura 2b é ilustrado o resultado da seleção.


44

(a)

(b)

Figura 2: Resultado da execução do aplicativo.

As listas com confirmação também podem permitir ao usuário selecionar múltiplos elementos. Para isso, é necessário alterar o tipo da lista para List.MULTIPLE. Com isso, o usuário poderá escolher nenhum, um ou vários itens da lista. Além disso, é necessário utilizar um botão para que seja processada a seleção do usuário. A Figura 3 apresenta um exemplo de lista com confirmação que possibilita a escolha de múltiplos elementos. Na Figura 3a é ilustrada a lista e seus elementos, enquanto na Figura 3b o resultado da seleção.


45

(a)

(b)

Figura 3: Resultado da execução do aplicativo.

Com isso, você aprendeu como utilizar listas para apresentar conjuntos de elementos em aplicativos Java ME.

Referências Bibliográficas DEITEL, Harvey M; DEITEL, Paul, J. Java: Como Programar. São Paulo: Prentice-Hall, 2005.


46 ORACLE. Java ME & Java Card Technology Documentation. Disponível em <http://docs.oracle.com/javame/>. Acesso em Janeiro de 2013.

Considerações Finais Nesta Unidade você aprendeu como utilizar o controle lista (List) para execução de conjunto de dados. Além disso, conheceu os mecanismos empregados na inserção e exibição de elementos da lista.


47

UNIDADE 5 CONSTRUÇÃO DE FORMULÁRIOS: CAMPO DE TEXTO, RÓTULO E IMAGEM Nesta Unidade você aprenderá como construir formulários com interfaces gráficas

complexas

contendo

múltiplos

controles.

Você

desenvolverá

aplicativos contendo campos de texto, rótulos e imagens. Introdução Os formulários permitem a construção de aplicativos constituídos por múltiplos controles. Com isso, é possível elaborar interfaces gráficas capazes de apresentar diversos controles visuais simultaneamente. O processo de desenvolvimento é semelhante a confecção de formulários para aplicações desktop, em que é possível adicionar itens conforme a necessidade da aplicação.

No

entanto,

a

principal

diferença

está

relacionada

ao

posicionamento dos elementos, uma vez que, na tecnologia Java ME o posicionamento é definido automaticamente pelo dispositivo de acordo com a ordem que os elementos foram adicionados. Na construção de um formulário é possível adicionar itens que possibilitam a interação do usuário das mais variadas formas. Os controles que podem ser incluídos nos formulários são: •

ChoiceGroup

DateField

Gauge

ImageItem

StringItem

TextField

Nesta Unidade você aprenderá como utilizar os controles ImageItem, StringItem e TextField. Além disso, entenderá como é o mecanismo capaz de adicionar novos itens a um formulário (Form)


48 Rótulo (StringItem) Um rótulo é um tipo de controle que pode ser adicionado ao formulário e tem como objetivo a apresentação de informações textuais. Dessa forma, um rótulo pode ser utilizado para exibir informações para o usuário. Este controle é geralmente conhecido como label, e na tecnologia Java ME faz parte de uma classe denominada StringItem. Para exibição de uma informação textual é necessário especificar dois parâmetros: rótulo – que indica um texto associado ao controle; texto – que representa a informação textual que será exibida. Por exemplo, a instrução a seguir demonstra a criação de um rótulo: StringItem str = new StringItem(“Nome:”, “João da Silva”);

Campo de Texto (TextField) Os controles do tipo campos de texto, que fazem parte da classe TextField, permite a entrada de informações textuais por meio do teclado. Com isso, o usuário pode inserir qualquer tipo de caractere existente, tais como letras, números e símbolos. Na criação de um campo de texto é necessário especificar quatro parâmetros que são denominados: rótulo – que representa um texto associado ao campo de texto; texto – que é utilizado para definir um texto padrão no interior do campo de texto, ou ainda pode ser representado por vazio (“”); tamanho – que define o número máximo de caracteres que pode ser inserido no campo de texto; e, restrições – que aplicam um conjunto de restrições a entrada do usuário, como por exemplo, permitir apenas a entrada de valores numéricos. Em termos práticos, o funcionamento de um campo de texto (TextField) é muito semelhante a uma caixa de texto (TextBox). A principal diferença está relacionada a necessidade do campo de texto ser adicionado a um formulário, além disso, este controle pode ser adicionado simultaneamente a outros itens


49 do formulário. Por exemplo, a instrução a seguir demonstra a criação de um campo de texto que aceita apenas valores numéricos. TextField txt = new TextField(“Idade”, “”,2,TextField.NUMERIC);

Imagem (ImageItem) O controle de ImageItem é utilizado para inserir uma imagem no formulário. As imagens podem estar no formato JPEG, GIF ou PNG, no entanto, por questões de compatibilidade com os mais variados tipos de dispositivo, é aconselhável a utilização de imagens no formato PNG. Para carregar uma imagem utilizando a classe ImageItem é fundamental a utilização de um bloco de tratamento de exceções (try...catch), uma vez, que este procedimento pode gerar erros e interromper o funcionamento do aplicativo. A listagem Código 1 apresenta um método genérico para carregar e retornar uma imagem. Para o correto funcionamento deste procedimento as imagens devem ser colocadas em um pacote denominado imagens. 1

public ImageItem carregar(String nome){

2

try {

3

return new ImageItem(

4

"",

5

Image.createImage("imagens/"+nome),

6

ImageItem.LAYOUT_CENTER,

7

"");

8 9

} catch (Exception e) { return null;

10 11

} }

A listagem Código 2 demonstra uma aplicação baseada em formulário que utiliza os controles campo de texto, rótulo e imagem. O aplicativo tem


50 como objetivo calcular a média aritmética simples a partir de duas notas informadas pelo usuário. Código 2 1

package unidade5;

2 3

import javax.microedition.lcdui.Command;

4

import javax.microedition.lcdui.CommandListener;

5

import javax.microedition.lcdui.Display;

6

import javax.microedition.lcdui.Displayable;

7

import javax.microedition.lcdui.Form;

8

import javax.microedition.lcdui.Image;

9

import javax.microedition.lcdui.ImageItem;

10

import javax.microedition.lcdui.StringItem;

11

import javax.microedition.lcdui.TextField;

12

import javax.microedition.midlet.*;

13 14

public

class

MediaNotas

extends

CommandListener { 15 16

private Display tela;

17

private Command cmdSair;

18

private Command cmdCalcular;

19

private Form frm;

20

private TextField nota1;

21

private TextField nota2;

22

private StringItem str;

23

private ImageItem img;

24 25

public MediaNotas() {

26

criarComandos();

27

criarFormulario();

28

}

MIDlet

implements


51 29 30

public void startApp() {

31

tela = Display.getDisplay(this);

32

tela.setCurrent(frm);

33

}

34 35

public void pauseApp() {

36

}

37 38

public void destroyApp(boolean unconditional) {

39

notifyDestroyed();

40

tela.setCurrent(null);

41

}

42 43

public void commandAction(Command c, Displayable d) {

44

if (c == cmdSair) {

45

destroyApp(true);

46

}else if (c == cmdCalcular){ str.setText(String.valueOf(calcularMedia()));

47 48 49

} }

50 51

public void criarComandos() {

52

cmdSair = new Command("Sair", Command.EXIT, 0);

53

cmdCalcular = new Command("Calcular", Command.OK,

0); 54

}

55 56 57 58

public ImageItem carregar(String nome){ try { return new ImageItem(

59

"",

60

Image.createImage("imagens/"+nome),


52 61

ImageItem.LAYOUT_CENTER,

62

"");

63

} catch (Exception e) {

64

return null;

65 66

} }

67 68

public void criarFormulario(){

69

frm = new Form("Média das Notas");

70 71

nota1

=

new

TextField("Nota

1:",

"",

5,

=

new

TextField("Nota

2:",

"",

5,

TextField.DECIMAL); nota2

72

TextField.DECIMAL); 73

str = new StringItem("Média: ", "");

74 75

img = carregar("medianotas.png");

76 77

//Adicionar controles ao formulário

78

frm.append(img);

79

frm.append(nota1);

80

frm.append(nota2);

81

frm.append(str);

82 83

frm.addCommand(cmdSair);

84

frm.addCommand(cmdCalcular);

85 86

frm.setCommandListener(this); }

87 88

public float calcularMedia(){

89

float n1 = Float.parseFloat(nota1.getString());

90

float n2 = Float.parseFloat(nota2.getString());

91

return (n1+n2)/2;


53 92 93

} }

A Figura 1 apresenta o resultado da execução do aplicativo. Para o cálculo da média é necessário informar duas notas e adicionar o botão de comando Calcular. O resultado do cálculo é visualizado em um controle StringItem.

Figura 1: Resultado da execução do aplicativo.


54 Referências Bibliográficas DEITEL, Harvey M; DEITEL, Paul, J. Java: Como Programar. São Paulo: Prentice-Hall, 2005. ORACLE. Java ME & Java Card Technology Documentation. Disponível em <http://docs.oracle.com/javame/>. Acesso em Janeiro de 2013.

Considerações Finais Nesta Unidade você aprendeu como elaborar formulários contendo múltiplos controles. Você construiu aplicativos utilizando caixas de texto, rótulos e imagens.


55

UNIDADE 6 CONSTRUÇÃO DE FORMULÁRIOS: GRUPO DE SELEÇÃO Nesta Unidade você aprenderá como utilizar grupos de seleção, para apresentação de múltiplos elementos, associados aos formulários. Com isso, você poderá construir interfaces gráficas complexas utilizando múltiplos controles. Introdução Geralmente, no desenvolvimento de aplicativos é comum a necessidade de apresentar para o usuário um conjunto de elementos. Estes elementos podem fazer parte de um conjunto de valores numéricos, por exemplo, ou ainda estar contidos em um conjunto de valores literais (String). Com a tecnologia Java ME a apresentação de conjunto de elementos em formulários com múltiplos controles é realizada por meio de uma classe denominada ChoiceGroup. Grupo de Seleção (ChoiceGroup) O controle grupo de seleção permite a exibição de um conjunto de elementos que pode ser selecionado pelo usuário. Este controle faz parte da classe ChoiceGroup e possibilita a criação de listas que são associadas aos formulários. Para criação de um grupo de seleção é necessário definir um rótulo, que representa um texto vinculado ao controle, e o tipo da lista que será exibida. Os tipos de listas disponíveis são: •

ChoiceGroup.EXCLUSIVE: que possibilita a seleção de um único elemento da lista.

ChoiceGroup.MULTIPLE: que permite a seleção de vários elementos da listas.


56 •

ChoiceGroup.POPUP: que exibe os elementos da lista utilizando um menu suspenso e permite a seleção de um único elemento por vez.

A listagem Código 1 demonstra a construção de um aplicativo Java ME utilizando o controle grupo de seleção. O resultado da execução da aplicação pode ser visualizada na Figura 1. Código 1 1

package unidade6;

2 3

import javax.microedition.lcdui.Alert;

4

import javax.microedition.lcdui.AlertType;

5

import javax.microedition.lcdui.ChoiceGroup;

6

import javax.microedition.lcdui.Command;

7

import javax.microedition.lcdui.CommandListener;

8

import javax.microedition.lcdui.Display;

9

import javax.microedition.lcdui.Displayable;

10

import javax.microedition.lcdui.Form;

11

import javax.microedition.lcdui.Image;

12

import javax.microedition.lcdui.ImageItem;

13

import javax.microedition.lcdui.Item;

14

import javax.microedition.midlet.*;

15 16

public

class

Vitaminas

extends

CommandListener { 17 18

private Display tela;

19

private Command cmdSair;

20

private Command cmdVoltar;

21

private Command cmdPedido;

22

private Form frm;

23

private ChoiceGroup cgFrutas;

24

private ChoiceGroup cgBase;

25

private ChoiceGroup cgCopo;

MIDlet

implements


57 26

private ImageItem img;

27 28

public Vitaminas() {

29

}

30 31

public void startApp() {

32

criarComandos();

33

criarSelecaoCopo();

34

criarSelecaocgBase();

35

criarSelecaoFrutas();

36

criarFormulario();

37

tela = Display.getDisplay(this);

38 39

tela.setCurrent(frm); }

40 41

public void pauseApp() {

42

}

43 44

public void destroyApp(boolean unconditional) {

45

notifyDestroyed();

46

tela.setCurrent(null);

47

}

48 49

public void commandAction(Command c, Displayable d) {

50

if (c == cmdSair) {

51

destroyApp(true);

52

} else if (c == cmdPedido) { processarPedido();

53 54

} else if (c == cmdVoltar) {

55

tela.setCurrent(frm);

56 57 58

} }


58 59

public void criarComandos() {

60

cmdSair = new Command("Sair", Command.EXIT, 0);

61

cmdVoltar = new Command("Voltar", Command.BACK, 0);

62

cmdPedido = new Command("Pedido", Command.OK, 0);

63

}

64 65

public void criarFormulario() { frm = new Form("Casa das Vitaminas");

66 67

img = carregar("vitamina.png");

68

frm.append(img);

69

frm.append(cgCopo);

70

frm.append(cgBase);

71

frm.append(cgFrutas);

72

frm.addCommand(cmdSair);

73

frm.addCommand(cmdPedido);

74

frm.setCommandListener(this);

75

}

76 77

public ImageItem carregar(String nome) {

78

try {

79

return new ImageItem(

80

"",

81

Image.createImage("imagens/" + nome),

82

ImageItem.LAYOUT_CENTER,

83

"");

84

} catch (Exception e) {

85

return null; }

86 87

}

88 89 90

public void criarSelecaoCopo() { cgCopo

ChoiceGroup.POPUP);

=

new

ChoiceGroup("Tamanho

do

copo",


59 91

cgCopo.append("300 ml", null);

92

cgCopo.append("500 ml", null);

93

cgCopo.append("700 ml", null);

94

cgCopo.setLayout(Item.LAYOUT_LEFT

|

Item.LAYOUT_EXPAND); 95

}

96 97

public void criarSelecaocgBase() {

98

cgBase

=

new

ChoiceGroup("Preparar

com",

ChoiceGroup.EXCLUSIVE); 99

cgBase.append("ร gua", null);

100

cgBase.append("Leite", null);

101

cgBase.setLayout(Item.LAYOUT_LEFT

|

Item.LAYOUT_EXPAND); 102

}

103 104 105

public void criarSelecaoFrutas() { cgFrutas

=

new

ChoiceGroup("Selecione

a(s)

Fruta(s)", ChoiceGroup.MULTIPLE); 106

cgFrutas.append("Banana",

carregar("banana.png").getImage()); 107

cgFrutas.append("Kiwi",

carregar("kiwi.png").getImage()); 108 109

cgFrutas.append("Maรงa", carregar("maca.png").getImage()); cgFrutas.append("Melancia",

carregar("mamao.png").getImage()); 110

cgFrutas.append("Melancia",

carregar("melancia.png").getImage()); 111

cgFrutas.append("Morango",

carregar("morango.png").getImage()); 112

cgFrutas.append("Pera",

carregar("pera.png").getImage()); 113

cgFrutas.append("Uva", carregar("uva.png").getImage());


60 114

cgFrutas.setLayout(Item.LAYOUT_LEFT

Item.LAYOUT_EXPAND); 115

}

116 117 118

public void processarPedido() { StringBuffer str = new StringBuffer();

119 120

str.append("\n");

121

str.append("Tamanho do Copo");

122 123

int pos = cgCopo.getSelectedIndex(); str.append(cgCopo.getString(pos));

124 125

str.append("\n");

126

str.append("Preparar com ");

127

pos = cgBase.getSelectedIndex();

128

str.append(cgBase.getString(pos).toUpperCase());

129

str.append("\n");

130 131

str.append("\n");

132

str.append("Fruta(s): ");

133

for (int i = 0; i < cgFrutas.size(); i++) { if (cgFrutas.isSelected(i)) {

134 135

str.append(cgFrutas.getString(i));

136

str.append(";");

137

}

138

}

139

str.append("\n");

140 141

Alert alerta = new Alert("Casa de Vitaminas");

142

alerta.setTimeout(Alert.FOREVER);

143

alerta.setType(AlertType.INFO);

144

alerta.setString(str.toString());

145

alerta.addCommand(cmdVoltar);

|


61 146

tela.setCurrent(alerta);

147 148

} }

Na Figura 1 é possível visualizar a tela inicial do aplicativo. Devido a quantidade de controles a barra de rolagem vertical foi habilitada. Na Figura 1a é exibida a primeira parte da tela, e na Figura 1b a segunda parte.

(a)

(b)

Figura 1: Resultado da execução do aplicativo.


62 Na Figura 2 pode ser visualizado o resultado da seleção dos grupos de seleção: tamanho do copo, base de preparo e frutas. As informações selecionadas são exibidas em uma caixa de diálogo.

Figura 2: Resultado da execução do aplicativo.

Referências Bibliográficas DEITEL, Harvey M; DEITEL, Paul, J. Java: Como Programar. São Paulo: Prentice-Hall, 2005.


63 ORACLE. Java ME & Java Card Technology Documentation. Disponível em <http://docs.oracle.com/javame/>. Acesso em Janeiro de 2013.

Considerações Finais Nesta Unidade você aprendeu como utilizar os grupos de seleção que permite apresentar ao usuário um conjunto de elementos. Além disso, foi possível construir uma aplicação completa baseada neste controle.


64

UNIDADE 7 CONSTRUÇÃO DE FORMULÁRIOS: CAMPO DE DATA E INDICADOR Nesta Unidade você estudará sobre a construção de formulários em aplicativos Java ME utilizando os controles campo de data e indicador. Um controle do tipo campo de data permite ao usuário selecionar uma data ou uma hora na interface gráfica do aplicativo, enquanto um controle do tipo indicador é utilizado para exibir uma barra de progresso que pode demonstrar algum tipo de processamento de informações no aplicativo. Campo Data (DateField) A classe DateField é um controle que permite ao usuário selecionar uma data e/ou uma hora em uma aplicação Java ME. Este controle possui uma aparência pré-definida que pode variar de dispositivo para dispositivo. Para criação de um campo de data é necessário especificar dois parâmetros: um rótulo que representa um texto associado ao controle; e o tipo do campo que pode ser: •

DateField.DATE: para seleção de data no formato dia, mês e ano;

DateField.TIME: para especificação de hora no formato hora, minuto, segundo;

DateField.DATE_TIME: para definição simultânea de data e hora. Nesta configuração o usuário seleciona as duas informações ao mesmo tempo.

A listagem Código 1 demonstra a construção de uma aplicação que tem como objetivo simular uma agenda de compromissos. Neste exemplo, o usuário poderá cadastrar novos compromissos, além de visualizar os compromissos agendados. Para cadastrar um novo compromisso, o usuário deverá selecionar uma data do controle DateField, uma hora, também de um controle DateField e especificar a descrição do compromisso. Uma caixa de diálogo do tipo Alert apresenta na tela a confirmação do agendamento.


65 C贸digo 1 1

package unidade7;

2 3

import java.util.Calendar;

4

import javax.microedition.lcdui.Alert;

5

import javax.microedition.lcdui.AlertType;

6

import javax.microedition.lcdui.Command;

7

import javax.microedition.lcdui.CommandListener;

8

import javax.microedition.lcdui.DateField;

9

import javax.microedition.lcdui.Display;

10

import javax.microedition.lcdui.Displayable;

11

import javax.microedition.lcdui.Form;

12

import javax.microedition.lcdui.Image;

13

import javax.microedition.lcdui.ImageItem;

14

import javax.microedition.lcdui.List;

15

import javax.microedition.lcdui.StringItem;

16

import javax.microedition.lcdui.TextField;

17

import javax.microedition.midlet.*;

18 19

public

class

Agenda

extends

CommandListener { 20 21

private Display tela;

22

private List menu;

23

private Command cmdSair;

24

private Command cmdCadastrar;

25

private Command cmdVoltar;

26

private Form frm;

27

private ImageItem img;

28

private DateField data;

29

private DateField hora;

30

private TextField descricao;

31

private StringBuffer agenda;

MIDlet

implements


66 32 33 34

public Agenda() { }

35 36

public void startApp() {

37

criarComandos();

38

criarMenu();

39

tela = Display.getDisplay(this);

40 41

tela.setCurrent(menu); }

42 43

public void pauseApp() {

44

}

45 46

public void destroyApp(boolean unconditional) {

47

notifyDestroyed();

48

tela.setCurrent(null);

49

}

50 51 52 53 54 55

public void commandAction(Command c, Displayable d) { if (c == cmdSair) { destroyApp(true); } else if (c == List.SELECT_COMMAND && d == menu) { if (menu.isSelected(0)) {

56

//Cadastrar Compromisso

57

criarFormulario();

58 59 60

tela.setCurrent(frm); } else if (menu.isSelected(1)) { //Exibir Agendamentos

61 62

exibirAgendamentos(); }

63

} else if (c == cmdCadastrar) {

64

cadastrarCompromisso();


67 65

criarAlerta();

66 67

} else if (c == cmdVoltar) { tela.setCurrent(menu);

68 69

} }

70 71

public void criarComandos() {

72

cmdSair = new Command("Sair", Command.EXIT, 0);

73

cmdCadastrar = new Command("Cadastrar", Command.OK,

0); 74 75

cmdVoltar = new Command("Voltar", Command.BACK, 0); }

76 77

public void criarMenu() {

78 79

menu = new List("Agenda", List.IMPLICIT); menu.append("Cadastrar compromisso", null);

80 81

menu.append("Exibir agendamentos", null); menu.addCommand(cmdSair);

82

menu.setCommandListener(this);

83

agenda = new StringBuffer();

84

}

85 86 87

public ImageItem carregar(String nome) { try {

88

return new ImageItem(

89

"",

90

Image.createImage("imagens/" + nome),

91

ImageItem.LAYOUT_CENTER,

92

"");

93

} catch (Exception e) {

94

return null;

95 96

} }


68 97 98

public void criarFormulario() {

99

frm = new Form("Agenda");

100

data = new DateField("Data ", DateField.DATE);

101

hora = new DateField("Hora: ", DateField.TIME);

102

descricao = new TextField("Compromisso", "", 600,

TextField.ANY); 103

img = carregar("agenda.png");

104

frm.append(img);

105

frm.append(data);

106

frm.append(hora);

107

frm.append(descricao);

108

frm.addCommand(cmdVoltar);

109

frm.addCommand(cmdCadastrar);

110

frm.setCommandListener(this);

111

}

112 113

public void cadastrarCompromisso() {

114

//processar a data

115

Calendar cal = Calendar.getInstance();

116

cal.setTime(data.getDate());

117 118

agenda.append(cal.get(Calendar.DAY_OF_MONTH));

119

agenda.append("/");

120

agenda.append(cal.get(Calendar.MONTH));

121

agenda.append("/");

122

agenda.append(cal.get(Calendar.YEAR));

123

agenda.append("\n");

124 125

//processar a hora

126

cal.setTime(hora.getDate());

127

agenda.append(cal.get(Calendar.HOUR));

128

agenda.append(":");


69 129

agenda.append(cal.get(Calendar.MINUTE));

130

agenda.append(":");

131

agenda.append(cal.get(Calendar.SECOND));

132

agenda.append("\n");

133 134

//processar o compromisso

135

agenda.append(descricao.getString());

136

agenda.append("\n\n");

137

}

138 139

public void criarAlerta() {

140

Alert alerta = new Alert("Agenda");

141

alerta.setString("Compromisso agendado com sucesso!");

142

alerta.setTimeout(Alert.FOREVER);

143

alerta.setType(AlertType.INFO);

144

alerta.addCommand(cmdVoltar);

145

alerta.setCommandListener(this);

146

tela.setCurrent(alerta); }

147 148 149 150

public void exibirAgendamentos() { frm = new Form("Agenda");

151

frm.append(new StringItem("", agenda.toString()));

152

frm.addCommand(cmdVoltar);

153

frm.setCommandListener(this);

154

tela.setCurrent(frm);

155 156

} }

A Figura 1 apresenta o resultado da execução do aplicativo no emulador. Na Figura 1a é ilustrado o menu principal, que permite ao usuário selecionar a opção desejada: cadastrar compromisso ou exibir agendamentos; Na Figura 1b é demonstrada a tela de cadastro de compromissos.


70

(a)

(b)

Figura 1: Resultado da execução do aplicativo para agenda de compromissos. (a) Menu principal; (b) Tela para cadastro de compromissos.

A Figura 2 apresenta a continuidade das telas do aplicativo para agendamento de compromissos. Na Figura 2a é ilustrada a caixa de diálogo que exibe uma mensagem de confirmação do agendamento, enquanto a Figura 2b demonstra o resultado do acionamento da opção do menu principal Exibir Agendamentos, em que são apresentados para o usuário todos os compromissos que foram agendados com o aplicativo.


71

(a)

(b)

Figura 1: Resultado da execução do aplicativo para agenda de compromissos. (a) Confirmação de agendamento; (b) Exibição dos compromissos agendados.

Indicador (Gauge) O controle da classe Gauge possibilita ao programador incluir na interface gráfica da aplicação uma barra de progresso. Este controle pode ser configurado de duas maneiras, conhecidas como: interativa ou não interativa. Um controle interativo necessita a interação do usuário por meio dos botões do dispositivo, enquanto o controle não interativo é executado


72 automaticamente. A especificação do tipo do controle indicador é realizada no momento da criação do objeto utilizando um valor booleano (true ou false). Por exemplo, a instrução a seguir cria um Gauge interativo (true) com valores no intervalo máximo de 10 até o mínimo 1: Gauge g = new Gauge(“Exemplo”, true, 10, 1); A listagem Código 2 demonstra a utilização do controle Gauge com a construção de um aplicativo para executar arquivos de áudio do tipo MP3. Para isso, você precisará armazenar os arquivos de áudio em um pacote denominado som. Código 2 1

package unidade7;

2 3

import java.io.InputStream;

4

import javax.microedition.lcdui.Command;

5

import javax.microedition.lcdui.CommandListener;

6

import javax.microedition.lcdui.Display;

7

import javax.microedition.lcdui.Displayable;

8

import javax.microedition.lcdui.Form;

9

import javax.microedition.lcdui.Gauge;

10

import javax.microedition.media.Manager;

11

import javax.microedition.media.Player;

12

import javax.microedition.media.control.VolumeControl;

13

import javax.microedition.midlet.*;

14 15

public

class

PlayerSom

CommandListener { 16 17

private Display tela;

18

private Form frm;

19

private Command cmdSair;

20

private Command cmdPlay;

extends

MIDlet

implements


73 21

private Gauge gg;

22

private Player player;

23 24

public void startApp() {

25

criarComandos();

26

criarBarraVolume();

27

criarFormulario();

28

tela = Display.getDisplay(this);

29

tela.setCurrent(frm);

30

}

31 32

public void pauseApp() {

33

}

34 35

public void destroyApp(boolean unconditional) {

36

notifyDestroyed();

37

tela.setCurrent(null);

38

}

39 40

public void commandAction(Command c, Displayable d) {

41

if (c == cmdSair) {

42

destroyApp(true);

43

} else if (c == cmdPlay) {

44

criarPlayer();

45

}

46

}

47 public void criarComandos() {

48 49

cmdSair = new Command("Sair", Command.EXIT, 0);

50

cmdPlay = new Command("Play", Command.OK, 0);

51

}

52 53

public void criarFormulario() {


74 54

frm = new Form("Player de Som");

55

frm.append(gg);

56

frm.addCommand(cmdSair);

57

frm.addCommand(cmdPlay);

58

frm.setCommandListener(this);

59

}

60 public void criarBarraVolume() {

61 62

gg = new Gauge("Selecione o volume desejado", true,

100, 1); 63

gg.setValue(50);

64

}

65 66

public void criarPlayer() {

67

try {

68

player = Manager.createPlayer(

69 getClass().getResourceAsStream("/som/exemplo.mp3"), "audio/mpeg");

70 71

player.realize();

72

VolumeControl

vc

=

(VolumeControl)

player.getControl("VolumeControl"); 73

vc.setLevel(gg.getValue());

74

player.prefetch();

75

player.start();

76

} catch (Exception e) {

77 78

System.out.println("ERRO: " + e.getMessage()); }

79 80

} }

A Figura 2 ilustra o resultado da execução do aplicativo. Neste exemplo foi utilizado um arquivo de áudio MP3 denominado exemplo.mp3.


75

Figura 2: Resultado da execução do aplicativo para player de arquivos mp3. Referências Bibliográficas DEITEL, Harvey M; DEITEL, Paul, J. Java: Como Programar. São Paulo: Prentice-Hall, 2005. ORACLE. Java ME & Java Card Technology Documentation. Disponível em <http://docs.oracle.com/javame/>. Acesso em Janeiro de 2013.

Considerações Finais


76 Nesta Unidade você aprendeu como utilizar o campo de data (e hora) e o indicador para a construção de formulários. Com isso, você poderá elaborar os mais variados tipos de aplicações utilizando a tecnologia Java ME.


77

UNIDADE 8 ARMAZENAMENTO PERSISTENTE DE DADOS Nesta Unidade você aprenderá como armazenar dados de maneira persistente utilizando a tecnologia Java ME. Para isso, você utilizará um recurso denominado Record Management System (RMS) que permite criar arquivos de dados nos dispositivos. Introdução Os dispositivos móveis capazes de executar aplicativos que utilizam o perfil MIDP – Mobile Information Device Profile possibilitam o armazenamento de dados de maneira persistente. Com isso, é possível construir aplicações capazes de guardar dados na memória do dispositivo. De acordo com a configuração CLDC e o perfil MIDP os dispositivos precisam ter pelo menos 8 kb de espaço para armazenamento. Esse espaço de

memória

pode

ser

aumentado

significativamente

utilizando

o

armazenamento em cartões, como por exemplo, os Secure Digital Card (SD). Record Store A classe Record Store fornece ao desenvolvedor de aplicativos Java ME um sistema simplificado de banco de dados capaz de manipular dados por meio de registros. Os registros, necessariamente, precisam ser identificados de maneira única no dispositivo, assim, a nomeação do arquivo utilizado para armazenamento dos registros é crucial para o correto funcionamento do aplicativo. Para manipulação dos registros armazenados no Record Store o primeiro passo é a abertura do arquivo de dados. Essa abertura é realizada com o uso da instrução openRecordStore. Na abertura do arquivo é necessário informar dois parâmetros: nome do arquivo de dados; valor booleano que indica se um novo arquivo deverá ser criado caso o arquivo de dados não


78 exista. Ao final, da manipulação dos registros é essencial o fechamento do Record Store por meio da instrução closeRecordStore. A inclusão de novos registros no arquivo de armazenamento é realizada com o uso da instrução addRecord, enquanto a leitura dos registros guardados nos arquivos é efetuada com a instrução getRecord. Os registros armazenados no arquivo são identificados unicamente com números inteiros começando em 1 (um). A listagem Código 1 demonstra a utilização do Record Store para o armazenamento persistente de dados em dispositivos móveis. Neste exemplo, são ilustradas as operações de inserção, pesquisa e listagem dos registros. Código 1 1

package unidade8;

2 3

import javax.microedition.lcdui.Alert;

4

import javax.microedition.lcdui.AlertType;

5

import javax.microedition.lcdui.Command;

6

import javax.microedition.lcdui.CommandListener;

7

import javax.microedition.lcdui.Display;

8

import javax.microedition.lcdui.Displayable;

9

import javax.microedition.lcdui.Form;

10

import javax.microedition.lcdui.Image;

11

import javax.microedition.lcdui.Item;

12

import javax.microedition.lcdui.List;

13

import javax.microedition.lcdui.StringItem;

14

import javax.microedition.lcdui.TextField;

15

import javax.microedition.midlet.*;

16

import javax.microedition.rms.RecordStore;

17 18

public

class

CommandListener { 19

AgendaContato

extends

MIDlet

implements


79 20

private Display tela;

21

private Command cmdSair;

22

private Command cmdInserir;

23

private Command cmdPesquisar;

24

private Command cmdVoltar;

25

private Form frm;

26

private List menu;

27

private TextField nome;

28

private TextField email;

29

private RecordStore rs;

30

private StringBuffer contatos;

31

private final String TITULO = "Agenda de Contatos";

32 33

public void startApp() {

34

criarComandos();

35

criarMenu();

36

tela = Display.getDisplay(this);

37

tela.setCurrent(menu);

38

}

39 40

public void pauseApp() {

41

}

42 43

public void destroyApp(boolean unconditional) {

44

notifyDestroyed();

45

tela.setCurrent(null);

46

}

47 48 49 50 51 52

public void commandAction(Command c, Displayable d) { if (c == cmdSair) { destroyApp(true); } else if (c == cmdVoltar) { tela.setCurrent(menu);


80 53

} else if (c == List.SELECT_COMMAND) {

54

switch (menu.getSelectedIndex()) {

55

case 0:

56

criarFormInserir();

57

break;

58

case 1:

59

criarFormPesquisar();

60

break;

61

case 2:

62

criarFormListar();

63

break;

64

}

65

tela.setCurrent(frm);

66

} else if (c == cmdInserir) {

67

adicionarRegistro(nome.getString(),

email.getString()); 68

} else if (c == cmdPesquisar) {

69 70 71

pesquisarRegistros(nome.getString()); } }

72 73

public void criarComandos() {

74

cmdSair = new Command("Sair", Command.EXIT, 0);

75

cmdVoltar = new Command("Voltar", Command.BACK, 0);

76

cmdInserir = new Command("Inserir", Command.OK, 0);

77

cmdPesquisar = new Command("Pesquisar", Command.OK,

0); 78

}

79 80

public void criarMenu() {

81

menu = new List(TITULO, List.IMPLICIT);

82

menu.append("Inserir", carregar("inserir.png"));

83

menu.append("Pesquisar", carregar("pesquisar.png"));


81 84

menu.append("Listar", carregar("listar.png"));

85

menu.addCommand(cmdSair);

86

menu.setCommandListener(this);

87

}

88 89

public void criarFormInserir() {

90

frm = new Form(TITULO);

91

nome = new TextField("Nome","", 20, TextField.ANY);

92

nome.setLayout(Item.LAYOUT_LEFT

|

Item.LAYOUT_EXPAND); 93 94

email =new TextField("E-mail","",20,TextField.ANY);

95

email.setLayout(Item.LAYOUT_LEFT

|

Item.LAYOUT_EXPAND); 96 97

frm.append(new StringItem("", "Inserir"));

98

frm.append(nome);

99

frm.append(email);

100

frm.addCommand(cmdInserir);

101

frm.addCommand(cmdVoltar);

102

frm.setCommandListener(this);

103

}

104 105 106

public void criarFormPesquisar() { frm = new Form(TITULO);

107 108

nome = new TextField("Nome","", 20, TextField.ANY);

109

nome.setLayout(Item.LAYOUT_LEFT

Item.LAYOUT_EXPAND); 110 111

frm.append(new StringItem("", "Pesquisar"));

112

frm.append(nome);

113

frm.addCommand(cmdPesquisar);

|


82 114

frm.addCommand(cmdVoltar);

115

frm.setCommandListener(this);

116

}

117 118 119

public void criarFormListar() { frm = new Form(TITULO);

120 121

listarRegistros(); frm.append(new StringItem("", contatos.toString()));

122

frm.addCommand(cmdVoltar);

123

frm.setCommandListener(this);

124

}

125 126

public Image carregar(String nome) {

127

try {

128

return Image.createImage("imagens/" + nome);

129

} catch (Exception e) {

130

return null;

131 132

} }

133 134

public void exibirAlerta(String msg, AlertType tipo) {

135

Alert alerta = new Alert(TITULO, msg, null, tipo);

136

alerta.setTimeout(Alert.FOREVER);

137

alerta.addCommand(cmdVoltar);

138

alerta.setCommandListener(this);

139

tela.setCurrent(alerta);

140

}

141 142

public

void

adicionarRegistro(String

nome,

email) { 143 144 145

try { byte[] registro = nome.getBytes();

String


83 146

rs

=

RecordStore.openRecordStore("agendacontatos", true); 147

rs.addRecord(registro, 0, registro.length);

148 149

registro = email.getBytes();

150

rs.addRecord(registro, 0, registro.length);

151 152

rs.closeRecordStore();

153 154

exibirAlerta("Operação realizada com sucesso!",

AlertType.INFO); 155 156

} catch (Exception e) {

157

exibirAlerta("ERRO:

"

+

e.getMessage(),

AlertType.ERROR); 158

}

159

}

160 public void pesquisarRegistros(String chave) {

161 162

try {

163

byte[] registro = new byte[1];

164

String resultado = "";

165

rs

=

RecordStore.openRecordStore("agendacontatos", false); 166 167

int i = 1;

168

boolean achou = false;

169

while

(i

<=

rs.getNumRecords()

&&

achou

==

false) { 170

if (rs.getRecordSize(i) > registro.length)

{ 171

registro

byte[rs.getRecordSize(i)];

=

new


84 172

}

173 174

int tamanho = rs.getRecord(i, registro, 0);

175

resultado

=

new

String(registro,

0,

tamanho); 176 177

if (resultado.toUpperCase().equals(chave.toUpperCase())) {

178

achou = true;

179 180

tamanho = rs.getRecord(i + 1, registro,

0); 181

resultado

=

"\nRegistro

resultado

+=

"\nE-mail=

Encontrado

\n\nNome= " + resultado; 182

"

+

new

String(registro, 0, tamanho); 183

}

184

i = i + 2;

185

}

186 187 188

if ( achou == true){ exibirAlerta(resultado, AlertType.INFO); }else{

189 190

exibirAlerta("Registro

n達o

encontrado.",

AlertType.WARNING); 191

}

192 193 rs.closeRecordStore();

194 195

} catch (Exception e) {

196

exibirAlerta("ERRO: " + e.getMessage(), AlertType.ERROR);

197

}

198 199

}


85 200

public void listarRegistros() {

201

try {

202

contatos = new StringBuffer();

203

byte[] registro = new byte[1];

204

rs

=

RecordStore.openRecordStore("agendacontatos", false); 205

for (int i = 1; i <= rs.getNumRecords(); i +=

2) { 206 207

if (rs.getRecordSize(i) > registro.length)

{ 208

registro

=

new

byte[rs.getRecordSize(i)]; 209

}

210 211

contatos.append("Nome: ");

212

int tamanho = rs.getRecord(i, registro, 0);

213

contatos.append(new

String(registro,

0,

tamanho)); contatos.append("\n");

214 215 216

contatos.append("E-mail: ");

217

tamanho = rs.getRecord(i + 1, registro, 0);

218

contatos.append(new

String(registro,

0,

tamanho)); contatos.append("\n\n");

219 220

}

221

rs.closeRecordStore();

222

} catch (Exception e) {

223

exibirAlerta("ERRO:

AlertType.ERROR); 224 225

} }

"

+

e.getMessage(),


86 226

} A Figura 1 apresenta a tela inicial do aplicativo em que o usuário poderá

selecionar a ação desejada.

Figura 1: Tela inicial do aplicativo Agenda de Contatos. Na Figura 2 é demonstrado o processo de inserção de um novo registro utilizando o Record Store. Para isso, o usuário deverá preencher os campos de texto nome e e-mail, em seguida, é necessário acionar o botão inserir. Na Figura 2a é apresentada a tela para preenchimento das informações, enquanto na Figura 2b a caixa de diálogo que confirmação a operação realizada.


87

(a)

(b)

Figura 2: Tela de inserção de novos registros na agenda. Na Figura 3 é demonstrado o processo de pesquisa de registros no banco de dados Record Store. Para isso, é necessário informar a chave de pesquisa que foi definida como o campo nome. Em seguida, o usuário necessita acionar o botão pesquisar. Caso obtenha sucesso, o resultado deste procedimento pode retornar as informações detalhas do registro, caso contrário, uma mensagem pode ser exibida para o usuário que nenhum registro foi encontrado.


88

(a)

(b)

Figura 3: Tela de pesquisa de registros da agenda de contatos. (a) Especificação do termo utilizado como chave de pesquisa; (b) Resultado retornado com a pesquisa. A Figura 4 apresenta o resultado do acionamento do item de menu listar, em que são exibidos todos os registros armazenados no arquivo de dados.


89

Figura 4: Tela de listagem dos registros armazenados no arquivo. Com isso, finalizamos a construção do aplicativo que demonstra a utilização do armazenamento persistente de dados utilizando a tecnologia Java ME. Referências Bibliográficas DEITEL, Harvey M; DEITEL, Paul, J. Java: Como Programar. São Paulo: Prentice-Hall, 2005. ORACLE. Java ME & Java Card Technology Documentation. Disponível em <http://docs.oracle.com/javame/>. Acesso em Janeiro de 2013.


90 Considerações Finais Nesta Unidade você aprendeu como construir aplicativos capazes de armazenar dados de maneira persistente utilizando o RMS – Record Management System.


www.cruzeirodosulvirtual.com.br

www.cruzeirodosulvirtual.com.br Campus Liberdade Rua Galv達o Bueno, 868 CEP 01506-000 - S達o Paulo/SP Brasil Tel: (55 11) 3385-3000


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.