jornada de cursos - j2me

75
Jornada de Cursos - J2ME Aula 3 – MIDP

Upload: samuru

Post on 15-Jan-2016

26 views

Category:

Documents


0 download

DESCRIPTION

Aula 3 – MIDP. Jornada de Cursos - J2ME. Pausa para reflexão. "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan Tokuda , Mestre Zen. Agenda. Overview MIDP Tratamento de eventos - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Jornada de Cursos - J2ME

Jornada de Cursos - J2ME

Aula 3 – MIDP

Page 2: Jornada de Cursos - J2ME

Pausa para reflexão

"Sem esforço não há progresso, mas com esforço também não há progresso”

Ryotan Tokuda, Mestre Zen

Page 3: Jornada de Cursos - J2ME

Agenda• Overview MIDP

• Tratamento de eventos

• High-level API de Componentes de interface com o usuário - javax.microeidtion.lcdui.*

Page 4: Jornada de Cursos - J2ME

Overview MIDP

• Elemento-chave no mundo J2ME• Junto com CLDC

• Conectividade

• Interface gráfica rica

Page 5: Jornada de Cursos - J2ME

Relembrando...• Mobile Information Device Profile

• MIDP applications = MIDlets = CLDC + MIDP

Page 6: Jornada de Cursos - J2ME

MIDlets

• Java Application Manager:• Software responsável por instalar, remover e

executar MIDlets• Dependente de dispositivo e de fabricante

• Componentes do MIDlet• JAD – usado pelo JAM. Possui informações a

respeito do JAR.• JAR – Código compilado, junto com recursos.

• Mais de um MIDlet pode estar em um JAR.

Page 7: Jornada de Cursos - J2ME

Estrutura de um MIDletimport javax.microedition.midlet.MIDlet;

public class helloWorld extends MIDlet {

public helloWorld () { System.out.println("helloWorld()");}

// obrigatorioprotected void startApp() {

System.out.println("startApp()");}

// obrigatorioprotected void pauseApp() {

System.out.println("pauseApp()");}

// obrigatorioprotected void destroyApp(boolean arg0) {

System.out.println("destroyApp()");}

}

Page 8: Jornada de Cursos - J2ME

Ciclo de vida de um MIDlet• PAUSA

• Depois da chamada do construtor e antes da inicialização pelo JAM

• Durante o processo de

execução

• ATIVO

• MIDlet em execução

• Durante o processo de

execução

• DESTRUÍDO

• Desligada pelo JAM

• Libera todos os recursos

alocados

Page 9: Jornada de Cursos - J2ME

Hierarquia de classes

Page 10: Jornada de Cursos - J2ME

Display

• Gerenciador de tela que controla o que é mostrado no dispositivo

• Recupera informações sobre a tela atual (cores suportadas, resolução, etc)

• Objeto único para cada MIDlet

• Não é instanciado

Page 11: Jornada de Cursos - J2ME

Usando Displayimport javax.microedition.lcdui.Display;import javax.microedition.midlet.MIDlet;

