(Wykład 2 Klasa Canvas + zegar)
Transkrypt
(Wykład 2 Klasa Canvas + zegar)
JME – programowanie w NetBeans IDE Wykład 2 semestr 5 – 2013/14 INTERFEJS NISKIEGO POZIOMU KLASY CANVAS I 1. II 1. Tworzenie MIDletu przy pomocy środowiska NetBeans 7.3.1 (7.4). Otwórz nowy projekt typu Mobile Application o nazwie Wyklad_2 na dysku G:\ Nadaj nazwie MIDletu nazwę MIDletKlasyCanvas. Czynności wykonaj zgodnie z instrukcją do ćw.1 począwszy od pkt. I.1 do pkt. II.2 włącznie (nie zapomnij o konstruktorze klasy MIDletKlasyCanvas( ) ). Podstawowy szkielet MIDetu – projektowanie wyglądu interfejsu niskiego poziomu Zbudujmy wewnętrzną klasę EkranG rozszerzającą klasę Canvas, zaraz na początku części publicznej klasy MIDletKlasyCanvas. Zatem umieść poniższy kod wyróżniony szarym tłem import javax.microedition.midlet.*; public class MIDletKlasyCanvas extends MIDlet { public MIDletKlasyCanvas() { } private class EkranG extends Canvas { public EkranG(String txtlab){ } protected void paint(Graphics g){ } } public void startApp() { } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } 1. Dokonaj przeformatowania kodu programu <Alt+Shift+F>. (lub kliknij prawym przyciskiem wewnątrz edytora kodu i wybierz opcję Format.) 2. W klasie EkranG umieść deklaracje trzech zmiennych: String etykieta = "Tekst domyślny";//tekst do wypisania na ekranie int sE, wE; //szerokość i wysokość ekranu 3. W konstruktorze klasy EkranG umieść poniższe instrukcje: etykieta = txtlab; 4. Wygląd naszego ekranu zdefiniujemy w metodzie paint(), zatem uzupełnij jej treść następująco: //Pobieram wysokość i szerokość dostępnego ekranu: sE = getWidth(); wE = getHeight(); //Malowanie tła g.setColor(247, 223, 62);//zmiana aktualnego koloru //Namalowanie wypełnionego aktualnym kolorem prostokąta g.fillRect(0, 0, sE, wE); //Tekst domyślny na środku ekranu g.setColor(0,0,255); g.drawString(etykieta, sE / 2, wE / 2, Graphics.BASELINE | Graphics.HCENTER); Zbudowaliśmy klasę wewnętrzną EkranG dziedziczącą z Canvas. Aby zobaczyć efekty naszej pracy, musimy stworzyć logiczną reprezentację ekranu. Wykonaj tą czynność samodzielnie (patrz. pkt.III.2). 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"); 5. Uzupełnij treść metody startApp() następująco: display.setCurrent(ekranG); 6. Uruchom program <F6>. 7. 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. Czynności wykonaj zgodnie z instrukcją do ćw.1). III Rozbudowa MIDetu o obiekt zegara 1. Utworzymy obiekt zegara. Wykorzystamy tu klasę Timer(). Zadeklarujemy w części publicznej klasy MIDletKlasyCanvas odpowiednie zmienne, które pozwolą nam określić aktualną godzinę, minutę i sekundę następująco: Materiały do użytku wewnętrznego. Opracował Zbigniew JANIK. 1 JME – programowanie w NetBeans IDE Wykład 2 Timer zegar private int private int private int semestr 5 – 2013/14 = new Timer(); godzina; minuta; sekunda; 2. Klasa Timer() znajduje się w pakiecie util stąd też należy zaimportować odpowiedni pakiet java.util.Timer; 3. Musimy utworzyć szkielet metody odmaluj(), który należy umieścić bezpośrednio za metodą paint() wewnątrz klasy EkranG(): public void odmalujEkran() { } 4. Utwórzmy teraz własną klasę ZdarzenieZegara, która przyjmie w naszym przypadku następującą postać (wpisz ja za metodą commandAction): class ZdarzenieZegara extends TimerTask { public void run() { ekranG.odmalujEkran(); // chwilowo ignoruj błąd w tej instrukcji } } 5. Wykorzystywana jest tu klasa ZdarzenieZegara, w której znajduje się abstrakcyjna metoda run(). To właśnie w tej metodzie zapiszemy wszystkie czynności, które będzie wykonywał nasz zegar w ściśle określonych odstępach czasu. To w tej metodzie odwołujemy się do obiektu płótna. 6. Wewnątrz metody odmaluj() tworzymy obiekt kalendarza korzystając z klasy Calendar znajdującą się w pakiecie java.util Następnie korzystamy z metody get(), która zwraca nam potrzebne wartości (aktualną godzinę, minutę i sekundę). Ustalamy także odpowiednią strefę czasową, a na koniec odświeżamy zawartość ekranu graficznego metodą repaint(). Calendar kalendarz = Calendar.getInstance(); TimeZone strefa = TimeZone.getTimeZone("GMT+1"); kalendarz.setTimeZone(strefa); godzina = kalendarz.get(Calendar.HOUR); minuta = kalendarz.get(Calendar.MINUTE); sekunda = kalendarz.get(Calendar.SECOND); repaint(); 7. Na końcu metody paint() dopisz instrukcje wyświetlające bieżący czas w następującej postaci: g.setColor(0,0,0); g.drawString("Aktualny czas:",25,100,Graphics.TOP|Graphics.LEFT); g.drawString(godzina+":"+minuta+":"+sekunda,25,115,Graphics.TOP|Graphics.LEFT); 8. Uruchom MIDlet. Na ekranie powinien pojawić się tekst Aktualny czas: i w następnym wierszu 0:0:0 Przyczyną takiego stanu rzeczy jest brak odświeżania zegara (brak generowanych zdarzeń pochodzących od zegara). 9. Utwórzmy zatem obiekt klasy ZdarzenieZegara (w części publicznej klasy MIDletKlasyCanvas) ZdarzenieZegara zdarzenie = new ZdarzenieZegara(); 10. Zaplanujmy generowanie zdarzeń pochodzących od zegara co 1 sekundę począwszy od chwili 0 wywołując metodę schedule() (na końcu konstruktora klasy MIDletKlasyCanvas) zegar.schedule(zdarzenie,0,1000); 11. Uruchom MIDlet. IV Wypisywanie nazw wciskanych klawiszy na klawiaturze telefonu 1. Zadeklaruj zmienną typu String o nazwie nazwaKlawisza w publicznej części klasy MIDletKlasyCanvas. String nazwaKlawisza = ""; 2. Za metodą paint() umieść treść poniższej metody keyPressed(). Metoda ta klasy Canvas umożliwia wczytanie kodu wciśniętego klawisza: public void keyPressed(int keyCode) { nazwaKlawisza = getKeyName(keyCode); repaint(); } 3. Na końcu metody paint() dopisz instrukcje wyświetlające nazwę wciśniętego klawisza w następującej postaci: g.setColor(0, 0, 0); g.drawString("Nazwa wciśniętego klawisza:", 25, wE * 3 / 4, Graphics.TOP | Graphics.LEFT); g.setColor(255, 0, 0); g.drawString(nazwaKlawisza, 25, wE * 3 / 4 + 15, Graphics.TOP | Graphics.LEFT);g.drawString("Nazwa wciśniętego klawisza:",25, wysokośćEkranu*3/4,Graphics.TOP|Graphics.LEFT); g.drawString(nazwaKlawisza, 25, wysokośćEkranu*3/4+15,Graphics.TOP|Graphics.LEFT); 4. Rozbuduj aplikację tak, aby wyświetlać na ekranie jednocześnie kod naciśnietego klawisza. g.setColor(0, 0, 0); g.drawString("Kod wciśniętego klawisza:", 25, wE * 3 / 4 + 30, Graphics.TOP | Graphics.LEFT); g.setColor(255, 0, 0); g.drawString("" + kodKlawisza, 25, wE * 3 / 4 + 45, Graphics.TOP | Graphics.LEFT); Materiały do użytku wewnętrznego. Opracował Zbigniew JANIK. 2