A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Curso básico j2me Bruno Pereira Carlos Santos

Apresentações semelhantes


Apresentação em tema: "Curso básico j2me Bruno Pereira Carlos Santos"— Transcrição da apresentação:

1 Curso básico j2me Bruno Pereira (bpe@cin.ufpe.br) Carlos Santos (cesps@cin.ufpe.br)

2 Ementa Visão geral MIDLet Tratamento de eventos Interface alto nível + Registros Interface baixo nível Boas práticas

3 Metodologia Sobre o curso Slides “on demand” Referência: Core j2me Sobre as aulas Dúvidas... todos nós temos Avaliação (alunos) Projeto Avaliação (instrutores)

4 Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan Tokuda, Mestre Zen

5 Overview Por que J2ME? Mudanças trazidas Dispositivos alvo Restrições { memória, processamento } Mais informações http://java.sun.com/j2me/reference/faqs/i ndex.html

6 Arquitetura

7 Configurações Parte “low level” Define requisitos de hardware Especificação para JVM Geralmente divide os dispositivos segundo memória, poder de processamento, display, conectividade Exemplo: CLDC e CDC

8 Profiles Parte “high level” Extensão da configuração Provê bibliotecas para implementação de aplicações para um dado tipo de dispositivo Exemplo: MIDP

9 Máquina Virtual KVM (Kilo Virtual Machine) Desenvolvida pela Sun MicroSystems CLDC estabelece uma “classe” de dispositivos nos quais uma KVM roda “Existe vida” além da KVM Dados comparativos 40 – 80 Kb (KVM) 20 – 40 Kb (heap) 16 bits a 25 MHz

10 J2ME

11 Enfim... MIDP Mobile Information Device Profile

12 MIDP – Hierarquia de classes

13 Ambiente de desenvolvimento Eclipse IDE v3.0 Sun Wireless Toolkit 2.1 Plugin EclipseME 0.7.5

14 Ambiente de desenvolvimento Configurando o plugin

15 Ambiente de desenvolvimento

16

17 Configurando o Toolkit

18 Ambiente de desenvolvimento

19 Pausa para reflexão

20 O MIDlet Aplicativo Java para MIDP Gerenciador de Aplicativos Software responsável por instalar, remover e executar MIDlets Dependente de dispositivo e implementado pelo fabricante Um ou mais MIDlets podem ser empacotados num JAR

21 O MIDlet JAD (Java Application Descriptor) Arquivo plain/text usado pelo Gerenciador de Aplicativos Fornece informações sobre o arquivo JAR Fornece meios para se passar parâmetros para o MIDlet Campos obrigatórios: MIDlet-Name, MIDlet-Version, MIDlet-Vendor, MIDlet-n, MIDlet-Jar-URL, MIDlet-Jar-Size

22 Ciclo de vida do MIDlet PAUSA Depois da chamada do construtor e antes da inicialização pelo Gerenciador Durante o processo de execução ATIVO MIDlet em execução Durante o processo de execução DESTRUÍDO Desligada pelo Gerenciador Libera todos os recursos alocados

23 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()"); }

24 Ciclo de vida - fluxograma

25 Display Gerenciador de tela que controla o que é mostrado no dispositivo e quando Recupera informações sobre a tela atual (cores suportadas, resolução, etc) Objeto único para cada MIDlet Não é instanciado

26 Usando o Display public class Test_Display extends MIDlet { private Display display; // construtor public Test_Display() { display = Display.getDisplay(this);... }... }

27 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 ()

28 Display – métodos principais int numColors() Retorna o número de cores disponíveis boolean vibrate(int duration) Ordena ou não a vibração do aparelho(midp 2.0) boolean flashBackLight(int duration) Ordena ou não que a luz do aparelho acenda(midp 2.0)

29 Displayable Objeto que pode ser visto num dispositivo Screen Objetos Displayable para Interface alto nível Canvas Objetos Displayable para Interface baixo nível

30 Displayable Screen TextBox List Alert Form (ChoiceGroup, DateField, TextField, Gauge, ImageItem, StringItem) OBS: ticker – variável que pode ter ou não em um Displayable; texto que corre continuamente na tela.

31 Displayable Ver se vai entrar com os Command... metodos...

32 Enfim um Hello World public class tratamentoEventos extends MIDlet{ private Display display; private TextBox tb; // Construtor public tratamentoEventos() { display = Display.getDisplay(this); tb = new TextBox("","Hello World",11,0); } // O inicio da aplicacao protected void startApp() { this.display.setCurrent(tb); }

33 Pausa para reflexão

34 Tratamento de eventos Interface de alto nível

35 Overview Quadro geral Objetos Command Objetos Item Command e CommandListener Item e ItemStateListener

36 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

37 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

38 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

39 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

40 Exemplo (façam rodar =D) 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(); }

41 Exercitando... 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

42 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)

