Micro Edition Marco Antonio – Julho/2009. CLDC Connected Limited Device Configuration Parte fundamental da arquitetura J2ME Requisitos: –Pode ser utilizada.

Slides:



Advertisements
Apresentações semelhantes
Shop Notas de implementação [Exercício da Disciplina de ADAV]
Advertisements

Projeto Maven AcademicNet Grupo DGMR Daniel Isidoro Born Guilherme Amaral Márcio Percilio Roberto Rutz.
ADT – Arvore Binária de Pesquisa
Projeto de Sistemas de Software Luana Lachtermacher
Java RMI Alcides Calsavara. Objetivos Permitir que um método de uma classe Java em execução em uma máquina virtual JVM chame um método de um objeto (instância.
Java: Comandos Básicos
1 Java: Tratamento de Exceções Alcides Calsavara.
Pilhas e Filas.
Estruturas Fundamentais
Listas Encadeadas Circulares Listas Duplamente Encadeadas
Listas Encadeadas Circulares Listas Duplamente Encadeadas
Prof. José Fernando Rodrigues Júnior Pacotes Material original: Profa. Elaine Parros Machado de Sousa SCC Bancos de Dados e Suas Aplicações.
Ronaldo Celso Messias Correia
INTRODUÇÃO À COMPUTAÇÃO PARALELA
SQL Procedural Junho/2006.
SQL procedural – parte 2.
Subconsultas em SQL. Subconsulta Estrutura geral SELECT.... FROM.... WHERE [at] OPERADOR ( SELECT... FROM... [WHERE... ]) Declaração SELECT localizada.
SQL-3. Novo contexto e necessidade de : Manipular imagens Outros tipos de dados além de texto e números Recuperação de dados mais complexos Níveis distintos.
Teste Estrutural de Software
Teste Funcional de Software
Slide 1 Rede Nacional de Ensino e Pesquisa Treinamento em Gradep - junho 2005 Serviço ContextManager Treinamento no GRADEp Framework Master-Worker.
Slide 1 Rede Nacional de Ensino e Pesquisa Treinamento em Gradep - junho 2005 Serviço Collector Treinamento no GRADEp Serviço Collector CollectorDemo e.
Classes Internas e Anônimas
Servidores e Programação Web Redes de Computadores.
1 Oi BlackBerry. 2 Índice 1Configurando o seu aparelho BlackBerry 2Formatando o seu aparelho BlackBerry 3Solicitando senha de ativação empresarial 4Indicador.
O Fluxo de Testes © Alexandre Vasconcelos
Disciplina: Paradigmas e Ferramentas de Desenvolvimento de Software
CT-300 – Seminário de Tese 1/25 Um Framework Padrão para Simulação de Modelos de Robôs Móveis de Robôs Móveis Juliano A. Pereira Prof. Carlos H. C. Ribeiro.
Técnicas de Diagnóstico. Objetivo Caracterizar técnicas de diagnóstico para o modelo do estudante Caracterizar técnicas de diagnóstico para o modelo do.
FUNDAÇÃO CARLOS CHAGAS
Laboratório de Programação Prof. Oscar Luiz Monteiro de Farias
Tecnologia para Web JavaScript Enrique Pimentel Leite de Oliveira
Recursividade Estrutura de Dados.
Marco Antonio Montebello Júnior
Entendendo as definições de classe
Comportamento mais sofisticado
LINGUAGENS DE PROGRAMAÇÃO
04:27 Introdução Tipos de Fluxo de Dados e de Arquivos Manipulação de Arquivos em Java Classes FileReader e FileWriter Classes FileInputStream e FileOutputStream.
Programação Concorrente com Thread Java
Introdução Ciência da Computação estudo de algoritmos –ÊNFASE ao estudo de DADOS armazenamento manipulação refinamento (a partir de dados cru) estrutura.
Classes e objetos Arrays e Sobrecarga
Prof. Afonso Ferreira Miguel, MSc
Professor: Hyggo Almeida
Threads, Gerenciamento de Threads Pool de Threads, Grupo de Threads Variáveis Locais à Threads.
Sincronização com Locks. Locks É um mecanismo de sincronização de processos/threads em que estas devem ser programadas de modo que seus efeitos sobre.
JAVA MULTITHREADING TECHNIQUES
Anália Lima (alc5) Bruno Gentilini (bgda) Eduardo Souza (efs) Ivan França (ilfn) Infra-Estrutura de comunicação Aula Prática Programação de Sockets TCP.
Melhorias e Mensagens Amigáveis ao Usuário Centro de Informática Universidade Federal de Pernambuco Bruno Felipe Marco André Paulo Fernando Rodolfo Santos.
Infra-Estrutura de Comunicação (IF678) Aula Prática 02 – CIn/UFPE Davi Duarte Cynthia Raphaella Ivan França Jéssica Barbalho Larissa Paz Paulo Fernando.
INPE / CAP-315 Airam J. Preto, Celso L. Mendes Aula 30 (1) Empacotamento de Dados em MPI Tópicos: Buffer de Mensagem Empacotamento/Desempacotamento.
Java em Redes de Computadores
Programa Expresso de Capacitação Módulo J2ME Aula 5 – Record Management System.
Análise Sintática – Parte 1
Scala Bruno Barros e Rebeka Gomes
Programa Expresso de Capacitação Módulo J2ME
Java 2D Marco Antonio. Java2D Conjunto de classes para trabalhar com gráficos e imagens. A principal classe desta API é JComponent. Com esta classe é.
Enviando dados com interface Classe Form – é um repositório de controles, sendo que apenas um Form pode ser visto de cada vez. Cada objeto da classe Form.
Java Generics Adeline de Sousa Silva.
ArrayList e Genéricos Profs. PROG2 - UNISINOS.
Tipos Especiais de Listas
Alisson Rafael Appio SOP aplicado em um jogo tipo de corrida usando a arquitetura cliente e servidor Alisson Rafael Appio
Marlon Novas ferramentas da Nokia para a plataforma S40 1.
Curso básico j2me Bruno Pereira Carlos Santos
Estrutura de Controle em JAVA
Programação para Dispositivos Móveis Prof. Wallace Borges Cristo.
Faculdade Pitágoras – Campus Fadom.  Display  Cada MIDlet tem UMA referência para um objeto Display  Esse objeto pode recuperar informações sobre.
GOTO. Project treinamento expresso j2me Luiz Carlos d´Oleron lcadb at cin.ufpe.br.
Seminários.reply Introdução a JavaME Guilherme Carvalho.
Java: Interfaces Alcides Calsavara.
Elaborando as Interfaces Aulas 37, 38 e 39.
Transcrição da apresentação:

Micro Edition Marco Antonio – Julho/2009

CLDC Connected Limited Device Configuration Parte fundamental da arquitetura J2ME Requisitos: –Pode ser utilizada em dispositivos de 16 e 32 bits com clock mínimo de 16MHz –160 KB de memória não volátil para as bibliotecas CLDC e máquina virtual –192 KB de memória total para a instalação do Java Conectividade com alguns tipos de rede, geralmente wireless, mesmo intermitente e com limitação de banda.

MIDP Mobile Information Device Profile Perfil padrão para dispositivos móveis de processamento limitado. Trabalha em conjunto com a CLDC.

Estrutura JME A mobile edition é uma versão simplificada da JVM. Tem a maioria das classes, praticamente a mesma funcionalidade. Existem bibliotecas de terceiros específicas (ex. OpenGL ES, M3G, Midia, etc).

Plataforma Java

Instalação WTK – Wireless Toolkit, atualmente na versão 3.0 – Eclipse – Versão atual: Galileo – EclipseME – Versão atual: –

Install EclipseME Help Install New Software.

Adicione o link Esta é a maneira de instalar plugins no novo Eclipse.

Plugin do EclipseME Dados do plugin.

EclipseME Configuration Informe o diretório raíz do wtk. No windows é WTK2.5.2_01.

Device Configuration Clique no botão Import.

Devices Indique o diretório raíz do wtk e depois Refresh.

Projeto de Exemplo Selecione o tipo de projeto correspondente.

DiagnosticoMedicoME Informe o nome do projeto.

Dispositivos Suportados Utilize o perfil mais genérico possível para ampliar o número de aparelhos suportados pela aplicação, a menos, claro, que esteja desenvolvendo para um modelo específico.

Diretórios Os diretórios src (fontes) e res (recursos) serão criados.

Formulário As classes de apresentação devem ser Midlets.

FormularioCadastroDePaciente package com.diagnostico.apresentacao; import java.io.*; import java.util.*; import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class FormularioCadastroDePaciente extends MIDlet { //Componentes Gauge gauge; Spacer espacador; ImageItem foto; TextField txtNome; DateField txtDataDeNascimento; StringItem lblIdentificador; ChoiceGroup chcAgrupador; //Tela Display display;

FormularioCadastroDePaciente protected void destroyApp(boolean flag) { notifyDestroyed(); } protected void pauseApp() { } protected void startApp() throws MIDletStateChangeException { display = Display.getDisplay(this); display.setCurrent(getFormCadastro()); }

FormularioCadastroDePaciente private Form getFormCadastro() { //Formulario Form formCadastro = new Form("Dados do Paciente"); lblIdentificador = new StringItem("Identificador:", "00001"); formCadastro.append(lblIdentificador); // txtNome = new TextField("Nome:", null, 25, TextField.ANY); formCadastro.append(txtNome); // txtDataDeNascimento = new DateField("Nascimento:", DateField.DATE); formCadastro.append(txtDataDeNascimento); // gauge = new Gauge("Passo 1", true, 4, 1); formCadastro.append(gauge); // espacador = new Spacer(30, 10); formCadastro.append(espacador); // String[] valores = {"Diego", "Mariana"}; chcAgrupador = new ChoiceGroup("Filhos", Choice.MULTIPLE, valores, null); formCadastro.append(chcAgrupador); //Imagem try { Image imagem = Image.createImage("/Diego.jpg"); foto = new ImageItem("Foto:", imagem, ImageItem.LAYOUT_CENTER, "foto"); formCadastro.append(foto); } catch (IOException e) { e.printStackTrace(); } //Comandos Command menuSalvar = new Command("Salvar", Command.OK, 1); Command menuFechar = new Command("Sair", Command.EXIT, 1); // formCadastro.addCommand(menuSalvar); formCadastro.addCommand(menuFechar); formCadastro.setCommandListener(this); return formCadastro; }

Listener Faça o midlet implementar CommandListener. {...} public class FormularioCadastroDePaciente extends MIDlet implements CommandListener { {…} Em seguida será necessário implementar o seguinte método: public void commandAction(Command comando, Displayable tela) {} Por fim, adicione o próximo formulário.

FormSucesso private Form getFormSucesso() { //Calendario Calendar calendario = Calendar.getInstance(); calendario.setTime(txtDataDeNascimento.getDate()); int dia = calendario.get(Calendar.DAY_OF_MONTH); int mes = calendario.get(Calendar.MONTH); int ano = calendario.get(Calendar.YEAR); //Formulario Form formSucesso = new Form("Informação"); formSucesso.append("Dados Gravados com Sucesso."); StringItem nome = new StringItem("Nome:", txtNome.getString()); StringItem data = new StringItem("Nascimento:", dia + "/" + mes + "/" + ano); formSucesso.append(nome); formSucesso.append(data); //Comandos formSucesso.addCommand(new Command("Voltar", Command.BACK, 0)); formSucesso.setCommandListener(this); // return formSucesso; }

commandAction Atualize o método de comando. public void commandAction(Command comando, Displayable tela) { if (comando.getLabel().equals("Salvar")) { display.setCurrent(getFormSucesso()); } else if (comando.getLabel().equals("Sair")) { destroyApp(true); } else if (comando.getLabel().equals("Voltar")) { display.setCurrent(getFormCadastro()); }

Menu Principal A seguir uma possível solução para o menu principal da aplicação.

DiagosticoMedico package com.diagnostico.apresentacao; import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class DiagnosticoMedico extends MIDlet implements CommandListener { private Display display; protected void destroyApp(boolean flag) throws MIDletStateChangeException { notifyDestroyed(); } protected void pauseApp() { } protected void startApp() throws MIDletStateChangeException { display = Display.getDisplay(this); display.setCurrent(getMenu()); }

DiagosticoMedico private List getMenu() { List menu = new List("Diagnóstico Médico", List.IMPLICIT); menu.append("Paciente", null); menu.append("Consulta", null); menu.append("Exame", null); menu.append("Histórico", null); menu.addCommand(new Command("Selecionar", Command.ITEM, 0)); menu.setCommandListener(this); return menu; }

DiagosticoMedico public void commandAction(Command comando, Displayable conteudo) { List menu = (List) conteudo; String opcao = menu.getString(menu.getSelectedIndex()); String mensagem = ""; if (opcao.equals("Paciente")) { mensagem = "Voce selecionou 'Paciente'"; } else if (opcao.equals("Consulta")) { } Alert alerta = new Alert(mensagem); alerta.setTimeout(5000); display.setCurrent(alerta); }

Otimização do Código Separe os formulários para uma melhor manutenção. Assim, teremos melhor controle sobre a evolução da aplicação.

FormPaciente package com.diagnostico.apresentacao; import javax.microedition.lcdui.*; public class FormPaciente extends Form { public TextField txtNome = new TextField("Nome:", "", 30, TextField.ANY); public DateField txtNascimento = new DateField("Nascimento:", DateField.DATE); public FormPaciente(CommandListener listener) { super("Paciente"); append(txtNome); append(txtNascimento); append(new Spacer(30, 30)); addCommand(new Command("Gravar", Command.OK, 0)); addCommand(new Command("Cancelar", Command.CANCEL, 1)); setCommandListener(listener); }

RMS A solução fornecido pelo JME para persistência é o Record Management System. Trabalha com arrays de bytes, exigindo conversões para recuperar as informações.

CalendarioUtil package com.diagnostico.util; import java.util.*; public class CalendarioUtil { public static String getDataInvertida(Date data) { Calendar calendario = Calendar.getInstance(); calendario.setTime(data); int dia = calendario.get(Calendar.DAY_OF_MONTH); int mes = calendario.get(Calendar.MONTH); int ano = calendario.get(Calendar.YEAR); return ano + "-" + mes + "-" + dia; } public static Date getData(String nascimento) { //TODO Terminar Calendar calendario = Calendar.getInstance(); calendario.set(Calendar.DAY_OF_MONTH, 1); calendario.set(Calendar.MONTH, 1); calendario.set(Calendar.YEAR, 2001); return calendario.getTime(); }

DAOPaciente package com.diagnostico.persistencia; import java.io.*; import java.util.*; import javax.microedition.rms.*; import com.diagnostico.apresentacao.*; import com.diagnostico.util.*; public class DAOPaciente { public static String NOME_DA_RECORDSTORE = "RSPaciente"; public int inserir(FormPaciente form) { try { // ByteArrayOutputStream out = new ByteArrayOutputStream(); DataOutputStream dados = new DataOutputStream(out); // String nome = form.txtNome.getString(); Date nascimento = form.txtNascimento.getDate(); dados.writeUTF(nome); dados.writeUTF(CalendarioUtil.g etDataInvertida(nascimento)); // RecordStore rs = RecordStore.openRecordStore(NOM E_DA_RECORDSTORE, true); byte[] bytes = out.toByteArray(); int id = rs.addRecord(bytes, 0, bytes.length); // out.close(); dados.close(); rs.closeRecordStore(); return id; } catch (Exception e) { e.printStackTrace(); } return 0; }

commandAction public void commandAction(Command comando, Displayable conteudo) { if (conteudo instanceof List) { //Menu Principal List menu = (List) conteudo; String opcao = menu.getString(menu.getSelectedIndex()); //Opcoes do menu if (opcao.equals("Paciente")) { display.setCurrent(new FormPaciente(this)); } else if (opcao.equals("Consulta")) { // } else if (opcao.equals("ListarPacientes")) { // FormListarPacientes form = new FormListarPacientes(this); display.setCurrent(form); } } else if (conteudo instanceof FormPaciente) { //FormPaciente if (comando.getLabel().equals("Gravar")) { FormPaciente form = (FormPaciente) conteudo; DAOPaciente dao = new DAOPaciente(); int id = dao.inserir(form); System.out.println("Id Gravado:" + id); } else if (comando.getLabel().equals("Cancelar")) { display.setCurrent(getMenu()); }

Dica Separar os comandos em classes específicas para facilitar a leitura e manutenção do código.

Dica Criar VO's e utilizá-los como parâmetro, ao invés de acessar os componentes diretamente.

Consulta Atenção especial para as conversões de dados. Tudo deve ser tratado como byte[], para isso temos as classes específicas.

DAOPaciente public Vector consultaRegistros() { try { RecordStore rs = RecordStore.openRecordStore(DAOPaciente.NOME_DA_RECORDSTORE, false); RecordEnumeration registros = rs.enumerateRecords(null, null, false); Vector objetos = new Vector(); while (registros.hasNextElement()) { int id = registros.nextRecordId(); byte[] dados = rs.getRecord(id); ByteArrayInputStream input = new ByteArrayInputStream(dados); DataInputStream dataInput = new DataInputStream(input); StringBuffer s = new StringBuffer(); s.append(id + "-"); s.append(dataInput.readUTF() + "-"); s.append(dataInput.readUTF()); objetos.addElement(s.toString()); } return objetos; } catch (Exception e) { e.printStackTrace(); return null; }

FormListarPacientes package com.diagnostico.apresentacao; import java.util.*; import javax.microedition.lcdui.*; import com.diagnostico.persistencia.*; public class FormListarPacientes extends Form { // public FormListarPacientes(CommandList ener listener) { super("Listar Pacientes"); carregaListaDePacientes(); setCommandListener(listener); addCommand(new Command("Editar", Command.OK, 1)); addCommand(new Command("Voltar", Command.CANCEL, 1)); } private void carregaListaDePacientes() { try { DAOPaciente dao = new DAOPaciente(); Vector v = dao.consultaRegistros(); String[] valores = new String[v.size()]; v.copyInto(valores); ChoiceGroup pacientes = new ChoiceGroup("Pacientes", Choice.EXCLUSIVE, valores, null); append(pacientes); } catch (Exception e) { e.printStackTrace(); append(new StringItem("Erro:", "Listar Pacientes")); }

Atividade Criar os métodos atualizar e consultarPeloId. Dica: pesquise por RecordStore.setRecord e RecordStore.getRecord. Em seguida temos uma possível solução.

DAOPaciente public DataInputStream consultaPeloId(int id) { try { RecordStore rs = RecordStore.openRecordStore(NOME_DA_RECORDSTORE, true); byte[] bytes = rs.getRecord(id); ByteArrayInputStream in = new ByteArrayInputStream(bytes); DataInputStream dados = new DataInputStream(in); return dados; } catch (Exception e) { e.printStackTrace(); } return null; }

DiagnosticoMedico } else if (conteudo instanceof FormListarPacientes) { //FormListarPacientes if (comando.getLabel().equals("Voltar")) { display.setCurrent(getMenu()); } else if (comando.getLabel().equals("Editar")) { // FormListarPacientes origem = (FormListarPacientes) conteudo; int indice = origem.pacientes.getSelectedIndex(); String valor = origem.pacientes.getString(indice); StringTokenizer token = new StringTokenizer(valor, "-"); int id = Integer.parseInt(token.nextToken()); // FormPaciente destino = new FormPaciente(this); destino.setId(id); destino.carregarDados(); // display.setCurrent(destino); }

FormPaciente public void carregarDados() { try { DAOPaciente dao = new DAOPaciente(); DataInputStream dados = dao.consultaPeloId(getId()); txtNome.setString(dados.readUTF()); Date data = CalendarioUtil.getData(dados.readUTF()); txtNascimento.setDate(data); } catch (IOException e) { e.printStackTrace(); }

RecordComparator Interface usada para comparar dois registros. Os possíveis resultados são: – EQUIVALENT – FOLLOWS – PRECEDES

RecordComparator package com.diagnostico.persistencia; import java.io.*; import javax.microedition.rms.*; public class PacienteComparator implements RecordComparator { public int compare(byte[] registroAnterior, byte[] proximoRegistro) { try { ByteArrayInputStream inputAnterior = new ByteArrayInputStream(registroAn terior); DataInputStream dataInputAnterior = new DataInputStream(inputAnterior); String anterior = dataInputAnterior.readUTF().toL owerCase(); // ByteArrayInputStream proximoInput = new ByteArrayInputStream(proximoReg istro); DataInputStream proximoDataInput = new DataInputStream(proximoInput); String proximo = proximoDataInput.readUTF().toLo werCase(); // int resultado = anterior.compareTo(proximo); if (resultado < 0) { return PRECEDES; } else if (resultado > 0) { return FOLLOWS; } } catch (IOException e) { e.printStackTrace(); } return EQUIVALENT; }

RecordFilter Interface utilizada para filtrar o resultado de uma consulta. Retorna somente os registros que aceitem a condição do método matches().

PacienteFiltro package com.diagnostico.persistencia; import java.io.*; import javax.microedition.rms.*; public class PacienteFiltro implements RecordFilter { private String nomeFiltrado; public PacienteFiltro(String nomeFiltrado) { this.nomeFiltrado = nomeFiltrado; } public boolean matches(byte[] candidato) { try { // ByteArrayInputStream input = new ByteArrayInputStream(candidato) ; DataInputStream dataInput = new DataInputStream(input); String nomeLido = dataInput.readUTF(); // int resultado = nomeLido.indexOf(nomeFiltrado); if (resultado >= 0) { return true; } } catch (IOException e) { e.printStackTrace(); } return false; }

Juntando tudo... Utilizando todos os recursos no DAOPaciente temos um módulo completo para consulta. Dica: vários blocos de código estão repetidos. É um bom momento de criar classes utilitárias para evitar esse problema.

DAOPaciente Atualize o código da consulta conforme o exemplo. public Vector consultaRegistros() { try { // RecordStore rs = RecordStore.openRecordStore(DAOPaciente.NOME_DA_RECORDSTORE, false); // PacienteComparator comparador = new PacienteComparator(); RecordEnumeration registros = rs.enumerateRecords(null, comparador, false); Vector objetos = new Vector(); while (registros.hasNextElement()) { {…}

DAOPaciente public Vector consultaPeloNome(String nomeFiltrado) { try { // RecordStore rs = RecordStore.openRecordStore(DAOPaciente.NOME_DA_RECORDSTORE, false); // PacienteComparator comparador = new PacienteComparator(); // PacienteFiltro filtro = new PacienteFiltro(nomeFiltrado); RecordEnumeration registros = rs.enumerateRecords(filtro, comparador, false); // Vector objetos = new Vector(); while (registros.hasNextElement()) { int id = registros.nextRecordId(); byte[] dados = rs.getRecord(id); ByteArrayInputStream input = new ByteArrayInputStream(dados); DataInputStream dataInput = new DataInputStream(input); StringBuffer s = new StringBuffer(); s.append(id + "-"); s.append(dataInput.readUTF() + "-"); s.append(dataInput.readUTF()); objetos.addElement(s.toString()); } return objetos; } catch (Exception e) { e.printStackTrace(); return null; }

Atividade Pesquisar e implementar uma classe que faça monitoração (RecordListener) do DAOPaciente. Imprima os dados de cada operação.