Aplety
Transkrypt
Aplety
Aplety Tomasz Borzyszkowski Podstawy Wszystkie aplety są podklasami klasy Applet, dlatego muszą importować java.applet. Muszą także importować java.awt (AWT = Abstract Window Toolkit), ponieważ aplety działają w oknie i potrzebują wsparcia dla okna. Aplety kompiluje się podobnie jak programy rozpatrywane dotychczas. Natomiast uruchania się je w inny sposób. Aplet nie tylko wykonuje tradycyjny kod ale także wyświetla informacje w postaci graficznej. Realizować takie zachowania potrafią przeglądarki internetowe oraz specjalne programy przeznaczone do przeglądania apletów, np. appletwiever. Wykonanie apletu nie rozpoczyna się od funkcji main(). Mechanizm uruchamiania apletu jest bardziej skomplikowany i opowiemy o nim wkrótce. Po kompilacji apleta umieszczamy go na stronie HTMLowej w specjalnym znaczniku <APPLET>, np. tak: <APPLET code=”MyApplet” width=200 height=60 2 </APPLET> Aplet architektura Aplety są programami bazującymi na oknach i jako takie różnią się od programów bazujących na konsoli tekstowej. Podstawowe różnice to: Aplety obsługują zdarzenia. Aplet potrafi rozpoznać i obsłużyć pewną liczbę sytuacji zachodzących w oknach, np. kliknięcie. Aplet czeka, aż zajdzie rozpoznawalna sytuacja (zdarzenie). AWT, kontrolujące zachowanie okien, informuje aplet o zajściu zdarzenia przez wywołanie tzw. uchwytu zdarzenia, będącego częścią apleta. Po obsłużeniu zdarzenia aplet oddaje sterowanie do AWT. W sytuacji, gdy aplet musi wykonywać dodatkową, ciągłą akcję, trzeba utworzyć dodatkowy wątek. Użytkownik inicjalizuje interakcję z apletem. Odwrotnie niż w dotychczasowych programach, które pytały o dane, gdy tylko ich potrzebowały. Interakcje użytkownika z apletem są wysyłane do apleta przez AWT jako zdarzenia. 3 Aplet szkielet Zwykle programy okienkowe korzystają ze skomplikowanego środowiska. AWT Javy stara się je uprościć jak tylko to możliwe. Większość prostych apletów nadpisuje tylko pewne standardowe metody decydujące o zachowaniu apleta. Część z nich jest zdefiniowana w klasie Applet (init(), start(), stop() i destroy()) inne np. paint() są zdefiniowane w klasach AWT (tu Component). Gdy aplet rozpoczyna swoje działanie, AWT wywołuje metody w następującej kolejności: init(), start() i paint(). Natomiast, gdy aplet kończy działanie AWT wywołuje metody następującej kolejności: stop() i destroy(). Opis metod: init() jest metodą wywoływaną jako pierwsza podczas uruchamiania apletu. Jest to miejsce, gdzie należy inicjalizować zmienne. Metoda wywoływana tylko raz. 4 Aplet szkielet cd Zobacz: Szkielet.java Szkielet.html start() jest metodą wywoływaną po init() oraz podczas restartu apleta. Pierwsze pojawienie się apleta na stronie www wiąże się z wywołaniem init() i start(), powroty do apleta tylko ze start(). paint() jest metodą wywoływaną zawsze, gdy trzeba odświeżyć okna apleta. Parametr metody zawiera opis środowiska graficznego, w którym uruchamiamy aplet stop() jest metodą wywoływaną zawsze, gdy przeglądarka opuszcza dokument zawierający aplet. Powinna wstrzymywać wykonanie wszystkich wątków, które nie muszą działać, gdy aplet nie jest widoczny. destroy() jest metodą wywoływaną, gdy z parametrów środowiska wynika, że aplet powiniem zostać usunięty z pamięci. Należy wówczas zwolnić wszystkie zarezerwowane zasoby. Metoda stop() jest zawsze wywoływana przed destroy(). 5 Prosty przykład Aplet do wydrukowania napisu w oknie używa metody: void drawString(String msg, int x, int y) gdzie msg jest drukowanym napisem, x i y początkowymi współrzędnymi tekstu w oknie (lewy górny róg okna, to (0, 0)). Metoda ta nie rozumie znaków nowej linii. Aby uzyskać taki efekt trzeba użyć odpowiednich współrzędnych x i y. Aplet może ustawiać kolor tła i kolor pierwszego planu używając metod: void setBackground(Color c) void setForeground(Color c) Parametr c specyfikuje kolor. Klasa Color definiuje stałe specyfikujące dostępne kolory. Aplet może także pobierać ustawione kolory tła i pierwszego planu: Zobacz: Simple.java Color getBackground() Simple.html Color getForeground() 6 Zobacz: SimpleBanner.java SimpleBanner.html Aplet zapisuje coś do okna tylko wtedy, gdy AWT wywołuje metody update() lub paint() apleta. Jak natomiast aplet może sam spowodować uaktualnienie zawartości okna, gdy trzeba ją zmienić? Sytuacja taka ma miejsce, gdy w oknie jakiś napis ma się stale poruszać (banner). Nie możemy stworzyć pętli wewnątrz metody paint(), ponieważ sterowanie nie powróciło by wówczas do AWT. Zachowanie, o którym mowa powyżej, można osiągnąć przez wywołanie metody repaint() zdefiniowanej w AWT. Jej wywołanie powoduje wywołanie przez zarządcę AWT metody update() apleta, której domyślnym zachowaniem jest wywołanie metody paint(). Metoda repaint() Metoda repaint() posiada klika wersji polimorficznych, wśród nich: void repaint() void repaint(int left, int top, int w, int h) Pierwsza powoduje odświeżenie całego okna, druga tylko podanego fragmentu. Jeżeli to tylko możliwe, należy stosować drugą wersję. 7 Znacznik <APPLET> Składnia: <APPLET [CODEBASE=url] CODE=applet ALT=alternateText NAME=appletInstName WIDTH=pixels HEIGHT=pixels ALIGN=alignment VSPACE=pixels HSPACE=pixels > [<PARAM NAME=parName_1 VALUE=parValue_1>] ... [<PARAM NAME=parName_n VALUE=parValue_n>] [html code displayed in the absence of Java] </APPLET> Wyjaśnienia: CODEBASE adres URL katalogu, w którym będziemy szukać skompilowanego pliku apletu1 CODE nazwa pliku bez rozszerzenia .class zawierająca kod apleta; nazwa jest relatywna względem CODEBASE 8 Znacznik <APPLET> wyjaśnienia ALT krótki tekst, który pojawi się jeżeli przegladarka rozumie znacznik <APPLET> ale nie może uruchomić Javy NAME nazwa instancji apletu służąca innym apletom do nawiązania z nim komunikacji; aby otrzymać aplet po nazwie można użyć metody getApplet() zdefiniowanej przez interfejs AppletContext ALIGN położenie apleta na stronie (jak <IMG> w HTML) VSPACE i HSPACE puste miejsce nad i pod apletem oraz z lewej i prawej strony apleta PARAM NAME i VALUE parametry przekazywane do apleta przez nazwę; aplet pobiera je metodą getParameter() Kod występujący po parametrach jest kodem HTMLowym wyświetlanym przez przeglądarki nie obsługujące znacznika <APPLET> Zobacz: ParamDemo.java ParamDemo.html SimpleBanner2.java 9 SimpleBanner2.html Położenie dokumentów Często zachodzi potrzeba załadowania przez aplet plików z lokacji, z której pobraliśmy dokument HTML startujący aplet. Istnieją dwie metody pobierania lokacji: getDocumentBase() pobiera URL dokumentu HTML stratującego aplet getCodeBase() pobiera URL katalogu, z którego załadowano kod apleta Zobacz: Bases.java Bases.html Aplet może być wykorzystany do otworzenia w przeglądarce innego dokumentu HTML. Służy do tego metoda showDocument(URL) interfejsu AppletContext. Interfejs ten jest zaprojektowany do przechowywania informacji o kontekście wykonania apletu. Kontekst bieżącego apletu możemy uzyskać wywołując jego metodę getAppletContext(). Zobacz: ACDemo.java ACDemo.html 10