jornada de cursos - j2me
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 PresentationTRANSCRIPT
Jornada de Cursos - J2ME
Aula 3 – MIDP
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
• High-level API de Componentes de interface com o usuário - javax.microeidtion.lcdui.*
Overview MIDP
• Elemento-chave no mundo J2ME• Junto com CLDC
• Conectividade
• Interface gráfica rica
Relembrando...• Mobile Information Device Profile
• MIDP applications = MIDlets = CLDC + MIDP
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.
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()");}
}
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
Hierarquia de classes
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
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);...}...}
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
Displayable
• Objeto que pode ser visto num dispositivo
• Screen • Objetos Displayable para Interface
alto nível
• Canvas• Objetos Displayable para Interface
baixo nível
Voltando ao Diagrama ...
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) {}}
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
Tratamento de eventosInterface de alto nível
Overview• Quadro geral
• Objetos Command
• Objetos Item
• Command e CommandListener
• Item e ItemStateListener
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
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
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
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
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();}
}
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
Interface gráfica de alto nível
Overview• Screen• Form• Item• StringItem• DateField• Gauge• TextField• Choice e ChoiceGroup• Image e ImageItem• List• TextBox• Alert e AlertType• Ticker
Screen• Classe progenitora
• Descendente direta de Displayable
• Métodos principais:• String getTitle ()• void setTitle(String title)• Ticker getTicker () • void setTicker (Ticker t)
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 ()
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)
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
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)
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
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)...}
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()
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
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...
Alternativa ao StringItem...
private Form fmMain;
int i = fmMain.append(“Login: ela”);
...
StringItem tmp = (StringItem) fmMain.get(i);
...
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
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?
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)
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
DateField
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
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
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()
Gauge
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
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
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”);
…
TextField
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
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)
ChoiceGroup
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
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)
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);
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
List
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()
List - Exercício• Utilize a classe List para criar uma lista de
compras num supermercado. Utilize uma List do tipo Multiple.
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
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()
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);
TextBox
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
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
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)
Alert
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
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
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);
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.
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)
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);…
Referências
• Wireless Programming with J2ME: Cracking the code, ISBN: 0-7645-4885-9
• http://www.java.sun.com/j2me