Uniwersytet Łódzki
Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej
Pakiety Javy, Java
Wykład 6
Plan wykładu
Obsługa wejścia/wyjścia (I/O API)
Kolekcje
Aplety
Podstawy obsługi wejścia/wyjścia
Mechanizm ten bazuje na standardowym mechanizmie obsługi strumieni (stream)
Strumień I/O określony jest przez źródło (input source) oraz ujście (output destination)
Strumień może reprezentować różne rodzaje źródeł oraz ujść np. pliki, urządzenia, pamięć, inne programy, etc…
Strumienie mogą wspierać różne typy danych:
bajt, obiekty, prymitywne typy danych, etc…
Strumienie
wejściowe/wyjściowe
Strumień wejściowy służy do czytania porcji danych,
przychodzących z innego źródła
Strumień wyjściowy
służy do zapisu porcji
danych, które zostaną
przesłane do ujścia
Strumienie Bajtowe (byte streams)
Strumienie bajtowe wykorzystywane są do przesyłania danych w postaci paczek 8 bitów
Wszystkie strumienie pochodzą od klas:
OutputStream i InputStream
Przykład strumienia do pliku:
FileInputStream i FileOutputStream
Przykład 1(P1) „KopowianieBajtow”
Funkcja read() zwraca wartość int zamiast Byte, ponieważ umożliwa to
wykrycie sytuacji końca strumienia. Read() zwraca wówczas -1.
Każdy strumień musi zostać zamknięty close(). Zamknięcie strumienia powinno odbywać się w klauzuli finaly. Pozwala to uchronić przed niepotrzebnymi wyciekami.
Pozostałe typy strumieni bazują na typie bajtowym
Przykład 1. Czytanie i zapisywanie strumieni.
I n X a n n
I n X a
Strumień wejściowy
int c = a
in.read() in
out.write(c)
Strumienie znaków (character streams)
Przechowywanie znaków w konwencji Unicode przez JVM. Automatyczna konwersja lokalnych formatów do Unicode, nie jest wymagane dodatkowe sprawdzanie
wyjściowego formatu przez programistę
Nie jest bardziej złożony niż strumień bajtów
Wszystkie strumienie znakowe wyprowadzane są z klas: Reader & Writer. Np. dla plików: FileReader & FileWriter
P2. CopyCharacters. Warto zauważyć, że zmienna służąca do kopiowania jest
podobnie jak w P1 typu int. Różnica: w P1 int bierze 8 bitów, w P2 int bierze 16 bitów
Strumienie znakowe wykorzystują sekwencje:
znak powrotu oraz znak końca linii (\r\n) tzw. carriage-return i line-feed
lub jedno znakowy: znak końca linii (\n) oraz powrót (\r)
Zastosowanie powyższych znaków pozwala pisać programy na dowolne systemy operacyjne.
P3. Program CopyCharacters z uwzględnieniem końca linii. Klasy BufferReader &
PrintWriter. Metody readLine & println
Strumienie buforowane (Buffered Streams)
Mała efektywność wykorzystania strumieni niebuforowanych – konieczność
każdorazowego wołania metody wirte & read przez system operacyjny (konieczność uzyskania dostępu do dysku, ograniczenia w wydajności sieci, etc…)
Zwiększenie efektywność po przez wykorzystanie tzw. buffered streams na poziomie JVM. Dostęp do zasobów jest jednorazowy dla stosunkowo dużej liczby danych.
Dane zapisywane są w buforze. Jeśli bufor staje się pełny wówczas wołane są
funkcje natywne dla SO. Jeśli bufor czytający jest pusty wówczas wołane są funkcje SO i bufor zostaje uzupełniony.
Możliwość konwersji niebuforowanego strumienia do buforowanego:
Przykład:
inputStream = new BufferedReader(new FileReader("x.txt"));
outputStream = new BufferedWriter(new FileWriter(„y.txt"));
Klasy do tworzenia strumieni buforowanych:
BufferedInputStream & BufferedOutputStream – dla typu bajt
BufferedReader & BufferedWriters – dla typu character
Czyszczenie strumienia: flushing
Formatowanie
Strumienie implementujące formatowanie są instancjami PrintWriter i PrintStream (System.out, System.err)
Dwa poziomy formatowania:
print i println – formatują dane wyjściowe w standardowy sposób
format – duże możliwości sparametryzowania sposobu formatowania danych wyjściowych
Metoda format zawiera zbiór
parametrów specyfikujących sposób wyświetlenia argumentów
znajdujących się w tekście
System.out.format("The square root of %d is %f.%n", i, r);
Parametry konwertujące:
Format d – formatuje wartość intger
do wartości dziesiętnej
Format f – formatuje wartość typu
float do wartości dziesiętnej
n - generuje ciąg znaków zakończony specyficznym dla danej platformy zakończeniem linii.
Format x – formatuje wartość
integer do wartości szesnastkowej
Format s – traktuje każdą wartość jako
string
Format tB – formatuje integer jako
nazwę miesiąca
Formatowanie zasady
Precyzja – jest to matematyczna
dokładność dla zmiennych typu float. Dla s i pozostałych ogólnych konwersji jest to
maksymalna długość. Liczba jest przycinana od prawej strony.
Długość – jest to minimalna długość ciągu znaków. Jeśli potrzeba następuje
uzupełnienie do wymaganego minimum od lewej strony.
Flaga – specyfikuje dodatkowe opcje formatowania. Np. + - określa, że liczba zawsze powinna być wyświetlana ze znakiem, a 0, że 0 jest znakiem, który będzie powtarzany w przypadku
uzupełniania. . – oznacza format liczby z specyficznym dla danej platformy
separatorem.
Indeks argumentu – pozwala na
bezpośrednie wskazanie zmiennej, do której tyczy się dany format.
% 1$ +0 20 .10 f
Znak początku formatowania
Specyfikator formatu
Indeks argumentu Flaga Liczba znaków Precyzja Rodzaj konwersji
I/O dla konsoli
Standardowy strumień – charakterystyczne dla wielu systemów
operacyjnych. Dane czytają z klawiatury i wyświetlają na konsoli. Wspierają również I/O na plikach pomiędzy programami.
JVM wspiera trzy strumienie:
Standard Input: System.in
Standard Output: System.out (PrintStream)
Standard Error: System.err (PrintStream)
Strumienie zarządzane przez JVM są tworzone automatycznie i nie jest wymagane ich otwieranie
System.out
i
System.errsą strumieniami bajtowymi natomiast mają cechy strumieni znakowych.
System.in, żeby wspierać cechy strumieni znaków musi zostać opakowany.
InputStreamReader cin = new InputStreamReader(System.in);
Konsola
Bardziej zawansowana wersja strumieni. Umożliwia m.in.
Wprowadzanie haseł.
Nie zawsze jest dostępna. Jeśli metoda System.console() zwróci null wówczas dany SO nie wspiera konsoli lub program został uruchomiony w nieinteraktywnym otoczeniu.
Wprowadzanie haseł w bezpieczny sposób realizowane przy pomocy metody readPassword. Metoda ta gwarantuje:
Przykrycie wprowadzanego hasła * na ekranie
Szybkość usunięcia z pamięci, gdyż metoda zwraca tablicę znaków, która może być od razu nadpisana, a nie String
Przykład 3 (P3) – (linux)
Strumienie danych (data streams)
Wspierają bitową reprezentację podstawowych typów
Implementują interfejs DataInput lub DataOutput
Przykład:
Utworzenie strumienia do zapisu:
out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
Zapis do strumienia porcji danych:
out.writeDouble(table[i]);
out.writeUTF(table2[i]); - zapis z użyciem kodowania UTF-8
Utworzenie strumienia do czytania
in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
Odczyt porcji danych ze strumienia:
int libcza in.readInt();
String znak = in.readUTF();
DataStreams wykrywają koniec pliku i informują o tym fakcie po przez rzucenie wyjątku: EOFException
Do programisty należy odpowiednio sekwencyjne używanie funkcji read i wirte przypisanych wybranym formatom
Serializacja
Proces konwersji instancji obiektu, który posiada referencje na inne obiekty do postaci liniowego strumienia bitów. Zachowanie stanu obiektu.
Po serializacji obiekt może zostać przesłany przez sieć (gniazda) i odtworzony po drugiej stronie.
Serializacja jest mechanizmem standardowo używanym przez RMI.
Programista, który chce posługiwać się tym
mechanizmem musi zaimplementować interfejs
Serializable. Większość klas podstawowych posiada
zaimplementowany interfejs Serializable.
Strumienie obiektów
Wspierają przesyłanie obiektów.
Klasami implementującymi strumienie obiektów są:
ObjectInputStream i ObjectOutputStream. Obiekty te
implementują ObjectInput & ObjectOutput, które dziedziczą po DataInput/Output. Podstawowe metody z DataStream zaimplementowane są w tych klasach.
Istotne metody writeObject & readObject.
Metoda readObject musi pozwolić na konstrukcję obiektu, który mógł zawierać wskazania na inne obiekty, a te obiekty mogą mieć referencje na inne, etc…
Metoda writeObject tworzy drzewo obiektów i zapisuje do
strumienia. Czasami wywołanie tej metody może spowodować zapis
dużej ilości danych.
Strumienie plików
Ułatwiają niezależną od platformy obsługę plików (zmiana nazwy, zmiana atrybutów, kasowanie).
Instancja typu File odwołuje się do nazwy plików. Nie warunkuje to istnienia pliku.
Utworzenie zmiennej reprezentującej plik:
File a = new File(„plik.txt");
Różne zachowanie metody klasy File w zależności od systemu operacyjnego np.
AbsolutePath().
Tworzenie ścieżki charakterystycznej dla danego SO (wykorzystanie File.separtor)
File b = new File(".." + File.separator +
„przyklad" + File.separator + „plik.txt");
Przykład 4 (P4).
Koncepcja Random Access File
Przykłady metod klasy File
Usuwanie:
delete – natychmiastowe usunięcie pliku
deleteOnExit – plik jest usuwany w momencie zakończenia
działania JVM
Informacje o pliku
Ustawianie atrybutów
setLastModified
Zmiana nazwy pliku
renameTo()
Praca z katalogami
Mkdir – tworzenie katalogów
List i ListFiles – listuje zawartość katalogów
Kolekcje (Collection)
Kolekcja jest to obiekt, który gromadzi i przechowuje zbiór innych obiektów porządkując je w określony sposób – tworzy strukturę danych.
Przykładami kolekcji są: Vector, Hashtable, tablica (array)
Szkielet kolekcji (Collection Framework - CF) jest to architektura
pozwalająca na manipulowanie oraz reprezentowanie dowolnych zbiorów.
Przykładem takiego szkieletu kolekcji jest STL w C++.
Elementami Collection Framework są:
Interfejsy. Pozwalają na abstrakcyjne manipulowanie przechowywanymi danymi.
Implementacje. Konkretne implementacje interfejsów. Są to gotowe do użycia struktury danych.
Algorytmy. Są to metody, które mogą być wykonywane na obiektach, które implementują interfejsy collection framework np. szukanie, sortowanie.
Kolekcje były uważane jako mało wydajne podejście do reprezentacji
struktur danych.
Korzyści ze stosowania kolekcji
Redukcja nakładu pracy poświęcanego na tworzenie struktur
danych i implementację algorytmów. Wykorzystanie standardowych kolekcji pozwala na łatwiejszą integrację
Zwiększenie szybkość wykonywania programu oraz jego jakości.
Collection Framework posiada efektywnie zaimplementowane algorytmy oraz struktury danych. Programista może się skupić na ulepszaniu samego programu.
Zmniejsza wysiłki potrzebne na poznanie nowych API.
Brak konieczności projektowania nowych API – zastosowanie wcześniej stworzony przez specjalistów standardow.
Wielokrotne wykorzystanie kodu.
Interfejsy w CF
Dwa drzewa kolekcji
Set jest specjalizowaną kolekcją Collection, a SortedSet jest
specjalizowaną kolekcją Set
Wszystkie kolekcje są generyczne (możliwość użycia dowolnego
typu)
public interface Collection<E>...
Przy deklarowaniu kolekcji należy wskazać typ. Gwarantuje to
możliwość wykrycia błędu na poziomie kompilacji
Zrozumienie stosowania interfejsów kluczem do korzystania z CF
Collection
Set List Queue
SortedSet
Map
SortedMap
Interfejsy CF
Collection – grupa obiektów
nazywanych elementami. Obiekty te mogą się duplikować, mogą, ale nie musza być posortowane.
Set – nie może zawierać takich samych dwóch elementów.
Modeluje matematyczną abstrakcję zbioru.
SortedSet – zbiór uwzględniający porządek.
List – uporządkowany zbiór. Może zawierać dwa takie same
elementy. Użytkownik może decydować, gdzie dany element zostanie wstawiony (na podstawie indeksu).
Queue – kolejka elementów.
Może być FIFO lub LIFO.
Elementy mogą być ustawiane z priorytetami.
Map – pozwala przypisywać kluczom określone wartości. Nie może zawierać duplikujących się kluczy.
SrotedMap – Map uwzględniający
kolejność elementów zgodnie z
malejącymi/rosnącymi wartościami
klucza.
Collection
Ma zastosowanie w
przypadku, gdy jest wymagana duża ogólność dotycząca
sposobu uporządkowania oraz unikatowości elementów
Posiada konstruktor
pozwalający na konwersje to szczególnej kolekcji.
List<String> list = new ArrayList<String>(c)
public interface Collection<E> extends Iterable<E> {
// podstawowe operacje int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(E element); //optional boolean remove(Object element);
Iterator<E> iterator();
// masowe operacje
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E>
c);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
void clear();
// operacje na tablicach
Object[] toArray(); <T> T[] toArray(T[]
a); }
Przechodzenie przez Collection
For-each
Proste przejście przez całą kolekcję
for (Object o : collection) System.out.println(o);
Iterators
Możliwość przechodzenia przez kolekcję i usuwania pożądanych elementów
Iterator zostaje pobrany po przez wywołanie metody kolekcji iterator
Umożliwia usunięcie aktualnego elementu w przeciwieństwie do for-each
public interface Iterator<E> { boolean hasNext();
E next();
void remove();
}
static void filter(Collection<?> c) {
Interfejsd
Set
Zawiera metody odziedziczone z Collection i dodaje, te które
uniemożliwiają istnienie dwóch takich samych elementów.
Specyficzne zachowanie metod equals and hashCode
Przykładowe implementacje:
HashSet – przechowuje elementy w tablicy. Bardzo wydajne jednak nie gwarantuje kolejności iteracji.
TreeSet – przechowuje elementy w drzewie czerwono-czarnym. Kolejność na podstawie wartości. Wolniejsze niż HashSet.
LinkedHashSet – zaimplementowany jako tablica z listą.
Przykład:
Collection<Type> noDups = new
public interface Set<E> extends Collection<E> {
// podstawowe operacje int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(E element);
boolean remove(Object element);
Iterator<E> iterator();
// operacje zbiorcze
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E>
c);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
void clear();
Object[] toArray();
<T> T[] toArray(T[] a);
Podstawowe operacje na Set
import java.util.*;
public class FindDups {
public static void main(String[] args) { Set<String> s = new HashSet<String>();
for (String a : args) if (!s.add(a))
System.out.println("Duplicate detected: " + a);
System.out.println(s.size() + "
distinct words: " + s);
} }
Przykład
Uwagi!
• używaj typu Set zamiast konkretnego typu jak np.
HashSet. Pozwoli to na elastyczniejsze
programowanie po przez wykorzystanie
polimorfizmu
•
Źródło: Java Sun Tutorial
List
List uwzględnia następujące rodzaje operacji na kolekcji:
dostęp do wskazanego elementu (positional access)
Szukanie
Iteracje
Widok zakresu
Java dostarcza dwa rodzaje implementacji List:
ArrayList – stosunkowo wydajna
LinkedList – lepsza wydajność przy określonych warunkach.
Porównanie do wektora:
Długość nazw metod umieszczających elementy w kolekcji: setElement(), a w List set()
Ta sama metoda set dla wstawiania elementów na określonej pozycji
Iteracja w List może odbywać się w dwóch kierunkach
public interface List<E> extends Collection<E> {
// dostęp do danej pozycji E get(int index);
E set(int index, E element);
boolean add(E element);
void add(int index, E element);
E remove(int index);
boolean addAll(int index,
Collection<? extends E> c);
int indexOf(Object o);
int lastIndexOf(Object o);
ListIterator<E> listIterator();
ListIterator<E> listIterator(int index);
List<E> subList(int from, int to);
Podstawowe operacje na List
public static <E> void swap(List<E> a, int i, int j) {
E tmp = a.get(i);
a.set(i, a.get(j));
a.set(j, tmp);
}
Przykład
Uwagi! Powyższy przykład implementuje metodę zamiany miejscami dwóch wybranych elementów.
Zaimplementowane algorytmy:
• sort – sortuje listę z wykorzystaniem algorytmu sortowania przez scalanie.
• shuffle – losowa permutacja elementów
• reverse – odwórcenie kolejności elementów w liście
• rotate – rotacja elementów z określoną odległością
• swap – zamiana dwóch elementów miejscami
• replaceAll – zamiana wszystkich wystąpień określonej wartości przez inna wartość
• fill - nadpisanie każdego elementu posiadającego określoną wartość
• copy – utworzenie kopi listy
• binarySearch – przeszukiwanie z algorytmem drzewa binarnego
public static <E> void swap(List<E> a, int i, int j) {
E tmp = a.get(i);
a.set(i, a.get(j));
a.set(j, tmp);
}
Przykład
Queue
Kolejka przechowuje elementy w kolejności do przetwarzania.
Dwa rodzaje kolejek:
zwraca określaną wartość, gdy operacja się nie powiedzie
rzuca wyjątkiem, gdy operacja się nie powiedzie
Element na początku będzie elementem usuwanym jako pierwszy (LIFO) lub jako ostatni (FIFO)
Kolejki mogą mieć określą liczbę elementów (bounded)
Pobieranie i usuwanie elementów
poll
Remove
Pobieranie elementu bez usuwania
peek
element
public interface Queue<E> extends Collection<E> {
E element();
boolean offer(E e);
E peek();
E poll();
E remove();
}
Queue - przykład
import java.util.*;
public class Countdown {
public static void main(String[] args) throws InterruptedException { int time = Integer.parseInt(args[0]);
Queue<Integer> queue = new LinkedList<Integer>();
for (int i = time; i >= 0; i--) queue.add(i);
while (!queue.isEmpty()) {
System.out.println(queue.remove());
Thread.sleep(1000);
} } }
Przykład
Przykład pokazujący sposób implementacji licznika odliczającego w dół.
Map
Trzy rodzaje implementacji Map:
HashMap
TreeMap
LinkedHashMap
Dwa słowniki są równe jeśli dla
odpowiednich kluczy wartości ich są sobie równe.
Utworzenie obiektu słownika:
Map<String, Integer> m = new HashMap<String, Integer>();
Dostępne widoki: po przez klucz, po przez wartości i po przez wartości oraz klucz.
Iteracja może odbywać się wyłączenie po przez widoki:
for (KeyType key : m.keySet()) System.out.println(key);
for (Map.Entry<KeyType, ValType> e : m.entrySet())
System.out.println(e.getKey() + ":
" + e.getValue());
public interface Map<K,V> { // podstawowe operacje V put(K key, V value);
V get(Object key);
V remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
int size();
boolean isEmpty();
// operacje zbiorcze
void putAll(Map<? extends K, ? extends V> m);
void clear();
// konwersja
public Set<K> keySet();
public Collection<V> values();
public Set<Map.Entry<K,V>> entrySet();
// interfejs dla elemtów entrySet public interface Entry {
K getKey();
Aplety
Aplety są to programy, dla których środowiskiem wykonawczym jest przeglądarka
Aplet musi być podklasą java.applet.Applet lub wersja java.applet.JApplet, w przypadku używania kontrolek Swing.
Aplet w początkach Javy pozwalał na łatwą dystrybucję programów, bez konieczności przeprowadzenia procesu instalacji.
Aplety wykonywane są w
restrykcyjnym bezpiecznym obszarze (sandbox).
W prowadzenie Java Web Start zmniejszyło znaczenie apletów.
Umieszczanie apletów na stronie HTML
<applet code=AppletWorld.class width="200" height="200"></applet>
Możliwość wykonania apletu poza przeglądarką:
appletviewer AppletWorld.html
Aplet standardowo uruchamiany i zarządzany jest przez plug-in do przeglądarki.
Konwersja aplikacji do apletu
Aplikacja jest programem tzw. stand-alone, gdzie punktem wejścia jest funkcja main.
Aplet nie posiada metody main. Posiada kilka
metod, które są wołane na różnych etapach
wykonywania apletu
Kroki do przekształcenia aplikacji w aplet
Utworzenie podklasy java.applet.Applet
Nadpisanie metody Init, która inicjalizuje wykonanie apletu, podobnie jak main
Implementacja metody Init powinna uwzględniać fakt, że może być wołana
wielokrotnie.
Elementy GUI w Aplecie
dodawane są bezpośrednio
do niego.
Cykl życia apletu
Ładowanie apletu
Utworzenie instancji podklasy Applet
Inicjalizacja apletu
Uruchomienie apletu
Zatrzymanie apletu
Aplet zostaje zatrzymany w przypadku, gdy użytkownik
opuszcza stronę z apletem. Wówczas wołana jest funkcja stop.
Przeładowanie apletu
Jest wyjście z apletu i ponowne załadowanie apletu przez przeglądarkę
Przy wyjściu z apletu wołana jest funkcja stop oraz następuje
zwolnienie zasobów
Cykl życia apletu
Funkcje cyklu życia apletu
init – inicjalizacja apletu. Powinien zawierać kod, który
normalnie umieszczany jest w konstruktorze, a umieszczane w nim metody powinny mieć krótki czas wykonywania.
start – jest wołana w celu uruchomienia apletu w przypadku gdy jest ładowany aplet bądź kiedy użytkownik powraca na stronę.
W tej metodzie powinny zostać uruchomione wątki.
stop – zatrzymanie wykonywania apletu, w momencie gdy użytkownik opuszcza stronę bądź zamyka przeglądarkę.
destroy – zwolnienie zasobów, przygotowanie do wyłączenia apletu. Nie ma gwarancji, że metoda zostanie wykonana (!).
Nie każdy aplet wymaga nadpisania wszystkich metod
Rysowanie
Rysowanie realizowane jest przez metodę paint
Applet dziedziczy metodę paint z AWT z klasy Container
public void paint(Graphics g) {
g.drawRect(0, 0,
getWidth() - 1, getHeight() - 1);
g.drawString(buffer.toStr ing(), 5, 15);
}
Przechwytywanie zdarzeń
Aplet dziedziczy metody do obsługi zdarzeń z klasy Container
processKeyEvent
processMouseEvent
processEvent – przechwytuje każdy rodzaj zdarzeń
Przykład
Komponenty UI
Przycisk (javax.swing.JButton)
Checkboxes (javax.swing.JCheckBox)
Pojedyncza linia tekstu (javax.swing.JTextField)
Obszar tekstu (javax.swing.JTextArea)
Etykieta (javax.swing.JLabel)
Lista (javax.swing.JList)
Okno wyskakujące tzw. pop-up (javax.swing.Popup)
Scrollbars (javax.swing.JScrollBar)
Sliders (javax.swing.JSlider)
Płótno – przestrzeń do rysowania (java.awt.Canvas)
Menu
(javax.swing.JMenu,javax.swing.JMenuBar javax.swing.JMenuItem,
javax.swing.JCheckBoxMenuItem)
Kontenery (javax.swing.JPanel,
Metody do zarządzania komponentami:
add
remove
setLayout
Bezpieczeństwo
Poziomy bezpieczeństwa dla danego apletu implementowane są niezależnie przez każdą przeglądarkę
Restrykcje nakładane przez aplety:
Aplet nie może być ładować bibliotek, ani definiować natywnych metod
Nie może standardowo czytać ani zapisywać plików na dysku komputera, na którym jest wykonywany
Nie może tworzyć połączenia poza komputerem, z które został pobrany
Nie może uruchamiać programu, na komputerze, na którym jest zainstalowany
Nie może czytać właściwości systemu operacyjnego
Wygląd okna apletu różni się od wyglądu okna aplikacji
Każda przeglądarka implementuje Security Manager, w którym
można zmieniać moc ograniczeń. W przypadku, gdy SM uzna, że
zostały naruszone ograniczenia, rzuci wyjątkiem SecurityException
Wyświetlanie informacji w statusie
Możliwość wyświetlania informacji w pasku statusu
showStatus("MyApplet: Loading image file " + file);
W pasku stanu nie powinny być wyświetlane krytyczne informacje. Warto natomiast
wyświetlić informację na temat statusu
ładowanych obrazków, źródeł, etc…
Wyświetlanie dokumentów
Aplet oferuje możliwość wyświetlania sformatowanych dokumentów HTML
Do wyświetlania dokumentu służą poniższe metody wykonywane na AppletContext:
public void showDocument(java.net.URL url)
public void showDocument(java.net.URL url, String targetWindow)
Wartości dla parametru targetWindow: blank,
windowName, _self, _parent, _top
Odtwarzanie dzwięków
JApplet oraz AudoClip znajdujące się w pakiecie java.applet umożliwiają odtwarzanie dźwięków w formacie: 8 bit, µ-law,
8000 Hz, mono, Sun ".au"
Tworzenie muzyki
zapisanej w formacie .au umożliwia audiotool
getAudioClip(URL),
getAudioClip(URL, String) –
zwraca obiekt, który implementuje interfejs AudioClip
play(URL), play(URL, String) – odgrywa zasób umieszony pod wskazanym linkiem.
Interfejs AudioClip definiuje następujące metody:
Loop – rozpoczyna ciągłe odtwarzanie dzwięku.
Play – odgrywa dźwięk jednokrotnie
Stop – zatrzymuje odtwarzanie pliku