Java 2 Micro Edition (J2ME)



Relaterede dokumenter
J2ME portabilitet. Afgangsprojekt på IT-Diplomuddannelsen ved Ingeniørhøjskolen i København

Videregående programmering i Java

MySQL i Java. Tutorial lavet af Jákup W. Hansen TSU semester 05.januar 2007

Videregående programmering i Java

Integrationsmanual. Anvendelse af webservice til kursusoversigt i Campus. Brugervejledning til udviklere

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

Web- og serverprogrammering

JEM1 LAB14. Journal. Jonas Lange, Martin Funding Fisker og Torben Porsgaard 11/4/2009

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Eksempel: Skat i år 2000

J2ME portabilitet. J2ME portabilitet. Afgangsprojekt på IT-Diplomuddannelsen ved Center for Videreuddannelse på Ingeniørhøjskolen i København

Jacob Nordfalk. Ingeniørhøjskolen i København. Nykøbing F itvisioncenter 24. februar 2004

Netværk & elektronik

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Skriftlig eksamen i Datalogi

Webserverprogrammering

Dynamicweb Exchange Opsætning

Installation af Elektronisk APV på flere PC er

Introduktion til ActionScript, fortsat

Outlook 2010 Exchange-opsætning

Installation af Oracle 10g Release 2 HTML DB

med Java og Linux Jacob Nordfalk Linuxforum 2004 Lørdag 6. marts Center for Videreuddannelse Ingeniørhøjskolen i København

Tillykke Med Fødselsdagen

Servlets, Tomcat & BlueJ

Dag 10 Flertrådet programmering

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Opdatering af ISOWARE til version 6.1.0

Databaseadgang fra Java

Brug Photo Story 3 en let introduktion

Outlook 2010 POP3-opsætning

Lærevejledning. - en introduktion til maskinarkitektur. faraz@butt.dk Faraz Butt mads@danquah.dk Mads Danquah doktor@dyregod.dk Ulf Holm Nielsen

ISA Server 2006 Del 5. Jesper Hanno Hansen

QUICKGUIDE TIL XMEDIA

PROGRAM. using System; using System.Collections.Generic; using System.Text; using System.Collections;

Opsætning af forbindelse til Danmarks Statistik

Kursus navn: Indledende programmering Kursus nr

Brug af Archive-funktion i SportIdent (baseret på version 10.3 af SI-programmerne)

Nyhedsmodul brugermanual

02101 Indledende Programmering Introduktion til Eclipse

Velkommen på kursus hos Microworld

Test af It-komponent

Programmering I Java/C#

Delfi Connect. Bruger vejledning 1. TILSLUTNING INSTALLATION MENUSTRUKTUR...4

Løsning af skyline-problemet

Grafisk workflow. Se siden her:

Servere har ikke kun noget at gøre med et lokalnet eller med Internettet. Ethvert program som fungerer som en lytter er en server!

MSI pakke til distribution af AutoPilot komponenter.

Offset til terminalskærm i Java

Analyser uden GPS-positioner

1 Start installation. 2 Vælg Kør. Installation af Næsgaard Mark.NET og konvertering af data

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

Vejledning i opsætning af NemHandelsprogrammet

Opdatering af ISOWARE til version 8.0.0

Programmering i C. Lektion december 2008

Hvordan vælger jeg dokumentprofilen?

Brugervejledning til diverse i OS X

DANMARKS TEKNISKE UNIVERSITET

BRP Kursusintroduktion og Java-oversigt

Umbraco installationsvejledning

Eksempel på en database: studenter, kurser, eksamener

DM34-1. Obligatorisk opgave Dilemma spillet. Jacob Aae Mikkelsen kok04

Dag 10 Flertrådet programmering

Bolig OMK budget Tips og tricks til ny OMK-skabelon

J2ME TEKNOLOGIUNDERSØGELSE. RUC datalogi modul 2 projekt, Af Kasper Klitgaard, Kristian Bjarke Broe, Jonas Rømer.

