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 MIDlet
import javax.microedition.midlet.MIDlet;
public class helloWorld extends MIDlet {
public helloWorld () {
System.out.println("helloWorld()");
}
// obrigatorio
protected void startApp() {
System.out.println("startApp()");
}
// obrigatorio
protected void pauseApp() {
System.out.println("pauseApp()");
}
// obrigatorio
protected 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 Display
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
public class DisplayStats extends MIDlet {
private Display display;
// construtor
public 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 World
import 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 eventos
Interface 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 eventos
1. 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º passo
fmMain.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 - Exemplo
Form 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 - Exemplo
private Form fmMain; // formulario
private DateField dfToday; // o objeto DateField
...
fmMain = new Form(“My Form"); // instancia de Form
dfToday = new DateField("Today:", DateField.DATE); // DateField
...
fmMain.append(dfToday); // adiciona Item (DateField) ao Form
fmMain.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 - Exemplo
private Form fmMain; // formulario
Private StringItem siLogin; // o objeto StringItem
...
fmMain = new Form(“Jornada CITI"); // instancia de Form
siLogin = 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 - Exemplo
textBox 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 - Exemplo
Form 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
Download

Métodos principais