Wyklad Java 11
Transkrypt
Wyklad Java 11
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(). 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. Zwolnienie wszystkich zasobów używanych, przedtem zawsze wykonuje się stop(). Szkielet Apletu import java.awt.*; import java.applet.*; /* <applet code="AppletSkel" width=300 height=100> </applet> */ public class AppletSkel extends Applet { public public public public public public } void void void void void void init() { } start() { } stop() { } destroy() { } paint(Graphics g) { } 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(). Aplet z Przesuwanym Tekstem Metoda wątku do wyświetlenia przesuwanego tekstu. Przesuwa znaki w wiadomości z początku na koniec: 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 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> 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... VSPACE i HSPACE – obszar w pikselach powyżej/poniżej apletu i po obu stronach 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"); } } }