wtorek, 5 lutego 2008

Pierwszy MIDlet (aplikacja J2ME)!

Ostatnimi dni zainteresowałem się pisaniem jakiegoś softu na komórki. Wypożyczyłem sobie książkę do Java Micro Edition i dzięki niej mogę tutaj napisać krótki tutorial jak napisać Hello, world! na własny telefon :)

Co nam będzie potrzebne:
- środowisko Eclipse : link
- plugin EclipseME : link
- Sun Java Wireless Toolkit (WTK): link
Pierwszych dwóch chyba nie trzeba omawiać. Z trzeciego potrzebny będzie nam emulator żebyśmy mogli sobie testować nasze aplikacje bez potrzeby wgrywania na koma.

Wszystko instalujemy i przechodzimy do konfigurowanie środowiska Eclipse.
1. Otwieramy okno Window->Preferences.
2. Wybieramy J2ME->Device Management.
3. Klikamy Import.
4. W polu Specify search directory podajemy ścieżke na katalog gdzie znajdują się pliki WTK.
5. Zaznaczmy wszystkie odnalezione pozycje, klikamy finish i wybieramy sobie jedną. Są to dostępne emulatory. Ja używałem Media Control Skin.

6. W oknie preferences przechodzimy do Java->Debug.
7. Odznaczamy Suspend execution on uncought exceptions oraz Suspend execution on compilation errors.
8 Wartosc Debugger timeout zmieniamy na 15000, a pole Launch timeout na 20000.

Zabieramy się za tworzenie nowego projektu.
1. Tworzymy nowy projekt wybierajac z listy J2ME Midlet Suite i klikamy next
2. Nazwa projektu dowolna, u mnie dla przykładu HelloWorld.
3. Klikamu next next aż do końca.
4. Dodajemy nową klasę do projektu.
5. Nadajemy jej nazwę HelloWorld.
6. Piszemy przykładową klasę (opiszę o co chodzi kawałek dalej):
package j2me.tests;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class HelloWorld extends MIDlet implements CommandListener {

public HelloWorld() {
// utworzenie formularza głównego
Form myForm = new Form("Pierwszy MIDlet!");
String text = "Hello, world!";

// dodanie napisu oraz przycisku do wyłączenie aplikacji
myForm.append(text);
myForm.addCommand(new Command("Exit", Command.EXIT, 0));
myForm.setCommandListener(this);

// pobranie managera ekranu
Display display = Display.getDisplay(this);
// wyświetlenie
display.setCurrent(myForm);
}

public void commandAction(Command c, Displayable s) {
if (c.getCommandType() == Command.EXIT)
notifyDestroyed();
}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {}

protected void pauseApp() {}

protected void startApp() throws MIDletStateChangeException {}
}

7. W package explorer przechodzimy do HelloWorld.jad
8. Na dole wybieramy zakładkę Midlets
9. Dodajemy nowy element HelloWorld i podprowadzamy do niego naszą klasę HelloWorld.
10. Budujemy pakiet klikajac prawym przyciskiem myszy na projekt -> J2ME -> Create package

Ok wszystko gotowe ! Otwieramy okno dialogowe run as i tworzymy nowa konfigurację uruchomieniową typu Wireless Toolkit Emulator i odpalamy!
Naszym oczom powinno ukazać się :

(Jak coś nie działa pisać w komentarzach ;P)

Czas opisać co tam się dzieje w tym kodzie...
Każdy MIDlet musi dziedziczyć po klasie MIDlet zawartej w pakiecie javax.microedition.midlet. Wymaga ona definicji trzech metod: startApp(), pauseApp(), destroyApp(). Jak widać pozostawiliśmy je puste. W innej części kursu omówie je bardziej. Na tę chwilę powiem tylko, że odpowiadają one za zachowanie aplikacji np podczas jej zatrzymywania gdy nadchodzi rozmowa w telefonie.

Klasa Form - żeby coś wyświetlić trzeba mieć najpierw na czym. My wyświetlamy na prostym bardzo obiekcie typu Form. Na niego wrzucamy prosto różnego typu elementy (TextField, StringItem itp.). W naszym przypadku jest to tylko jeden element String, który dodajemy za pomocą metody append.
Dodam tutaj jeszcze, że Form jest jednym z kilku możliwych opcji. Jest np. klasa Canvas która służy do rysowania. Wszystkie klasy które chcą być wyświetlane na ekranie muszą implementować interfejs Displayable.

Teraz dość istotna sprawa. Jak pewnie zauważyliście nasza klasa (to nie kryptoreklama!) implementuje interfejs CommandListener. Jest to dość popularne rozwiązanie do obsługi Commend. W J2ME niestety nie mamy żadnych buttonów itp. więc interakcja odbywa się poprzez klawisze na telefonie. Aby ją obsłużyć należy dodać obiekt typu Command do Forma. Konstruktor obiektu Command wygląda następująco:
publi Command(String tekst, int typ, int priorytet)
tekst - nazwa wyświetlana
typ - typ komendy (Ok, Exit, Cancel, Help itp)
priorytet - służy do układania kolejności. Można też wg niego rozróżniać komendy

Instrukcja myForm.setCommandListener(this) ustawia jako słuchacza dla polecen z myForm nasz obiekt MIDlet.
Po wywołaniu komendy wykonywana jest metoda commandAction która rozpoznaje typ komendy i wykonuje odpowiednie polecenie.

No i ostatnie dwie linie do omówienia...
Display display = Display.getDisplay(this) - pobiera obiekt managera ekranu, to na nim są wyświetlane wszystkie Formy.
display.setCurrent(myForm) - ustawiamy jako wyświetlany Formularz nasz stworzony z napisem.

To wszystko :)
Zapraszam do komentowania/pytania i krytyki (no mercy !).

8 komentarzy:

  1. Fajnie fajnie - zainspirowales mnie WooKasZku do dzialania;]

    OdpowiedzUsuń
  2. ogromny plus, bardzo dobry tutorial na start( dawno nie pisalem w eclipsie i pare rzeczy wymagalo przypomnienia) ale w koncu udało sie odpalić

    OdpowiedzUsuń
  3. Przydatny art, podstawy prosto wytłumaczone, dzięki :)
    Pozdrawiam
    Adam

    OdpowiedzUsuń
  4. Ten artykuł ma 3 lata i jest moim zdaniem lepszy niż najnowszy tutorial Oracle'a.

    OdpowiedzUsuń
  5. Ten artykuł ma 3 lata i jest moim zdaniem lepszy niż najnowszy tutorial Oracle'a.

    OdpowiedzUsuń
  6. czy mi sie wydaje czy ze strony oracle trzeba sie rejestrowac aby pobierac pliki? probuje pobrac WTK i niestety skierowuje mnie do rejestracji.

    OdpowiedzUsuń