(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