Wykład 11:
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.*;
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>
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
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 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()
.
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:
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
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... ● VSPACEi
HSPACE– obszar w pikselach
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)
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;
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
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)
:
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)
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
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"); }
} }