PHP Quick Teknisk Ordbog

Microsoft Access 2013 ser anderledes ud end tidligere versioner, så vi har oprettet denne vejledning, så du hurtigere kan lære programmet at kende.

FRA KAMERA TIL COMPUTER

HOSTED EXCHANGE MICROSOFT OUTLOOK 2016 TIL WINDOWS

VDI-GUIDE FOR AALESTRUP REALSKOLE

Quick-guide til harddiskoptager

14.1 Internationale programmer

Fjernadgang til BEC s systemer via Portal2

Hjælp under login på Mit DLR Oktober 2015

Forståelse for grafisk workflow

Bruger Manual. Version: Add-On Products Skovgade 2 DK-7100 Vejle Europe Denmark Phone: Fax:

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Indholdsfortegnelse. Indholdsfortegnelse.. side 2. Adgang til webgraf 3. Opslag adresse Styring af layout.. 5. Zoom funktioner..

Vejledning til KLIAKT for institutionsadministratorer

Indhold. Download driver Find version af Windows Hent drivers til Windows Udpak driver... 6

Tech College Aalborg. ASP.NET Hjemmeside. Projekt Smart Zenior Home - Guide til ASP.NET hjemmeside med Visual Studio

Vejledning. Opsætning af Trio Web Vers 2.0 feb. 2010

Fjernadgang til BEC s systemer via Portal2

Beskrivelse af tryghedsalarmen

F-Secure Mobile Security for S60

GSM porttelefon og samtale anlæg. SSI GSM porttelefon system

Installation af ETF s cloudløsning for Privatpraktiserende ergoterapeuter

Manual til Vandværksløsninger

Dansk Ride Forbund Stævnesystem 2 Installationsvejledning

Wipigo Galleri. Brugsforvirring. Venstre side af startbillede efter der er logget ind (Højre side viser det/de gallerier der er oprettet).

[MARKONLINE I CITRIX]

Sektornet VPN. Opsætning af Novell 4.1x server og klient på. Windows 2000/NT/XP

Kursusarbejde 3 Grundlæggende Programmering

Hvordan organiseres et programs grafik-elementer? OOP e uge kursusgang. Advarsel! Component-objekter

Manual til Rsiden.dk for rygestoprådgivere

Opsætning af Outlook til Hosted Exchange 2007

PentaCon C5 External Storage Manager

Brug af Office 365 på din Android-telefon

Vejledning Aarhus Universitets wordskabeloner

Business Call Quick guide SNOM 300 Juli 2012

FairSSL Fair priser fair support

Transkript:

Java 2 Micro Edition (J2ME) Til apparater med begrænset hukommelse. Har en lagdelt struktur: Profil (klasser rettet mod apparatet) Konfiguration (virtuel maskine og basisklasser) Styresystem Kan derfor tilrettes mod en række apparater Mest udbredt er den til mobiltelefoner MIDP (Mobile Information Device Profile) CLDC (Connected Limited Device Configuration) Delmængde af klasser fra java.lang, java.io og java.util Meget kendt fra annoncer om 'fede JAVA-spil' J2ME er platformsuafhængigt (per apparattype)