43 ItemStateListener O receptor de eventos relacionados a objetos Item Método a ser sobrescrito void itemStateChanged () Este método é chamado quando o “item” tiver sofrido alteração que gere evento

44 Exemplo // cria o objeto Item df = new DateField("Data :", DateField.DATE); df.setDate(new java.util.Date()); // adiciona o objeto a um displayable formMain.append(df); // seta o receptor formMain.setItemStateListener(this);

45 Exercitando... 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()

46 Pausa para reflexão

47 Interface de alto nível Parte 1

48 Overview Screen Form Item StringItem DateField Gauge TextField Choice e ChoiceGroup Image e ImageItem

49 ((

50 Screen Classe progenitora Descendente direta de Displayable Métodos principais: String getTitle () void setTitle(String title) Ticker getTicker () void setTicker (Ticker t)

51 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 ()

52 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)

53 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

54 Item - Exemplo private Form fmMain; // formulario private DateField dfToday; // o objeto DateField... fmMain = new Form("Core J2ME"); // 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)... }

55 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

56 StringItem - Exemplo private Form fmMain; // formulario Private StringItem siLogin; // o objeto StringItem... fmMain = new Form(“Jornada CITi"); // instancia de Form siLogin = newStringItem(“Login: ", “cesps”); // StringItem... fmMain.append(siLogin); // adiciona Item (StringItem) ao Form...

57 Alternativa ao StringItem... private Form fmMain; int i = fmMain.append(“Login: cesps”);... StringItem tmp = (StringItem) fmMain.get(i);...

58 Exercitando... 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

59 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?

60 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)

61 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

62 DateField

63 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

64 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

65 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()

66 Gauge

67 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

68 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

69 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”); …

70 TextField

71 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

72 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)

73 ChoiceGroup

74 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

75 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) void setImage(Image img) void setLayout(int layout)

76 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);

77 Interface de alto nível Parte 2

78 Overview Quadro Geral List TextBox Alert e AlertType Ticker

79 Quadro Geral

80 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

81 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()

82 List - Exemplo www/~cesps/ListDemo.java

83 List

84 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

85 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()

86 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);

87 TextBox

88 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

89 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

90 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)

91 Alert

92 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

93 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

94 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);

95 Exercitando... 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.

96 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)

97 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); …

98 Pausa para reflexão

99 Record Management System Gereciamento de registros persistentes Registro Identificador ligado a um array de bytes Equivalente a armazenamento em arquivo de J2SE Classes para armazenar, recuperar, enumerar, comparar e filtrar dados não- voláteis

100 RMS Armazém de registros (RecordStore) Nomenclatura Até 32 caracteres UNICODE (16 bits) ID de registroDado 1Array de bytes 2.....

101 RMS Compartilhamento de Registros CONJUNTO 1 CONJUNTO 2

102 RMS Informações adicionais Número da versão: um valor inteiro que é incrementado a cada modificação do conteúdo do armazém Indicação de data/hora: última modificação do armazém A existência dos registros está limitada à do MIDlet que os criou

103 RMS - Métodos static RecordStore openRecordStore(String nome, boolean criarSeNecessario); void closeRecordStore(); void delete recordStore(String nome); int addRecord(byte[] dados, int offset, int numBytes); void setRecord(int recordId, byte[] novosDados, int offset, int numBytes); byte[] getRecord(int recordId); int getRecord(int recordId, byte[] buffer, int offset);

104 RMS – Métodos (Cont.) Int getNumRecords(); Long getLastModified(); String getName(); addRecordListener(RecordListener listener); removeRecordListener(RecordListener listener);

