Wykład 11: Programowanie Apletów
Aplety Aplikacja uruchamiana jako część dokumentu HTML: dostępna na serwerze transportowana przez Internet instalowana i uruchamiana na przeglądarce Po instalacji u klienta, aplet ma ograniczony dostęp do jego zasobów.
Prosty Aplet Aplety komunikują się z użytkownikiem przez interfejs graficzny (tutaj AWT), nie klasy wejścia/wyjścia: import java.awt.*; Każdy aplet jest pod-klasą klasy Applet: import java.applet.*; public class SimpleApplet extends Applet {
Prosty Aplet Ciąg Dalszy Aplet musi przesłonić metodę paint, która wywołuje się za każdym wyświetleniem apleta na ekranie. Parametr opisuje graficzne środowisko apleta: public void paint(graphics g) { Element klasy Graphics, wyświetla łańcuch na danych współrzędnych: g.drawstring("a Simple Applet", 20, 20);
Wykonanie Apleta Ta sama metoda kompilacji aplikacji i apletów. Inne wykonanie (aplet nie posiada metody main): przez otwarcie pliku HTML w przeglądarce: <applet code= SimpleApplet width=200 height=60> </applet> przez program appletviewer
Aplety i Zdarzenia Aplet jest sterowany zdarzeniami: dostarcza metod obsługi różnych zdarzeń AWT informuje aplet o zajściu zdarzenia, metoda wywołuje się, kontrola wraca do AWT nowy wątek dla obsługi większych zadań Użytkownik komunikuje się a apletem, nie na odwrót. Aplet nie żąda wprowadzenia danych przez użytkownika, ale reaguje na zdarzenia generowane przez niego.
Metody Klasy Applet Istnieją domyślne implementacje, ale większość apletów dostarcza własnych implementacji: init() - wywołana raz na początku działania apletu start() - wywołana po init() i za każdym razem gdy dokument HTML jest ponownie wyświetlany Na przykład opuszczenie i powrót do strony WWW.
Metody Klasy Applet Ciąg Dalszy paint() - wywołana za każdy razem gdy zawartość apletu ma być ponownie wyświetlana, np: okno apletu zostaje odsłonięte okno jest przywracane po minimalizacji Pobiera parametr typu Graphics graficzne środowisko apletu. update() - wywołana gdy aplet żąda ponownego wyświetlenia części swojego okna. Domyślnie rysuje tło a potem wywołuje paint().
Zwolnienie wszystkich zasobów używanych, przedtem zawsze wykonuje się stop(). Metody Klasy Applet Ciąg Dalszy stop() - wywołana za każdy razem gdy przeglądarka opuszcza stronę. Na przykład zawieszenie wykonania wątków które nie są potrzebne gdy aplet nie jest wyświetlany. Wznowienie odbywa się przez start(). destroy() - wywołana gdy aplet jest ostatecznie usuwany z pamięci.
Szkielet Apletu import java.awt.*; import java.applet.*; /* <applet code="appletskel" width=300 height=100> </applet> */ public class AppletSkel extends Applet { public void init() { public void start() { public void stop() { public void destroy() { public void paint(graphics g) { public void update(graphics g) {
Metody Wyświetlania Apletów wyświetlanie danego łańcucha na danych współrzędnych w aplecie: void drawstring(string message, int x, int y) ustalenie kolorów tła i czcionki void setbackground(color newcolor) void setforeground(color newcolor) dostępne kolory Color.black Color.blue Color.cyan Color.green Color.gray Color.white Color.red Color.magenta Color.pink Color.orange Color.yellow
Aplet z Tłem i Wyświetleniem import java.awt.*; import java.applet.*; /* <applet code="sample" width=300 height=50> </applet> */ public class Sample extends Applet{ String msg; public void init() { setbackground(color.cyan); setforeground(color.red); msg = "Inside init( ) --";
Aplet z Tłem i Wyświetleniem public void start() { msg += " Inside start( ) --"; public void paint(graphics g) { msg += " Inside paint( )."; g.drawstring(msg, 10, 30);
Uaktualnianie Apletu Kiedy aplet potrzebuje uaktualnić zawartość swojego okna, wywołuje metodę repaint(): void repaint() - ponownie wyświetla całe okno void repaint(int left, int top, int width, int height) - wyświetla część okna o danych współrzędnych repaint() wywołuje update(), który wywołuje paint().
Terminowe Uaktualnianie Apletu Gdy system jest zajęty, update() może nie wykonać się od razu. Dwie wersje przyśpieszone : void repaint(long maxdelay) void repaint(long maxdelay, int left, int top, int width, int height) Określają kiedy najpóźniej update() może zostać wykonany, w milisekundach.
Aplet z Przesuwanym Tekstem Aplet z tekstem przesuwanym poziomo, od prawej do lewej. import java.awt.*; import java.applet.*; /* <applet code="simplebanner" width=300 height=50> </applet> */ Przesuwanie tekstu realizowane jest przez osobny wątek tworzony przez aplet w czasie inicjalizacji.
Aplet z Przesuwanym Tekstem Dziedziczy po Applet i implementuje Runnable: public class SimpleBanner extends Applet implements Runnable { String msg = " A Simple Moving Banner."; Thread t = null; int state; boolean stopflag; Ustalenie kolorów: public void init() { setbackground(color.cyan); setforeground(color.red);
Aplet z Przesuwanym Tekstem Wystartowanie wątku: public void start() { t = new Thread(this); stopflag = false; t.start(); start() jest metodą klasy Thread, która powoduje wywołanie metody run().
public void run() { char ch; for( ; ; ) { try { repaint(); Thread.sleep(250); ch = msg.charat(0); msg = msg.substring(1, msg.length()); msg += ch; if(stopflag) break; catch(interruptedexception e) { Aplet z Przesuwanym Tekstem Metoda wątku do wyświetlenia przesuwanego tekstu. Przesuwa znaki w wiadomości z początku na koniec:
Aplet z Przesuwanym Tekstem Zatrzymanie wątku, np. po zasłonięciu okna. Ponowne wyświetlenie przez start(). public void stop() { stopflag = true; t = null; Wyświetlenie wiadomości przy rysowaniu apletu: public void paint(graphics g) { g.drawstring(msg, 50, 30);
Okno Stanu Oprócz wyświetlania w oknie głównym, aplet może też rysować do okna stanu: informacja co się dzieje w aplecie dostarczenie opcji wykonawczych informacja o błędach Do wyświetlania w oknie stanu służy metoda: void showstatus(string msg)
Wyświetlanie Stanu import java.awt.*; import java.applet.*; /* <applet code="statuswindow" width=300 height=50> </applet> */ public class StatusWindow extends Applet{ public void init() { setbackground(color.cyan); public void paint(graphics g) { g.drawstring("applet window.", 10, 20); showstatus("status window.");
Znacznik APPLET Używany do uruchomienia apletu z dokumentu HTML jak też z wyświetlacza apletów. Gdy jest więcej znaczników APPLET: wyświetlacz uruchomi każdy aplet w osobnym oknie przeglądarka internetowa uruchomi wszystkie na jednej stronie
Format Znacznika APPLET <APPLET [CODEBASE = url] CODE = appletfile [ALT = text] [NAME = applet name] WIDTH = pixels HEIGHT = pixels [ALIGN = alignment] [VSPACE = pixels] [HSPACE = pixels] > [<PARAM NAME=name VALUE=value>] [<PARAM NAME=name VALUE=value>]... [HTML wyświetlany gdy nie ma Javy] </APPLET>
VSPACE i HSPACE obszar w pikselach powyżej/poniżej apletu i po obu stronach Atrybuty Znacznika APPLET CODEBASE URL do katalogu gdzie znajdują się pliki wykonawcze apleta CODE plik wykonawczy apleta ALT tekst wyświetlony przez przeglądarkę gdy ta rozumie aplet, ale nie może obecnie go wykonać NAME nazwa apletu do komunikacji z innymi, getapplet() zwraca aplet o danej nazwie WIDTH i HEIGHT szerokość i wysokość obszaru gdzie aplet będzie wyświetlony ALIGN sposób wyrównania apletu: LEFT, RIGHT...
Przekazywanie Parametrów do Apleta Przez znacznik PARAM w APPLET. Metoda getparameter() zwraca wartość parametru o danej nazwie jako obiekt String.
Aplet z Parametrami, Przykład import java.awt.*; import java.applet.*; /* <applet code="paramdemo" width=300 height=80> <param name=fontname value=courier> <param name=fontsize value=14> <param name=leading value=2> <param name=accountenabled value=true> </applet> */ public class ParamDemo extends Applet{ String fontname; int fontsize; float leading; boolean active;
Aplet z Parametrami, Przykład public void start() { String param; Jeśli parametr nie istnieje, getparameter() zwraca wartość null. fontname = getparameter("fontname"); if(fontname == null) fontname = "Not Found";
Aplet z Parametrami, Przykład Aplet nie powinien pozostawić żadnego wyjątku (np. błąd konwersji na typ numeryczny) bez obsługi: param = getparameter("fontsize"); try { if(param!= null) // if not found fontsize = Integer.parseInt(param); else fontsize = 0; catch(numberformatexception e) { fontsize = -1;
Aplet z Parametrami, Przykład param = getparameter("leading"); try { if(param!= null) // if not found leading = Float.valueOf(param).floatValue(); else leading = 0; catch(numberformatexception e) { leading = -1; param = getparameter("accountenabled"); if(param!= null) active = Boolean.valueOf(param).booleanValue();
Aplet z Parametrami, Przykład public void paint(graphics g) { g.drawstring("font name: " + fontname,0,10); g.drawstring("font size: " + fontsize,0,26); g.drawstring("leading: " + leading,0,42); g.drawstring("account Active:"+active,0,58);
Przesuwany Tekst jako Parametr import java.awt.*; import java.applet.*; /* <applet code="parambanner" width=300 height=50> <param name=message value="java on the move!"> </applet> */ public class ParamBanner extends Applet implements Runnable { String msg; Thread t = null; int state; boolean stopflag;
Przesuwany Tekst jako Parametr public void init() { setbackground(color.cyan); setforeground(color.red); public void start() { msg = getparameter("message"); if(msg == null) msg = "Message not found."; msg = " " + msg; t = new Thread(this); stopflag = false; t.start();
Przesuwany Tekst jako Parametr public void run() { char ch; for( ; ; ) { try { repaint(); Thread.sleep(250); ch = msg.charat(0); msg = msg.substring(1, msg.length()); msg += ch; if(stopflag) break; catch(interruptedexception e) {
Przesuwany Tekst jako Parametr public void stop() { stopflag = true; t = null; public void paint(graphics g) { g.drawstring(msg, 50, 30);
Aplet i Adresy URL Dwie metody uzyskania adresów URL: getdocumentbase() - adres URL pliku HTML który wywołał dany aplet getcodebase() - adres URL katalogu gdzie znajduje się plik wykonawczy bieżącego apletu
Adresy URL, Przykład import java.awt.*; import java.applet.*; import java.net.*; /* <applet code="bases" width=300 height=50> </applet> */ public class Bases extends Applet{ public void paint(graphics g) { String msg; URL url = getcodebase(); msg = "Code base: " + url.tostring(); g.drawstring(msg, 10, 20); url = getdocumentbase(); msg = "Document base: " + url.tostring(); g.drawstring(msg, 10, 40);
AppletContext Interfejs który pozwala na uzyskanie informacji o środowisku wykonawczym apletu. Kontekst bieżącego apletu można uzyskać przez wywołanie metody (w klasie Applet): getappletcontext()
AppletContext Metody interfejsu AppletContext: Applet getapplet(string appletname) Zwraca aplet o danej nazwie, jeśli znajduje się w danym kontekście, w przeciwnym razie null. Enumeration getapplets() Zwraca wszystkie aplety w danym kontekście. void showdocument(url url) void showdocument(url url,string where) Wyświetla w oknie apletu dokument o danym URL. void showstatus(string string) Wyświetla dany łańcuch w oknie stanu.
AppletContext void showdocument(url url, String where) Dozwolone wartości where: _self pokaż w bieżącej ramce _parent pokaż w ramce rodzica _top pokaż w ramce najwyższego poziomu _blank pokaż w nowym oknie przeglądarki
Wyświetlenie Zawartości Dokumentu import java.awt.*; import java.applet.*; import java.net.*; /* <applet code="acdemo" width=300 height=50> </applet> */ public class ACDemo extends Applet { public void start() { AppletContext ac = getappletcontext(); URL url = getcodebase(); try { ac.showdocument(new URL(url+"Test.html")); catch(malformedurlexception e) { showstatus("url not found");