Midletter mobiltelefon'appletter' Eksempel: En midlet, der viser en (fiktiv) vejrudsigt: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class Vejrmidlet extends MIDlet { // systemet starter midletten public void startapp() { // opret et skærmbillede (en liste) List sb = new List("Vejret", List.IMPLICIT); sb.append("det bliver let skyet og blæsende", null); sb.append("temperatur mellem 17 og 22 grader", null); // vis skærmbilledet Display.getDisplay(this).setCurrent( sb ); // systemet standser midletten public void pauseapp() { // systemet smider midletten væk public void destroyapp(boolean unconditional) { Klassen Display repræsenterer den fysiske skærm. static Display getdisplay(midlet) int numcolors() void setcurrent(displayable skærmb) Displayable getcurrent() boolean vibrate(int varighed) skaffer Display-objektet giver antallet af farver viser et bestemt skærmbillede giver det aktuelle skærmbillede vibrerer med telefonen Midletten kan skifte mellem forskellige skærmbilleder ved at kalde setcurrent(displayable) på Display-objektet.

Brugergrænseflader i midletter Det centrale element: Et skærmbillede Klasse, der arver fra Displayable Kun ét skærmbillede er synligt ad gangen. To måder at programmere på: Med paint()-metode Nedarve fra Canvas MIDP 2.0: GameCanvas Det mest almindelige Kan blive platformsspecifik Med standardkomponenter Form (indtastningsformular) Alert (til 'popop') List (liste evt med valg) TextBox (redigere tekst) Begrænsede muligheder Platformusafhængig

Canvas - direkte grafik og spil import javax.microedition.lcdui.*; public class Canvasgrafik extends Canvas { private int x,y; public Canvasgrafik() { x = getwidth()/2; y = getheight()/2; public void paint(graphics g) { // slet baggrunden g.setcolor( 0x00ffffff ); // hvid g.fillrect(0, 0, getwidth(), getheight()); g.setcolor( 0x00000000 ); // sort g.drawstring("brug piletasterne",0,0, Graphics.TOP Graphics.LEFT); g.fillrect(x,y,3,3); protected void keypressed(int tastkode) { switch (getgameaction(tastkode)) { case UP: y--; break; case DOWN: y++; break; case LEFT: x--; break; case RIGHT:x++; break; repaint(); // bed systemet kalde paint import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class VisCanvasgrafik extends MIDlet { Canvasgrafik grafik = new Canvasgrafik(); public void startapp() { Display.getDisplay(this).setCurrent(grafik); public void pauseapp() { public void destroyapp(boolean unconditional) {

Udviklingsværktøjer J2ME Wireless Toolkit fra Sun (anbefales) Nemt at installere Programmering kan gøres i JBuilder (ved at skifte JDK) Kørsel sker fra Wireless Toolkit JBuilder Mobile Edition (kun til meget interesserede) JBuilder Personal skal afinstalleres Svært at installere GUI-designer

Udvikle med Wireless Toolkit Installér og prøv Wireless Toolkit Hent fra http://java.sun.com/products/j2mewtoolkit MIDP 1.0.4 kører i nuværende telefoner (f.eks. Nokia 3510i) MIDP 2.0 er til de fremtidige telefoner Kør 'ktoolbar' og vælg 'Open Project...' og f.eks. 'games' Vælg 'Run' og f.eks. 'WormGame' Start JBuilder Personal og opret tilsvarende projekt Sørg for at stien til kildetekst (source path) peger på kildeteksten! F.eks. 'apps/games/src' Vælg nyt JDK og vælg sti til roden af Wireless Toolkit Udvid 'example.wormgame' under projektet og åbn WormPit.java Ret i paint(), tilføj f.eks. g.drawstring("hej Jacob",0, 0, g.top g.left) - og gem! Afprøv din ændring Wireless Toolkit Vælg 'Build' og 'Run' Opgave: Kurvetegning på en telefon Eller find selv på en opgave!

Menuer og kommandoer Et Command-objekt for hver mulig handling Kommandoer har: navn (vist på skærmen) længere tekst (valgfri) type prioritet (m.h.p. placering) Tilknyttes skærmbilledet skærmbillede.addcommand( okcommand ); Menu med kommandoer vises i bunden af skærmen Hvordan afhænger af telefonen Lytter (skal implementere CommandListener) skærmbillede.setcommandlistener( lytter ); Lytter bliver kaldt når bruger vælger handlingen public void commandaction(command c, Displayable s) { if (c == afslutcommand) { destroyapp(false);...

Grafiske komponenter i midletter Form er din ven :-) Indeholder 'items' (indgange) To måder at opfange brugerens handlinger på Lytte på formularen og få ændrede indgange at vide Sætte kommandoer på formular/de enkelte indgange Form f = new Form("Gæt tallet jeg tænker på"); StringItem si = new StringItem(null, null); f.append(si); si.settext("tallet er mellem 1 og 100."); TextField tf = new TextField("Skriv dit gæt:", "", 2, TextField.NUMERIC); f.append(tf);

Eksempel - gæt et tal import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class GaetEtTalMidletMIDlet extends MIDlet implements CommandListener { private Display display = Display.getDisplay(this); private Form f = new Form("Gæt tallet jeg tænker på"); private StringItem si = new StringItem(null, null); private TextField tf = new TextField(null, "", 2, TextField.NUMERIC); private Command afslutcommand = new Command("Afslut", Command.SCREEN, 2); private Command okcommand = new Command("OK", Command.SCREEN, 1); private Command nytspilcommand = new Command("Nyt spil", Command.SCREEN, 1); Afsnit 13.4.1 på http://javabog.dk/vp private Random tilf = new Random(); private int tallet; private int forsøg; public GaetEtTalMidletMIDlet() { f.addcommand(afslutcommand); f.addcommand(okcommand); f.setcommandlistener(this); f.append(si); // tilføj strengen til formularen f.append(tf); // tilføj indtastningsfeltet private void nytspil() { tallet = Math.abs(tilf.nextInt()) % 100 + 1; forsøg = 0; si.settext("tallet er mellem 1 og 100."); tf.setlabel("skriv dit gæt:"); public void startapp() { nytspil(); display.setcurrent(f); public void pauseapp() { public void destroyapp(boolean unconditional) { /** * Reagér på kommandoerne ok, afslut og nyt spil. * Metode skal defineres fordi klassen implementerer CommandListener-inter * og den bliver kaldt fordi formularen har fået tilføjet klassen som lytt * Ved afslut ryddes op og midletten giver besked på at den skal smides væ */ public void commandaction(command c, Displayable s) { if (c == afslutcommand) { destroyapp(false); notifydestroyed(); else if (c == okcommand) { int gæt = Integer.parseInt( tf.getstring() ); tf.setstring(""); forsøg++; if (gæt < tallet) si.settext("det er højere end "+gæt+"!"); else if (gæt > tallet) si.settext("det er lavere end "+gæt+"!"); else { si.settext("rigtig på "+forsøg+" forsøg!"); f.delete(1); // Fjern indtastningsfeltet fra formularen f.removecommand(okcommand); f.addcommand(nytspilcommand); else if (c == nytspilcommand) { f.removecommand(nytspilcommand); f.addcommand(okcommand); f.append(tf); // Tilføj indtastningsfeltet til formularen igen nytspil();

Eksempel: Dansk-tysk ordliste public class Ordcanvas extends Canvas implements CommandListener { public Ordcanvas() { setcommandlistener(this); addcommand(komafslut); addcommand(komhjælp); addcommand(komok); info.settimeout(alert.forever); Ordliste ord = new Ordliste(); Alert info = new Alert(""); Command KomHjælp = new Command("Hjælp", Command.HELP, 4); Command KomSlet = new Command("Slet", Command.BACK, 3); Command KomAfslut = new Command("Afslut", Command.ITEM, 2); Command KomOk = new Command("Vis", Command.EXIT, 1); public void commandaction(command command, Displayable displayable) { System.out.println("commandAction("+command); if (command == KomSlet) { sletbogstav(); repaint(); else if (command == KomHjælp) { info.settitle("hjælp"); info.setstring("indtast et søgeord.\n2=abc, 3=DEF, 4=GHI etc.\n"); Display.getDisplay(Ordmidlet.instans).setCurrent(info); else if (command == KomAfslut) { Ordmidlet.instans.afslut(); else if (command == KomOk) { info.settitle(ord.nøgle(indeks)); //infoticker.setstring(ord.liste[indeks][0]); //info.setstring(ord.liste[indeks][1]); info.setstring(ord.værdi(indeks)+"\n(dansk: "+ord.nøgle(indeks)+")"); Display.getDisplay(Ordmidlet.instans).setCurrent(info);

Eksempel: Dansk-tysk ordliste protected void paint(graphics g) { int skærmbredde = getwidth(); int skærmhøjde = getheight(); g.setcolor( 0xffffff ); // hvid g.fillrect(0, 0, skærmbredde, skærmhøjde); g.setcolor( 0x000000 ); // sort Font font = g.getfont(); int skrifthøjde = font.getheight(); int y = 0; int i = indeks; do { String nøgle = ord.nøgle(i); String værdi = ord.værdi(i); if (i==indeks) { int strengbr = font.substringwidth(nøgle, 0, søgetal.length()); g.drawline(0,y+skrifthøjde,strengbr,y+skrifthøjde); g.setcolor(0x000080); // blå else { g.setcolor(0x000000); // sort g.drawstring(nøgle, 0, y, Graphics.TOP Graphics.LEFT); int br0 = font.stringwidth(nøgle)+3; int br1 = font.stringwidth(værdi); // er der plads til at skrive noget af oversættelsen? if (br0 < skærmbredde) { int x1; // er der plads til at skrive hele oversættelsen? if (br0+br1 < skærmbredde) x1 = skærmbredde - br1; // Så højrestil else x1 = br0; // ellers klip sidste del af ordet g.setcolor(0x7f7f7f); // lys grå g.drawstring(værdi, x1, y+1, Graphics.TOP Graphics.LEFT); y += skrifthøjde; i ++; while (y<skærmhøjde && i<ord.maxindeks()); private StringBuffer søgetal = new StringBuffer(10); int indeks = 0; void sletbogstav() { søgetal.delete( søgetal.length()-1, 1000); if (søgetal.length()==0) { removecommand(komslet); addcommand(komafslut); addcommand(komhjælp); fremsøgmuligeord(); protected void keypressed(int tast) { if ('1' <= tast && tast <= '9') { søgetal.append((char) tast); if (søgetal.length()==1) { removecommand(komafslut); removecommand(komhjælp); addcommand(komslet); fremsøgmuligeord(); repaint(); else { int handl = getgameaction(tast); if (søgetal.length()>0) { removecommand(komslet); addcommand(komafslut); addcommand(komhjælp); søgetal.setlength(0); if (handl == UP && indeks > 0) indeks--; if (handl == DOWN && indeks < ord.maxindeks() - 1) indeks++; repaint();

Netværkskommunikation Http(s)Connection - til HTTP-kommunikation f.eks.: Connector.open("http://javabog.dk") SocketConnection - til at åbne en TCP-forbindelse f.eks.: Connector.open("socket://host.com:79") serversocket: Connector.open("socket://:79") SecureConnection - til Secure Socket Layer (SSL) f.eks.: Connector.open("ssl://maskinnavn.dk:79") DatagramConnection klient: Connector.open("datagram://123.456.789.12:1234") server: Connector.open("datagram://:1234") CommConnection - til eventuelle serielle porte f.eks.: Connector.open("comm:1") import java.io.*; import javax.microedition.io.*;... HttpConnection http = (HttpConnection) Connector.open(URL, Connector.READ_WRITE); DataOutputStream out = http.opendataoutputstream(); out.writechars("en tekst");

Gemme data i telefonen Record Management System (RMS) Her er et eksempel på brug: import javax.microedition.rms;... // Åbn en 'fil' i telefonen. Opret den hvis den ikke allerede findes. RecordStore database = RecordStore.openRecordStore("minFil", true); // Skaf data i form af et array af byte String strengderskalgemmes = "Hej Verden"; byte[] data = strengderskalgemmes.getbytes(); // gem data database.addrecord( data, 0, data.length ); // luk 'filen' database.closerecordstore();

Midletter OTA (Over-The-Air) JAR-fil Java ARkiv = zip-fil indeholder klasserne unzip -l da-ty.jar Archive: da-ty.jar Length Date Time Name -------- ---- ---- ---- 222 10-06-03 03:15 META-INF/MANIFEST.MF 1434 10-06-03 03:15 ordliste/ordmidlet.class 5805 10-06-03 03:15 ordliste/ordcanvas.class 3749 10-06-03 03:15 ordliste/ordliste.class JAD-fil Tekslig beskrivelse af midlet Henviser til JAR-filen Skal være korrekt MIDlet-Name: Dansk-tysk ordliste MIDlet-Version: 0.0.6 MIDlet-Vendor: Nordfalken MicroEdition-Profile: MIDP-1.0 MicroEdition-Configuration: CLDC-1.0 MIDlet-Jar-URL: da-ty.jar MIDlet-Jar-Size: 27697 MIDlet-1: Ordmidlet,, ordliste.ordmidlet WML-fil (WAP) HTML-lignende Henviser til JAD-fil <wml> <card id="kort1"> <p> Velkommen!<br /> Hent en <a href="da-ty.jad" title="da-ty"> Dansk-tysk ordliste (JAVA)</a><br/> <br /> </p> </card> <wml> Åbn nu på jeres telefoner: http://javabog.dk/vp/index.wml og hent ordliste-prg på campusnet

Wireless Application Protocol (WAP) Hvordan det virker inde bagved Når en telefon skal hente et dokument via WAP sker der fire ting: 1. Først kontakter telefonen en WAP-gateway og beder den hente dokumentet. Typisk er WAP-gatewayen kodet ind i telefonen af operatøren. 2. Gatewayen kontakter så webstedet, via den almindelige HTTP-protokol. Webstedet giver dokumentet tilbage. Dokumentet er typisk et WML-dokument (Wireless Markup Language - minder om HTML). 3. Dette WML-dokument parses af gatewayen (der derpå henter evt. tilhørende billeder og andet nævnt i WML-dokumentet hos webserveren) 4. WAP-gatewayen sender en komprimeret udgave af WML-dokumentet tilbage til telefonen. Opsætning af webserveren til WML Klares i Apache ved at indsætte følgende MIME-typer i filen httpd.conf: # Til WML-sider, til billeder (i kun i formatet WBMP) og WML-script # # Filendelsen "wml" skal svare til MIME-type "text/vnd.wap.wml". AddType text/vnd.wap.wml wml AddType image/vnd.wap.wbmp wbmp AddType text/vnd.wap.wmlscript wmls # Til oversat WML dette gør en WAP-gateway overflødig AddType application/vnd.wap.wmlc wmlc AddType application/vnd.wap.wmlscriptc wmlsc #Til Midletter: AddType text/vnd.sun.j2me.app-descriptor jad AddType application/java-archive.jar Bruger man Microsoft IIS må man klikke sig igennem og tilføje hver MIME-type manuelt.

WML - Wireless Markup Language Minder om HTML Syntaks mere striks Som i XHTML skal alle koder lukkes igen Starter med <wml> og <card> (i st.f. <html> og <body>) Et WML-dokument kan indeholde flere skærmbilleder Opdelt i 'kort' - som i et spil kort <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//PHONE.COM//DTD WML 1.1//EN" "http://www.phone.com/dtd/wml11.dtd" > <wml> <card id="kort1"> <p> Velkommen!<br /> <a href="da-ty.jad" title="da-ty">dansk-tysk ordliste (JAVA)</a><br/> <br /> Andet:<br /> <a href="http://wap.telia.dk" title="telia">wap Telia</a><br/> <a href="http://wap.krak.dk" >Wap Krak</a><br/> <a href="http://wap.orange.dk" title="her">orange</a><br/> <a href="http://wap.ht.dk" title="bus">ht</a><br/> <a href="#kort2" >Videre...</a> </p> </card> <card id="kort2"> <p>dette er det andet skærmbillede i WML-dokumentet... </p> </card> </wml>