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