J2ME > Eclipse (20090920) > Hello world

A Samsung mobilomra szerettem volna írni egy kisalkalmazást, de első lépésként természetesen a helló világgal kezdtem. Megpróbálom leírni, hogy hogyan.

A Samsung SDK-t le kell tölteni és ehhez sajnos regisztrálni kell, így élő linkkel nem tudok szolgálni. Emellett még előtte a QuickTime-ot is fel kell rakni, mert a videótartalmak csak így tudnak megjelenni az emulátoron.

Java2ME plugin telepítése

Ezután az Eclipse-t kell bővíteni, hogy tudja segíteni a J2ME alkalmazások írását. Ehhez a Help > Install New Software menüpontban, a megjelenő Install ablakban az Add gomb lenyomásával hozzá kell adni az http://eclipseme.org/updates helyet. Ezután az alatta megjelenő fanézetben be kell jelölni az EclipseME-t (v1.7.9). Next, next, next majd meg is volnánk.

Integráció az SDK-val

A Windows > Preferences menüpontban a beállításokhoz jutunk. Itt válasszuk ki a J2ME > Device Management listaelemet. Itt az Import gombra kattintva megadjuk a feltelepített SDK helyét és az előre konfigurált mobilok megjelennek az eszköz listában.

Helló Világ

Ha minden jól ment, akkor az Eclipse újraindítása után a Ctrl+N lenyomásával kiválaszthatjuk a J2ME Midlet Suite-t, amivel egy új Midlet alkalmazást hozhatunk létre. Ezután a projektünkre kattintva a Package Explorer-ben a Ctrl+N lenyomásával, majd a J2ME Midlet kiválasztásával létrehozzuk végre a java osztályunkat. Ha további osztályt akarunk majd létrehozni ne felejtsük a pipát kivenni a Add to Application Descriptort? a megfelelő helyen.(Nem kell egy felesleges bejegyzés a JAD-ba).
Ha minden jól ment, létrejött egy stub, egy csontváz fájl, amit fel kell dísziteni, hogy legalább egy hellóvilág kijöjjön belőle. Ha megnézzük közelebbről az előre generált osztályt a MIDlet-et bővíti és három alapmetódust szolgáltat a konstruktoron kívűl:
+ destroyApp(boolean)
+ pauseApp()
+ startApp()

A destroy és start metódus még dobhat MIDletStateChangeException kivételt.

Tehát kezdésként definiáljunk egy privát TextBox változót. Ha erre emlékezni fogunk innentől már automatikus az egész. A Midlet futtatásánál először a konstruktor, majd a startApp hívódik meg. Programunkban bármelyik metódusba írhatunk.
A startApp-ban tehát inicializáljuk a korábban definiált TextBox változót(new TextBox(...)), majd lehívjuk az aktuális Display-t (Display.getDisplay(this) és feltöltjük (setCurrent) a TextBox-szal.


import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.TextBox;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class Hello extends MIDlet {
	private TextBox tbox;
	private String msg;
	
	public Hello() {
		msg = "Szia";
	}
	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
	}
	protected void pauseApp() {
	}
	protected void startApp() throws MIDletStateChangeException {

		tbox = new TextBox("Hello világ", msg, 25, 0);
		Display.getDisplay(this).setCurrent(tbox);

	}
}

Futtatás

Ha futtatni szeretnénk a midletet, a projektünkre kattintva jobb egér gomb Run As > Run Configurations-nél a Wireless Toolkit Emulator-on belül létrehozunk egy új bejegyzést, ahol meghatározzuk a projekt nevét, az Executable-nél pedig a Midlet konstruktorát írjuk. Ha package-n belül dolgozunk, akkor természetesen elé kerül a package név. Az Emulator fülnél pedig beállíthatjuk melyik mobilt akarjuk emulálni. Apply. És mehet a móka.

Ha a konzolban megjelenik ez, az már jó jel:


EmulatorWrapper useProxy false
EmulatorWrapper httpProxyHost null
EmulatorWrapper httpPort1 null

És utána az Emulátor:

Bővítés kilépéssel

Ha szépen szeretnénk kilépni és nem a piros telefonkagyló 3mp-es lenyomásával, akkor a TextBox-ot el kell látni egy kilépő parancsra, amire hallgat is! :D

Létrehozunk egy privát kilépő parancsot. Ezt hozzáadjuk(addCommand) a TextBox-hoz, majd a setCommandListener-rel társítjuk a CommandListerrel példányunkat, ami még nem létezik így létre kell hozni. Ez vagy a CommandListener példányosításával, vagy a CommandListener interfész implementálásával oldható meg. Nézzük meg az utóbbit. Ennek egy megkötése van:

public void commandAction(Command cmd, Displayable disp)

Így ezt implementálni kell. Ami azt jelenti, hogyha a beérkező parancs kilépőparancs, akkor meghívja a destroyApp metódust. Mivel a destroyApp kivételt dobhat, így hívása esetén ezt kezelnünk kell.


import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.TextBox;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;


public class Hello extends MIDlet implements CommandListener {
	private TextBox tbox;
	private String msg;
	private Command exitCmd;
	
	public Hello() {
		msg = "Szia";
		exitCmd = new Command("Exit", Command.EXIT,1);
	}
	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
	}
	protected void pauseApp() {
	}
	protected void startApp() throws MIDletStateChangeException {
		
		tbox = new TextBox("Hello világ", msg, 25, 0);
		tbox.addCommand(exitCmd);
		tbox.setCommandListener(this);
		Display.getDisplay(this).setCurrent(tbox);
		
	}
	public void commandAction(Command cmd, Displayable disp) {
		
		if ( cmd == exitCmd){
			try {
				destroyApp(false);
			} catch (MIDletStateChangeException e) {
				
				e.printStackTrace();
			}
		}
	}
}


A balalsó sarokban megjelent az Exit felirat.

Persze az Exit gomb lenyomására nem fog kilépni, mert a midletet futtató környezet csak akkor hajlandó lebontani az alkalmazást, ha erről külön értesítést kap. Ez pedig:

a notifyDestroyed() metódus, amit a commandAction-ben a try/catch blokk után kell elhelyezni.

Problémák:

(1) Nem jelenik meg semmi vagy ha igen, akkor is kb. öt másodperc múlva összeomlik az emulátor.

A tűzfal megfogja a zayit.exe-t. Tovább infó: http://discussion.forum.nokia.com/forum/showthread.php?109090-Wireless-…

Segítségek:

[1] A Samsung SDK integrációja Eclipse-szel, http://innovator.samsungmobile.com/cms/cnts/knowledge.detail.view.do?pl… (elavult)
[2] Mintaalkalmazás futtatása Eclipse IDE-vel, http://innovator.samsungmobile.com/onlinedocs/cmsCnts/20090228/1792/179…

Hozzászólások

Sose tudom mikor lehet ez még érdekes.