public class DisplayStats extends MIDlet {private Display display;

// construtorpublic DisplayStats() {display = Display.getDisplay(this);...}...}

Page 12: Jornada de Cursos - J2ME

Display – métodos principais

• static Display getDisplay(MIDlet m)• Retorna o objeto display deste MIDlet

• Displayable getCurrent()• Retorna o objeto displayable corrente

• void setCurrent(Displayable d)• Mostra um objeto displayable

• int numColors()• Retorna o número de cores disponíveis

Page 13: Jornada de Cursos - J2ME

Displayable

• Objeto que pode ser visto num dispositivo

• Screen • Objetos Displayable para Interface

alto nível

• Canvas• Objetos Displayable para Interface

baixo nível

Page 14: Jornada de Cursos - J2ME

Voltando ao Diagrama ...

Page 15: Jornada de Cursos - J2ME

Enfim um Hello Worldimport javax.microedition.lcdui.Display;import javax.microedition.lcdui.TextBox;import javax.microedition.midlet.MIDlet;

public class HelloMIDlet extends MIDlet { private Display myDisplay; private TextBox myTextBox; public HelloMIDlet() {

myDisplay = Display.getDisplay(this); myTextBox = new TextBox("", "Hello World", 11, TextField.ANY);

} public void startApp() { this.myDisplay.setCurrent(myTextBox); } public void pauseApp() {} public void destroyApp(boolean unconditional) {}}

Page 16: Jornada de Cursos - J2ME

Pausa para reflexão

"Sem esforço não há progresso, mas com esforço também não há progresso”

Ryotan Tokuda, Mestre Zen

Page 17: Jornada de Cursos - J2ME

Tratamento de eventosInterface de alto nível

Page 18: Jornada de Cursos - J2ME

Overview• Quadro geral

• Objetos Command

• Objetos Item

• Command e CommandListener

• Item e ItemStateListener

Page 19: Jornada de Cursos - J2ME

Quadro geral• Eventos são essenciais para MIDlets, pois são

chave para interatividade

• Para gerenciarmos um evento:• O Hardware reconhece o evento físico• O software é notificado do evento• O evento é tratado pelo programador

Page 20: Jornada de Cursos - J2ME

Objetos Command• Contém informações sobre um evento• Podem ser considerados como “botões”

• Soft keys• Teclas

• O processo de eventos1. Criação do Objeto Command

2. Adicionar o comando a um Displayable

3. Adicionar um receptor (Listener) ao Displayable

Page 21: Jornada de Cursos - J2ME

Objetos Command• Command cmdExit = new Command(“exit”, Command.EXIT,

1)

• Argumentos• Nome para o comando• Constante (OK, EXIT, HELP, BACK, etc)• Prioridade

• Constante• Mapeia o posicionamento dos comandos na tela• Depende da implementação do fabricante

• Prioridade• Útil para a organização dos comandos em Menus e de

botões de software na tela

Page 22: Jornada de Cursos - J2ME

CommandListener• É o “receptor” de um comando

• Método a ser sobrescrito:• commandAction (Command c, Displayable d )

• Em commandAction é definido como o aplicativo deve se comportar quando um evento é disparado

Page 23: Jornada de Cursos - J2ME

Exemplo (faltam uns ajustes)• Mão na massa:• Classe Form é um Displayable

private Form fmMain; private Command cmExit;fmMain = new Form(“Curso CITi"); ...cmExit = new Command("Exit", Command.EXIT, 1); // 1º passo...fmMain.addCommand(cmExit); //2º passofmMain.setCommandListener(this); // 3º passo...public void commandAction(Command c, Displayable s) {

if (c == cmExit) {destroyApp(true);notifyDestroyed();}

}

Page 24: Jornada de Cursos - J2ME

Exercício• Crie um MIDlet que contenha um Form e controle três

botões: • Form fmMain = new Form(“Tela Principal”);• Lembre-se que Form é um objeto Displayable

• “exit”, usado para sair do MIDlet• “hello” imprime “Hello World”• “back” volta para a tela principal, após o usuário ter

visualizado a mensagem

Page 25: Jornada de Cursos - J2ME

Interface gráfica de alto nível

Page 26: Jornada de Cursos - J2ME

Overview• Screen• Form• Item• StringItem• DateField• Gauge• TextField• Choice e ChoiceGroup• Image e ImageItem• List• TextBox• Alert e AlertType• Ticker

Page 27: Jornada de Cursos - J2ME

Screen• Classe progenitora

• Descendente direta de Displayable

• Métodos principais:• String getTitle ()• void setTitle(String title)• Ticker getTicker () • void setTicker (Ticker t)

Page 28: Jornada de Cursos - J2ME

Form• Container que armazena vários componentes que

podem ser exibidos na tela• Métodos principais:

• int append (Item item)• int append (String texto)• void delete(int itemNum)• Item get (int itemNum) • int size ()

Page 29: Jornada de Cursos - J2ME

Form - ExemploForm fm = new Form(“Formulario”);

...

fm.append(item) // adiciona um item

...

size = fm.size() // retorna o tamanho

...// seta o receptor para um evento com Item

fm.setItemStateListener (ItemStateListener)

Page 30: Jornada de Cursos - J2ME

Item• Componente que pode ser adicionado a um

objeto Form

• Subclasses• ChoiceGroup, DateField , Gauge, ImageItem,

StringItem, TextField

• ItemStateListener• Interface a ser implementada para gerenciar

eventos relacionados a Item

Page 31: Jornada de Cursos - J2ME

Item• Qualquer componente que possa ser

adicionado a um objeto Form (ver diagrama de classes)

• Item é uma classe abstrata

• Métodos • String getLabel ()• Void setLabel (String label)

Page 32: Jornada de Cursos - J2ME

ItemStateListener

• O receptor de eventos relacionados a objetos Item

• Método a ser sobrescrito• void itemStateChanged ()• No mesmo modelo dos objetos Command• Este método é chamado quando o “item” tiver

sofrido alteração que gere evento

Page 33: Jornada de Cursos - J2ME

Item - Exemploprivate Form fmMain; // formularioprivate DateField dfToday; // o objeto DateField...fmMain = new Form(“My Form"); // instancia de FormdfToday = new DateField("Today:", DateField.DATE); // DateField...fmMain.append(dfToday); // adiciona Item (DateField) ao FormfmMain.setItemStateListener(this); // Gerencia os eventos de Form...public void itemStateChanged(Item item) {if (item == dfToday)...}

Page 34: Jornada de Cursos - J2ME

Exercício• Crie um MIDlet com um DateField e que

imprime “Item State Changed ...” quando seu estado é alterado

• Para esta implementação pode ser usado System.out.println()

Page 35: Jornada de Cursos - J2ME

StringItem• Rótulo estático e mensagem de texto• Não é editável• Não reconhece eventos• Métodos principais:

• StringItem(String label, String text)• String getText() – Obtém o valor atual do texto• Void setText(String text) – Configura o novo valor do texto• String getLabel() – Obtém o valor do rótulo

Page 36: Jornada de Cursos - J2ME

StringItem - Exemploprivate Form fmMain; // formularioPrivate StringItem siLogin; // o objeto StringItem...fmMain = new Form(“Jornada CITI"); // instancia de FormsiLogin = newStringItem(“Login: ", “ela”); // StringItem...fmMain.append(siLogin); // adiciona Item (StringItem) ao Form...

Page 37: Jornada de Cursos - J2ME

Alternativa ao StringItem...

private Form fmMain;

int i = fmMain.append(“Login: ela”);

...

StringItem tmp = (StringItem) fmMain.get(i);

...

Page 38: Jornada de Cursos - J2ME

Exercício• Construa um MIDlet simples que possui dois botões

(next e exit). Na primeira tela é exibido um StringItem com o label “Dados 1/2” e o texto “Nome: José”

• Next: passa para uma outra tela, onde o label é “Dados 2/2” e texto “Fone: 555-5555”

• Exit: sai da aplicação em qualquer das “duas” telas

Page 39: Jornada de Cursos - J2ME

Exercitando ...• Insira um texto (label) em um Form usando as

duas maneiras aprendidas, em seguida recupere ambos na forma de StringItem e para cada um imprima no console o label e o texto.

• O que você conclui?

Page 40: Jornada de Cursos - J2ME

DateField• Objeto Item que manipula de forma simples

tipos Date (java.util)

• Métodos principais:• DateField (String label, int modo)• Date getDate ()• void setDate(Date data)

Page 41: Jornada de Cursos - J2ME

DateField - Exemplo// criação do objeto DateField

DateField df = new DateField(“Data:”, DateField.DATE);

...

java.util.Date dataAtual = new java.util.Date ();

df.setDate(dataAtual); // seta a data do DateField

df.getDate (); // recupera a data atual

Page 42: Jornada de Cursos - J2ME

DateField

Page 43: Jornada de Cursos - J2ME

Gauge• São basicamente indicadores de progresso de

uma ação• Existem dois modos de atualização

• Interativo• Não-interativo

• Exemplos• Controle de volume• Progresso de download

Page 44: Jornada de Cursos - J2ME

Gauge – Continuação • Métodos Principais

• Gauge(String label, boolean interactive, int maxValue, int initialValue) - Construtor

• int getValue() – Obtém o valor atual do medidor• void setValue(int value) – Configura o novo valor do

medidor• Void setMaxValue(int maxValue) – Configura o

novo valor máximo

Page 45: Jornada de Cursos - J2ME

Gauge - Exemplo// Gauge interativo

Gauge gInt = new Gauge(“Volume”, true, 20,2)Gauge nInt = new Gauge(“Volume”,false, 20,2)...// Seta um valor qualquer

gInt.setValue(10)nInt.setVaule(20)// Retorna o valor atual

gInt.getValue()nInt.getValue()

Page 46: Jornada de Cursos - J2ME

Gauge

Page 47: Jornada de Cursos - J2ME

TextField• Caixa de texto para formulários• Suporta múltiplas linhas• Opção de filtrar a entrada de dados

• CONSTRAINT_MASK• ANY• EMAILADDR• NUMERIC• PASSWORD• PHONENUMBER• URL

Page 48: Jornada de Cursos - J2ME

TextField - Continuação• Métodos principais

• TextField (String label, String text, int max, int constraints)• void delete(int offset, int length)• int getChars(char[] data)• void insert(String src, int position)• String getString()• int getConstraints() *• int size()

* Usado com CONSTRAINT_MASK

Page 49: Jornada de Cursos - J2ME

TextField - Exemplo// cria um novo TextField com máscara para número de telefone

tfPhone = new TextField("Phone:", "", 10, TextField.PHONENUMBER);

…// recupera o texto

tf.getChars(arrayDestino);

// seta um String

tf.setString(“Curso J2ME”);

Page 50: Jornada de Cursos - J2ME

TextField

Page 51: Jornada de Cursos - J2ME

Choice e ChoiceGroup• Choice: Interface que define os métodos para

se manipular vários tipos de seleções predefinidas

• ChoiceGroup• Implementa Choice• Pode ser usado como CheckBox ou RadioButton

Page 52: Jornada de Cursos - J2ME

ChoiceGroup - Continuação• Tipos

• EXCLUSIVE• MULTIPLE

• Métodos principais:• ChoiceGroup(String label, int choiceType)• int append(String stringPart, Image imagePart)• void insert(int elementNum, String stringElement, Image

imageElement)• getSelectedIndex()• boolean isSelected(int elementNum)

Page 53: Jornada de Cursos - J2ME

ChoiceGroup

Page 54: Jornada de Cursos - J2ME

Image• Representa uma imagem a ser exibida no

display do dispositivo• Tipos

• Imutável: pode ser usada diretamente no Form, nas opções de um Choice ou em um Alert.

• Mutável: mais flexível. Simplesmente um espaço de memória reservado em que poderá ser pintada a imagem

Page 55: Jornada de Cursos - J2ME

ImageItem• Possibilita a exibição de uma imagem em um objeto

Form• A exibição depende da implementação do fabricante

do dispositivo• Métodos principais

• ImageItem(String label, Image img, int layout, String altText)• ImageItem(String label, Image img, int layout, String altText)• void setImage(Image img)• void setLayout(int layout)

Page 56: Jornada de Cursos - J2ME

ImageItem – Exemplo...try {

Image img = Image.createImage(“/citi.png”); Image img2 = Image.createImage(“/bird.png”);} catch (IOException ioe) { ... }...ImageItem imCiti = new ImageItem(null, img, ImageItem.LAYOUT_DEFAULT);...fmMain.append(imCiti);...fmMain.append(Img2);

Page 57: Jornada de Cursos - J2ME

List• Semelhante a ChoiceGroup, entretanto não

gera eventos de Item

• Possui mais um tipo que é IMPLICIT, não implementado por ChoiceGroup

• Não herda de Item, ao contrário de ChoiceGroup

Page 58: Jornada de Cursos - J2ME

List

Page 59: Jornada de Cursos - J2ME

List - Continuação• Métodos principais

• List(String title, int listType)• int append(String stringPart, Image imagePart)• void delete(int elementNum)• int getSelectedIndex()• boolean isSelected(int elementNum)• int size()

Page 60: Jornada de Cursos - J2ME

List - Exercício• Utilize a classe List para criar uma lista de

compras num supermercado. Utilize uma List do tipo Multiple.

Page 61: Jornada de Cursos - J2ME

TextBox• Caixa de texto que permite filtragem para

certos tipos de caracteres

• Semelhante a TextField

• Não herda de Item, ao contrário de TextField

Page 62: Jornada de Cursos - J2ME

TextBox• Métodos principais:

• TextBox (String title, String text, int maxSize, int constraints)

• void delete(int offset, int length)• void insert(String src, int position)• int getChars(char[] data)• void setConstraints(int constraints)• int size()

Page 63: Jornada de Cursos - J2ME

TextBox - ExemplotextBox tb;...

// instância de TextBox

tb = new TextBox(“TextBox”,””,20,TextField.ANY);

...// seta o display

display.setCurrent(tb);

…// recupera o texto

tb.getChars(arrayDestino);

Page 64: Jornada de Cursos - J2ME

TextBox

Page 65: Jornada de Cursos - J2ME

Exercitando ...• Escreva um MIDlet que copia um texto de um

TextBox para outro. O texto deverá ser selecionado pela posição do cursor

• Possui os seguintes comandos:• EXIT: termina a aplicação• COPY: copia o texto para outro TextBox• BACK: volta para o TextBox da tela inicial

Page 66: Jornada de Cursos - J2ME

Alert• Caixa de diálogo simples que possui uma imagem e

um texto, ambos opcionais• Objetos Command (“botões”) não podem ser

adicionados ao objeto Alert• A interatividade com o Alert fica a cargo do fabricante

do dispositivo• Tipos

• Modal• Timed

Page 67: Jornada de Cursos - J2ME

Alert - Continuação• Pode ser usado diretamente por Display ou usado em

conjunto com um Displayable• Métodos principais:

• Alert(String title, String alertText, Image alertImage, AlertType at)

• String getString()• void setString(String str)• int getTimeout()• void setTimeout(int time)

Page 68: Jornada de Cursos - J2ME

Alert

Page 69: Jornada de Cursos - J2ME

AlertType• Classe especialmente útil

• Encapsula informações sobre o Alert e possibilita o suporte a som

• Duas maneiras de se utilizar som• O objeto Alert possuindo um AlertType • Usando um método estático de AlertType

chamando playSound

Page 70: Jornada de Cursos - J2ME

AlertType• Tipos

• ALARM: usado para uma notificação• CONFIRMATION: confirmação de um evento ou

ação• ERROR: indica que um erro foi encontrado• INFO: indica em geral uma informação não-critíca

ao usuário• WARNING: indica problemas potenciais

Page 71: Jornada de Cursos - J2ME

Alert - ExemploForm fmMain;Alert alerta;...// instancia os objetos

fmMain = new Form(“Tela principal”);alerta = new Alert(“INFO”, “CURSO J2ME”, null, AlertType.INFO);...// seta o alerta para ficar visível

display.setCurrent(alerta, fmMain);

Page 72: Jornada de Cursos - J2ME

Exercício• Acrescente ao exercício de TextField um Alert

ao abrir a aplicação antes da tela inicial e um Alert caso o par login e senha não seja igual a “adm” e “123” respectivamente.

Page 73: Jornada de Cursos - J2ME

Ticker• Representa um texto que rola na tela

• É atributo de Screen

• Possui somente três métodos principais• Ticker (String texto)• getString ()• setString (String texto)

Page 74: Jornada de Cursos - J2ME

Ticker - Exemplo// o Ticker e o objeto Screen

Form fmMain;Ticker testTicker;...// instância do Ticker

testTicker = new Ticker(“Teste Ticker”);…// seta o Ticker do Form

fmMain.setTicker(testTicker);…

Page 75: Jornada de Cursos - J2ME

Referências

• Wireless Programming with J2ME: Cracking the code, ISBN: 0-7645-4885-9

• http://www.java.sun.com/j2me