• Nie Znaleziono Wyników

Programowanie apletów

N/A
N/A
Protected

Academic year: 2021

Share "Programowanie apletów"

Copied!
41
0
0

Pełen tekst

(1)

Wykład 11:

(2)

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.

(3)

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.*;

(4)

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

(5)

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>

(6)

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.

(7)

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

(8)

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()

.

(9)

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()

.

(10)

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) { } }

(11)

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

(12)

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

(13)

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

(14)

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()

.

(15)

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.

(16)

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.

(17)

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

(18)

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()

.

(19)

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) {} } }

(20)

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

} }

(21)

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:

(22)

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

} }

(23)

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

(24)

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>

(25)

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

(26)

Przekazywanie Parametrów do Apleta

Przez znacznik PARAM w APPLET.

Metoda

getParameter()

zwraca wartość parametru

o danej nazwie jako obiekt

String.

(27)

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;

(28)

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)

(29)

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

(30)

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

(31)

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

(32)

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;

(33)

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

(34)

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) {} } }

(35)

Przesuwany Tekst jako Parametr

public void stop() { stopFlag = true; t = null;

}

public void paint(Graphics g) { g.drawString(msg, 50, 30);

} }

(36)

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

(37)

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

} }

(38)

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)

:

(39)

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)

(40)

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

(41)

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

} }

Cytaty