I INSTRUKCJA DO ĆWICZENIA 1 PIERWSZA APLIKACJA W JAVIE NA TELEFON KOMÓRKOWY INTERFEJS WYSOKIEGO POZIOMU KLASY SCREEN Tworzenie pierwszego MIDletu przy pomocy środowiska NetBeans. 1. Otwórz nowy projekt w środowisku NetBeans, wybierając z menu File opcję New Project a następnie zaznacz w panelu Categories: Java ME, w panelu Project: Mobile Application. Naciśnij przycisk Next >. 2. Projekt nazwij JME-Pierwszy. Określ położenie projektu Project Location: przyciskiem Browse wybierając folder Z:\ 3. Koniecznie usuń zaznaczenie opcji Create Default Package and Main Executable Class (patrz poniżej. 4. Naciśnij przycisk Next >. 5. W trzecim kroku tworzenia nowego projektu w nowym oknie New Mobile Application, wybierz w okienku dialogowym Emulator Platform: Oracle Java Platform Micro Edition SDK 3.3, następnie sprawdź, czy ustawienia: typ urządzenia, konfiguracji i profili są zgodne z tym pokazanym na rysunku wyżej (JavaMEPhone1, CLDC-1.1, MIDP-2.1) jeśli tak, naciśnij przycisk Finish. 6. W okienku Projects kliknij nazwę projektu JME-Pierwszy prawym przyciskiem myszy a następnie wybierz opcję New i dalej w otwartym oknie dialogowym wybierz MIDlet. 7. Zmień nazwę MIDlet Name: na MidletKlasyScreen. Naciśnij przycisk Finish. 8. W okienku Projects kliknij dwukrotnie nazwę midletu MidletKlasyScreen, w oknie edytora kodu zostanie otwarty do edycji plik MidletKlasyScreen.java. II Podstawowy szkielet MIDetu opis podstawowych wymagań 1. Nasz wygenerowany program powinien mieć następującą postać (pominięto komentarze): import javax.microedition.midlet.*; public class MidletKlasyScreen extends MIDlet { public void startapp() { public void pauseapp() { public void destroyapp(boolean unconditional) { Uzasadnienie - deklaracja koniecznych metod Dziedziczenie po klasie MIDlet zobowiązuje nas do zdefiniowania trzech metod, które w klasie MIDlet zostały oznaczone jako abstrakcyjne. Metody abstrakcyjne nie zawierają żadnej treści i zmuszają programistów tworzących klasy pochodne do samodzielnego ich zdefiniowania. Metody abstrakcyjne, o których mowa, to: public void startapp() public void pauseapp() public void destroyapp(boolean unconditional) Są one bezpośrednio związane ze stanem, w jakim znajduje się MIDlet. W momencie uruchamiania aplikacji wywołana zostaje metoda startapp(). Jeśli chcemy zwolnić zaalokowane wcześniej zasoby, możemy użyć metody destroyapp() przed zakończeniem działania aplikacji. Metoda pauseapp() zostaje wywołana w chwili, gdy ktoś dzwoni i telefon musi zająć się obsługą rozmowy. 2. Za deklaracją klasy głównej MIDletKlasyScreen a przed metodą startapp() wygeneruj automatycznie konstruktora klasy. W tym celu należy wykonać następujące czynności: Ustaw kursor myszy w wierszu 12. Kliknij prawym przyciskiem myszy w pustym 12 wierszu i z menu podręcznego wybierz opcję Insert Code Następnie w oknie Generate kliknij opcję Constructor, zostanie automatycznie wygenerowany kod konstruktora klasy MIDletKlasyScreen public MIDletKlasyScreen() { Materiały do użytku wewnętrznego. Opracował Zbigniew JANIK. 1
III Projektowanie wyglądu interfejsu wysokiego poziomu 1. Przed konstruktorem wpisz instrukcję, która zadeklaruje istnienie ekranu klasy Form o nazwie formatka: Form formatka = new Form("Pierwszy MIDlet"); Z uwagi, iż używamy nazwy klasy Form po raz pierwszy, musimy zaimportować odpowiednią bibliotekę do naszego MIDletu następująco; wystarczy kliknąć prawym przyciskiem myszy wewnątrz okna edytora kodu i wybrać z menu podręcznego opcję Fix Imports, automatycznie zostanie dodana na górze programu w odpowiednim miejscu instrukcja import javax.microedition.lcdui.form; 2. Obiekt klasy Display jest logiczną reprezentacją ekranu telefonu komórkowego. Każdy MIDlet ma dedykowany dokładnie jeden taki obiekt i należy pozyskać referencję do niego poprzez wywołanie metody: getdisplay(). Aby to wykonać utwórzmy obiekt typu Display o nazwie display (przed konstruktorem w tzw. publicznej części klasy) następująco: Display display; Czy pamiętałeś o Fix Imports? 3. Teraz musimy przechować referencję do tego obiektu poprzez wywołanie metody getdisplay(). W tym przypadku najlepiej wpisać taką instrukcję w metodzie startapp(), ponieważ ta metoda zostanie wykonana automatycznie zaraz po uruchomieniu midletu. display = Display.getDisplay(this); 4. Wyświetlimy na naszym ekranie tekst Witamy społeczność akademicką! Najłatwiej tego dokonać wpisując na końcu w konstruktorze głównej klasy instrukcję, która doda do ekranu o nazwie formatka tekst: formatka.append("witamy społeczność akademicką!"); 5. Uruchom aplikację naciskając klawisz <F6>. Kursor myszy powinien być umieszczony w oknie edytora kodu. Powinien pojawić się ekran pokazany poniżej: 6. Zamknij emulator przyciskiem znajdującym się w prawym górnym narożniku okna. 7. Przyczyną takiego stanu rzeczy jest brak ustalenia, jaki ekran (obiekt) ma być wyświetlany na display (ekranie telefonu). W tym przypadku należy wpisać instrukcję w metodzie startapp(), która określi że, aktualnie wyświetlanym obiektem ma być ekran o nazwie formatka. 8. Uruchom aplikację. display.setcurrent(formatka); IV Zamknięcie aplikacji poleceniem Command W programach pisanych na telefony komórkowe nie uświadczymy tradycyjnych przycisków (Button), ich funkcje doskonale spełniają polecenia (Command). Na ekranie znajdują się one nad przyciskami opcji i to właśnie te przyciski wywołują polecenia. Po utworzeniu odpowiedniego polecenia trzeba je jeszcze dodać do formatki. Zmodyfikuj tak program, aby po wypisaniu tekstu na ekranie zamknięcie aplikacji nastąpiło po wybraniu opcji ZAMKNIJ 1. Jeśli więc chcemy operować komendami (poleceniami) w naszej aplikacji, jedna z naszych klas musi implementować interfejs CommandListener. Zatem dodaj do klasy MIDletKlasyScreen interfejs CommandListener, który pozwoli nam operować komendami obsługujące przyciski opcji. W tym celu zmień istniejący nagłówek klasy MIDletKlasyScreen do postaci public class MIDletKlasyScreen extends MIDlet implements CommandListener{ 2. Z uwagi, iż używamy nazwy klasy CommandLstener, musimy zaimportować odpowiednią bibliotekę do naszego MIDletu następująco; wystarczy kliknąć prawym przyciskiem myszy wewnątrz okna edytora kodu i wybrać z menu podręcznego opcję Fix Imports, automatycznie zostanie dodana w odpowiednim miejscu instrukcja import javax.microedition.lcdui.commandlistener; 3. Określenie obiektu słuchacza zdarzeń, który implementuje interfejs CommandListener wymaga także zdefiniowania metody commandaction(); którą w naszym przypadku umieścimy za metodą destroyapp(). I w tym przypadku wygenerujemy ją automatycznie, następująco: Wstaw pusty wiersz za metodą destroyapp Materiały do użytku wewnętrznego. Opracował Zbigniew JANIK. 2
Kliknij prawym przyciskiem myszy w tym pustym wierszu i z menu podręcznego wybierz opcję Insert Code Następnie w oknie Generate kliknij opcję Implement Metod zostanie wyświetlone okno dialogowe Generate Implement Methods, w którym należy zaznaczyć opcję dla węzła CommandListener, a następnie kliknąć przycisk Generate. Automatycznie zostanie wygenerowany kod metody commandaction, w której należy usunąć w całości instrukcję throw new UnsupportedOperationException("Not supported yet."); //To change body of Ten fragment kodu programu powinien wyglądać następująco: public void commandaction(command cmnd, Displayable dsplbl) { 4. Dodawanie polecenia ZAMKNIJ (zakończenie działania aplikacji) do MIDletu. Dodaj poniższą instrukcję przed konstruktorem klasy MIDletKlasyScreen Command wyjscie = new Command("ZAMKNIJ", Command.EXIT,1); 5. Wewnątrz konstruktora klasy MIDletKlasyScreen dopisz instrukcje dodające komendę // dodaj komendę formatka.addcommand(wyjscie); 6. Włącz nasłuchiwanie zdarzeń z ekranu dopisując poniższą instrukcję w metodzie startapp(): formatka.setcommandlistener(this); 7. W metodzie commandaction() możemy rozpoznać wywołaną komendę i aktywny ekran Displayable i odpowiednio na nią zareagować. public void commandaction(command cmnd, Displayable dsplbl) { if (cmnd == wyjscie) { destroyapp(true); notifydestroyed(); 8. Uruchom aplikację <F6> lub przyciskiem. 9. Sprawdź działanie polecenia ZAMKNIJ. Materiały do użytku wewnętrznego. Opracował Zbigniew JANIK. 3
V DRUGA APLIKACJA W JAVIE NA TELEFON KOMÓRKOWY INTERFEJS NISKIEGO POZIOMU KLASY CANVAS Tworzenie drugiego MIDletu przy pomocy środowiska NetBeans. 1. Otwórz nowy projekt typu Mobile Application o nazwie JME-Drugi na dysku Z:\ Nadaj nazwie MIDletu nazwę MidletKlasyCanvas. Czynności wykonaj zgodnie z niniejszą instrukcją począwszy od pkt. I.1 do pkt. II.1 włącznie. VI Podstawowy szkielet MIDetu projektowanie wyglądu interfejsu niskiego poziomu 1. Wygeneruj automatycznie konstruktora klasy MIDletKlasyCanvas (patrz pkt: II.2). 2. Zbudujmy wewnętrzną klasę EkranG rozszerzającą klasę Canvas, zaraz na końcu klasy MIDletKlasyCanvas. Zatem umieść dokładnie w tym samym miejscu poniższy kod wyróżniony szarym tłem: import javax.microedition.midlet.*; Publiczna część klasy MIDletKlasyCanvas Publiczna część klasy EkranG public class MIDletKlasyCanvas extends MIDlet { public MIDletKlasyCanvas() { Konstruktor klasy MIDletKlasyCanvas public void startapp() { public void pauseapp() { public void destroyapp(boolean unconditional) { private class EkranG extends Canvas { Konstruktor klasy EkranG public EkranG(String txtlab){ protected void paint(graphics g){ Pamiętaj o dodaniu odpowiednich bibliotek (Fix Imports) 3. Dokonaj przeformatowania kodu programu <Alt+Shift+F>. (lub kliknij prawym przyciskiem wewnątrz edytora kodu i wybierz opcję Format.) 4. W publicznej części klasy EkranG umieść deklaracje trzech zmiennych: String etykieta = "Tekst domyślny"; //tekst do wypisania na ekranie int szerokośćekranu, wysokośćekranu; //szerokość i wysokość ekranu 5. W konstruktorze klasy EkranG umieść poniższą instrukcję: etykieta = txtlab; 6. Na początku metody paint() wpisz instrukcje: //Pobieram wysokość i szerokość dostępnego ekranu szerokośćekranu = getwidth(); wysokośćekranu = getheight(); 7. Wygląd naszego ekranu zdefiniujemy w metodzie paint(), zatem uzupełnij jej treść następująco: //Malowanie tła g.setcolor(255, 255, 0);//zmiana aktualnego koloru //Namalowanie wypełnionego aktualnym kolorem prostokąta g.fillrect(0, 0, szerokośćekranu, wysokośćekranu); //Wyświetlenie współrzędnych lewego górnego narożnika ekranu g.setcolor(0, 0, 0); g.drawstring("(0,0)", 0, 0, Graphics.TOP Graphics.LEFT); //Wyświetlenie współrzędnych prawego dolnego narożnika ekranu g.drawstring("(" + szerokośćekranu + "," + wysokośćekranu + ")", szerokośćekranu, wysokośćekranu, Graphics.BOTTOM Graphics.RIGHT); //Tekst na środku ekranu g.setcolor(0,0,255); g.drawstring(etykieta, szerokośćekranu / 2, wysokośćekranu / 2, Graphics.BASELINE Graphics.HCENTER); Zbudowaliśmy klasę wewnętrzną EkranG dziedziczącą z Canvas. 8. Aby zobaczyć efekty naszej pracy, musimy stworzyć logiczną reprezentację ekranu. Wykonaj tą czynność samodzielnie (patrz. pkt.iii.2 i III.3). 9. W publicznej części klasy MIDletKlasyCanvas zadeklaruj zmienną, która będzie wskazywać na obiekty klasy EkranG następująco: EkranG ekrang; Natomiast w konstruktorze tej klasy dopisz instrukcję (konstruktor powinien zostać utworzony po wykonaniu pkt. II.2). ekrang = new EkranG("JME i Canvas rządzi"); Materiały do użytku wewnętrznego. Opracował Zbigniew JANIK. 4
10. Uzupełnij treść metody startapp() następująco: 11. Uruchom program <F6>. display.setcurrent(ekrang); 12. Zmodyfikuj samodzielnie tak program, aby zamknięcie aplikacji nastąpiło po wybraniu opcji z napisem KONIEC. (Zastanów się gdzie umieścić odpowiednie instrukcje). VII Wyświetlanie plików graficznych na płótnie (Canvas) 1. Zadeklaruj dwie zmienne typu Image o nazwach rysunek1, rysunek2 w publicznej części klasy MidletKlasyCanvas. 2. Na końcu konstruktora klasy MidletKlasyCanvas dopisz instrukcje określające adres do plików graficznych piesek.jpg oraz ptaszek.jpg try { rysunek1 = Image.createImage("/piesek.jpg"); rysunek2 = Image.createImage("/ptaszek.jpg"); catch (Exception e) { System.out.println("Brak obrazka:"+e); Przekopiuj z dysku sieciowego wskazanego przez prowadzącego pliki graficzne piesek.jpg oraz ptaszek.jpg do katalogu Z:\JME-Drugi\src naszego projektu 3. Aby zobrazować pliki graficzne na płótnie należy użyć metody drawimage(), która działa podobnie jak metoda drawstring, a wiec dopisz w metodzie paint() poniższe instrukcje (umieść je za instrukcją malującą tło płótna): g.drawimage(rysunek1, 0, 0, Graphics.TOP Graphics.LEFT); g.drawimage(rysunek2, szerokośćekranu-5, wysokośćekranu - 25, Graphics.BOTTOM Graphics.RIGHT); 4. Uruchom MIDlet. 5. Zmodyfikuj samodzielnie tak program, aby zamknięcie aplikacji nastąpiło po wybraniu opcji z napisem KONIEC. (Zastanów się gdzie umieścić odpowiednie instrukcje). VIII Zadanie do samodzielnego rozwiązania na zajęciach lab. 1. Utwórz nowy projekt typu Mobile Application o nazwie Trzeci na dysku Z:\ Nadaj nazwie MIDletu nazwę Koperta. 2. Zbuduj aplikację, która narysuje na ekranie telefonu komórkowego kopertę o wymiarach 120x40 umieszczoną po środku ekranu. 3. Wypełnij tło ekranu oraz koperty dowolnym kolorem. Linie koperty wyrysuj kolorem czarnym. 4. Poniżej koperty, na ¼ wysokości ekranu umieść swoje nazwisko i imię wyświetlone kolorem niebieskim wyśrodkowane w poziomie. 5. Zamknięcie aplikacji powinno nastąpić po wybraniu opcji z napisem WYJŚCIE. Uwaga: Aby uzyskać odpowiedni kolor, należy określić 3 parametry R, G, B w metodzie setcolor() Należy uruchomić program Paint i z menu Kolory wybrać: g.setcolor(r, G, B); Materiały do użytku wewnętrznego. Opracował Zbigniew JANIK. 5