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");
}
}
}

Podobne dokumenty