105 RMS - Exemplo... RecordStore rs = null; String nome = “Carlos”;... try { rs = RecordStore.openRecordStore( “meusdados", true ); byte[] recData = nome.getBytes(); rs.addRecord(recData, 0, rec.length); //Grava dados... //Recupera dados String retorno = new String( rs.getRecord(1) ); } catch( Exception e ) { // tratamento de excessão }

106 RecordEnumeration Interface que fornece métodos de movimentação para frente e para trás em registros Semelhante ao Iterator em J2SE Pode levar em conta filtros (para pesquisa) e/ou comparadores (para ordenação) Ex: classificar registros em ordem alfabética

107 RecordEnumeration Métodos Principais RecordEnumerator enumerateRecords(RecordFilter filter, RecordComparator comparator, boolean keepUpdated); * byte nextRecord(); byte previousRecord(); Boolean hasNextElement(); Boolean hasPreviousElement(); Void keepUpdated(boolean keep); * Método da classe RecordStore

108 Exemplo..... RecordEnumeration enum = re.enumerateRecords(null, null, false); while ( re.hasNextElement() ) { //armazena o próximo registro em um String String str = new String(re.nextRecord()); … processa algo… } …

109 RecordComparator Interface para comparação entre registros Método a ser implementado Int compare(byte[] rec1, byte[] rec2); Tipos de RecordComparator EQUIVALENT – rec1 é equivalente a rec2 FOLLOWS – rec1 vem depois de rec2 PRECEDES – rec1 vem antes de rec2

110 Exemplo... public class Comparador implements RecordComparator { public int compare(byte rec1, byte rec2) { String str1 = new String(rec1); String str2 = new String(rec2); int resultado = str1.compareTo(str2); if (resultado == 0) return RecordComparator.EQUIVALENT; else if (result < 0) return RecordComparator.PRECEDES; else return RecordComparator.FOLLOWS; }

111 Exemplo (Cont.)... //Cria um novo comparador para ordenar Comparador comp = new Comparador(); //Referencia o comparador ao criar a enumeração RecordEnumeration re = rs.enumerateRecords(null, comp, false); //Faz a iteração nos registros, que já estarão ordenados While ( re.hasPreviousElement ) {... String s = new String(re.previousRecord());... } …

112 RecordFilter Interface para filtro de registros Apenas os resultados que correspondem ao critério do filtro, farão parte do conjunto enumerador Método a ser implementado Boolean matches(byte[] candidate)

113 Exemplo... class Filtro implements RecordFilter { private String textoBuscado = null; public Filtro(String textoBuscado) { //este é o texto a ser pesquisado this.textoBuscado = textoBuscado.toLowerCase(); } public boolean matches(byte[] candidato) { String str = new String(candidato).toLowerCase(); //procura uma correspondência if ( textoBuscado != null && str.indexOf(textoBuscado) != -1 ) { return true; } else { return false; }

114 Exemplo (Cont.)... //Cria um novo filtro de busca Filtro busca = new Filtro(“Texto a ser buscado”); //Referencia o filtro ao criar o enumerador RecordEnumeration re = rs.enumerateRecords(busca, null, false); /*Se houver pelo menos um registro no conjunto de resultados, uma correspondência foi encontrada*/ if (re.getNumRecords() > 0) { //Manipula os resultados } …

115 RecordListener Notificação de que um registro foi adicionado, removido ou atualizado Ex: Salvar preferências de um usuário Opera como os outros Receptores de eventos já vistos em aula Métodos a serem implementados void recordAdded(RecordStore rs, int recordId); void recordChanged(RecordStore rs, int recordId); void recordDeleted(RecordStore rs, int recordId);

116 RecordListener - Exemplo

117 Interface de baixo nível “a ignorância é uma bênção”

118 Overview Graphics Canvas Tratamento de eventos Boas práticas

119 Quadro Geral

120 Graphics Classe que provê métodos simples de renderização 2D em Canvas Arcos, imagens, linhas, retângulos e texto podem ser desenhados Não é instanciada diretamente

121 Graphics Métodos principais drawArc (int x, int y, int width, int height, int startAngle, int arcAngle) drawImage(Image img, int x, int y, int anchor) drawLine(int x1, int y1, int x2, int y2) drawString(String str, int x, int y, int anchor) fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) fillRect(int x, int y, int width, int height)

122 Graphics Métodos principais - continuação setClip(int x, int y, int width, int height) setColor(int red, int green, int blue setFont(Font font) translate(int x, int y)

123 Canvas Classe que herda de Displayable Representa uma Área na tela que pode ser livremente desenhada e apagada Fornece métodos para tratamento de eventos de teclas, “game actions” e “pointer actions” Usa Graphics para desenho no Canvas O programador cria uma subclasse de Canvas

124 Canvas – Sistema de Coordenadas

125 Canvas Métodos principais int getGameAction (int keyCode) int getKeyCode(int gameAction) String getKeyName(int keyCode) keyPressed(int keyCode) keyReleased(int keyCode) keyRepeated(int keyCode) paint(Graphics g) repaint()

126 Canvas - Exemplo import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class MyCanvas extends Canvas { private MIDlet midlet; public MyCanvas( MIDlet midlet ){ this.midlet = midlet; } protected void paint( Graphics g ){ g.setColor( 255, 255, 255 ); g.fillRect( 0, 0, getWidth(), getHeight() ); g.setColor( 0, 0, 0 ); g.drawString( "Hello there!", getWidth()/2, 0, g.TOP | g.HCENTER ); }

127 Canvas – Exemplo (Cont.) public class MyMIDlet extends MIDlet { private Display display; private MyCanvas canvas; public MyMIDlet(){ display = Display.getDisplay( this ); canvas = new MyCanvas( this ); }... protected void startApp(){ display.setCurrent( canvas ); }... public void exit(){ destroyApp( true ); notifyDestroyed(); }

128 Tratamento de eventos Key Codes

129 Exercitando... Escreva uma aplicação que dado um evento de pressionamento de uma tecla imprime na tela o nome da tecla pressionada Lembrando que eventos de tecla pressionada são tratados pelo método keyPressed() de Canvas

130 Tratamento de Eventos Game Actions

131 Exercitando... Escreva um MIDlet que reconhe Game Actions e desenha uma Imagem indicando qual tecla foi pressionada Lembrando que as imagens devem ser preferencialmente em formato PNG As teclas a serem reconhecidas são UP, DOWN, LEFT, RIGHT e FIRE (5)

132 Manipulando imagens Imagens Estáticas 1. Aloque a imagem Image im = Image.createImage(“/imageTest.png”); 2. Mostre a imagem protected void paint(Graphics g) {... g.drawImage(im, 10, 10, Graphics.LEFT | Graphics.TOP);... Imagens Dinâmicas 1. Aloque a imagem Image im = Image.createImage(80, 20); 2. Crie o conteúdo da imagem (usando arcs, rectangles, lines e text) // pegue o Graphics do objeto Graphics graphics = im.getGraphics(); // desenhe um retangulo preenchido graphics.fillRoundRect(0, 0, 50, 50, 20, 20);... 3. Mostre a imagem protected void paint(Graphics g) {... g.drawImage(im, 10, 10, Graphics.LEFT | Graphics.TOP);... }

133 Pausa para reflexão

134 Boas práticas Representam práticas que previnem contra uma série de erros básicos que podem ocorrer, além de evitar outros inconvenientes Recomendadas, principalmente em se tratando de dispositivos limitados em termos de memória e processamento “Nenhum homem é uma ilha”

135 Boas práticas para o projeto Legibilidade de código Manter padrão de tabulação Comentários de classe, de métodos e quando preciso de blocos de código Nomes de variáveis intuitivos Métodos semelhantes agrupados

136 Boas práticas para o projeto Plataforma (Nokia S40) Display: 4096 cores, 128 x 128 pixels Tamanho Max. Jar: 64 KB Exato! Incluindo código e imagens Limitações de som (não toca MIDI ou MP3) Problemas com alocação de memória

137 Boas práticas para o projeto Desenvolvimento Usar Simulador proprietário disponível em http://www.forum.nokia.com (Nokia 3300) http://www.forum.nokia.com Criação de objetos somente se for necessário (sob demanda) Evitar sobrecarregar a aplicação com muitos Threads e TimerTasks Observar bem os métodos startApp() e paint(), geralmente são gargalos

138 Boas práticas para o projeto Desenvolvimento – continuação Marcar referências certamente não mais utilizadas para NULL Otimizar imagens, usando o formato PNG Separar ao máximo a lógica da aplicação da parte que representa a GUI Evitar uso de Vectors e outras estruturas dinâmicas, quando possível

139 Boas práticas para o projeto Gerais Anote erros conhecidos Consulte sempre a API Não tente reinventar a roda Adquira um pé de coelho, você vai precisar de um...

140 Lembrem-se... "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan Tokuda, Mestre Zen Alguém enfim descobriu o que isto quer dizer ???


Carregar ppt "Curso básico j2me Bruno Pereira Carlos Santos"

Apresentações semelhantes


Anúncios Google