6455

Szczegóły
Tytuł 6455
Rozszerzenie: PDF
Jesteś autorem/wydawcą tego dokumentu/książki i zauważyłeś że ktoś wgrał ją bez Twojej zgody? Nie życzysz sobie, aby podgląd był dostępny w naszym serwisie? Napisz na adres [email protected] a my odpowiemy na skargę i usuniemy zabroniony dokument w ciągu 24 godzin.

6455 PDF - Pobierz:

Pobierz PDF

 

Zobacz podgląd pliku o nazwie 6455 PDF poniżej lub pobierz go na swoje urządzenie za darmo bez rejestracji. Możesz również pozostać na naszej stronie i czytać dokument online bez limitów.

6455 - podejrzyj 20 pierwszych stron:

Jan Bielecki Java 3 Programowanie wsp�bie�ne obiektowe i zdarzeniowe do Windows 95/98/NT Profesorowi Wojciechowi Cellaremu z wyrazami przyja�ni Spis tre�ci Pierwsze kroki Projektowanie aplet�w Obs�ugiwanie zdarze� Obs�ugiwanie myszki Obs�ugiwanie klawiatury Odtwarzanie pulpitu Dobieranie kolor�w Wykre�lanie napis�w Wykre�lanie obiekt�w Wykre�lanie obraz�w Odtwarzanie d�wi�k�w Projektowanie oblicza Programowanie w�tk�w Programowanie animacji Programowanie gier Grafika 2-wymiarowa Uk�ad wsp�rz�dnych Definiowanie kszta�tu Wykre�lanie linii Wype�nianie obszar�w Przekszta�canie obiekt�w Nak�adanie kolor�w Rozpoznawanie trafie� Definiowanie obszar�w Obcinanie wykre�le� Przekszta�canie napis�w Wykre�lanie glif�w Wykre�lanie splajn�w Dobieranie czcionek Lekkie komponenty Studium programowe Typy predefiniowane Deklaracje i instrukcje Wyra�enia i operatory Java po C++ Programowanie obiektowe Programowanie zdarzeniowe Projektowanie kolekcji Aplety i aplikacje Opisy aplet�w Klasy wewn�trzne Wykre�lanie pulpitu Sytuacje wyj�tkowe Obs�ugiwanie urz�dze� Wsp�rz�dne pulpitu Wykre�lanie figur Lokalizowanie zasob�w �adowanie obraz�w Buforowanie wykre�le� Pakietowanie klas Udost�pnianie zdarze� Projektowanie zdarze� Uk�adanie komponent�w Projektowanie oblicza Obs�ugiwanie okien Projektowanie menu Projektowanie dialog�w Projektowanie przycisk�w Programowanie wsp�bie�ne Przetwarzanie plik�w Komponenty JavaBeans Programowanie wizualne Wykorzystywanie kostek Przechowywanie obiekt�w Czcionki i znaki narodowe Okre�lanie daty i godziny Przezroczyste obrazy GIF Animowane obrazy GIF Rozbijanie plik�w GIF Przekszta�canie obraz�w Wy�wietlanie komponent�w Dekodowanie obraz�w U�ywanie przybornik�w Wymiarowanie aplet�w Stosowanie modeli kolor�w Interesuj�ce przypadki Narz�dzia pakietu JDK Studium programowe Dodatki A Priorytety operator�w B Definicje sta�ych C Klasa Debug D Symantec Visual Cafe E Borland JBuilder F Tek-Tools Kawa Od Autora Niepowstrzymany rozw�j Javy powoduje, �e wiele ksi��ek na jej temat by�o nieaktualnych ju� w chwili ich opublikowania. W minionym roku dezaktualizacja dosi�g�a tak�e i moich tekst�w: Java po C++ / Java od podstaw. Obroni�a si� tylko Java�2, poniewa� w ca�o�ci zosta�a oparta na delegacyjnym modelu obs�ugiwania zdarze�. Ale i w niej znajduj� si� programy, kt�re na skutek wyeliminowania takich metod jak stop, suspend, resume oraz kilkunastu innych, nale�a�oby obecnie nieco zmodyfikowa�. Niniejsz� ksi��k� napisa�em w celu pokazania nowo�ci, w tym nigdzie jeszcze nie opisanej grafiki 2D, d���c do takiego wy�o�enia wsp�bie�no�ci, aby mog�a znale�� zastosowanie w programowaniu wielow�tkowych aplikacji animacyjnych. Pomog�y mi w tym do�wiadczenia nabyte podczas nauczania Javy w Polsko-Japo�skiej Wy�szej Szkole Technik Komputerowych, w Instytucie Informatyki Politechniki Warszawskiej, w CITCOM oraz na szkoleniach organizowanych dla elit programistycznych wielkich firm. Je�li podam, �e w ubieg�ym roku uczestniczy�o w moich wyk�adach, projektach i laboratoriach ponad 400 informatyk�w, to zapewne lepiej ni� s�owa, uka�e to obecny stan zainteresowania Jav�. Aby uczyni� ksi��k� �atwiejsz� od poprzednich, wyposa�y�em j� w rozdzia� Pierwsze kroki. Metod� praktycznych przyk�ad�w pokaza�em, jak niemal bez wiedzy podstawowej, mo�na szybko przyst�pi� do uk�adania ca�kiem niebanalnych program�w, wykorzystuj�cych techniki programowania wsp�bie�nego, obiektowego, zdarzeniowego, graficznego i animacyjnego. Nie mam w�tpliwo�ci, �e ka�dy kto programowa� w j�zyku obiektowym (np. w ANSI�C++ albo w Delphi) oraz ka�dy kto pozna� Jav� w zakresie elementarnym, ju� po przeczytaniu kilku pierwszych rozdzia��w nabierze umiej�tno�ci programowania profesjonalnego. Pozosta�e rozdzia�y mo�e ju� czyta� w dowolnej kolejno�ci, si�gaj�c do nich po rozwi�zania konkretnych problem�w. �ycz�c Czytelnikom po�ytecznej lektury, z przyjemno�ci� informuj�, �e uwzgl�dniaj�c apele o udost�pnienie program�w �r�d�owych, zamieszczam w Internecie, na stronie www.ii.pw.edu.pl/~janb/java3/index.html wszystkie zawarte w ksi��ce programy oraz wymagane przez nie pliki d�wi�kowe i graficzne. prof. Jan Bielecki Jan Bielecki Pierwsze kroki Programy dziel� si� na aplikacje i aplety. Aplikacja jest programem wolnostoj�cym, a aplet jest programem wykonywanym pod nadzorem przegl�darki. W ka�dym z tych przypadk�w nale�y u�y� Maszyny Wirtualnej, interpretuj�cej B-kod programu powsta�ego po skompilowaniu programu �r�d�owego. Uwaga: Maszyna Wirtualna mo�e by� implementowana w sprz�cie albo mo�e by� emulowana za pomoc� rodzimego programu platformy. Projektowanie aplet�w Aplet jest programem zapisanym za pomoc� publicznej klasy apletowej (np. Master). Klasa ta dziedziczy pola i metody z klasy Applet oraz uzupe�nia je swoimi. Je�li w pewnym pliku wyst�puje klasa publiczna Name, to nazw� pliku musi by� Name.java. St�d wynika, �e w danym pliku mo�e by� zawarta co najwy�ej jedna klasa publiczna. Jest ni� zazwyczaj klasa apletowa. W ciele klasy wyst�puj� odwo�ania do klas bibliotecznych. Nazwa klasy bibliotecznej (np.�Applet) jest poprzedzona nazw� pakietu, do kt�rego nale�y ta klasa (np.�java.applet). Nast�puj�cy program, pokazany na ekranie Pierwszy aplet, wykre�la ko�o o promieniu 30 pikseli, wpisane w domy�lny prostok�t, kt�rego lewy-g�rny wierzcho�ek znajduje si� w punkcie (50, 50). Uwaga: Wsp�rz�dne punkt�w s� liczone wzgl�dem lewego-g�rnego naro�nika apletu. Ekran Pierwszy aplet ### fapplet.gif public class Master extends java.applet.Applet { // klasa Master private int x = 50, // pola x, y, r, d y = 50, r = 30, d; public void init() // metoda init { d = 2 * r; } public void paint(java.awt.Graphics gDC) // metoda paint { // wybranie koloru gDC.setColor(java.awt.Color.red); // wykre�lenie ko�a gDC.fillOval(x, y, d, d); // wybranie koloru gDC.setColor(java.awt.Color.black); // wykre�lenie okr�gu gDC.drawOval(x, y, d-1, d-1); } } Polecenia importu Nazwy klas wyst�puj�cych w programie mo�na upro�ci� do identyfikator�w (np. Applet, Graphics albo Color). Aby to umo�liwi�, nale�y u�y� polece� importu. import java.applet.Applet; import java.awt.*; Dzi�ki poleceniu import java.applet.Applet; nazw� klasy java.applet.Applet mo�na upro�ci� do Applet, a dzi�ki poleceniu import java.awt.*; odwo�ania do klas pakietu java.awt, kt�rych nazwy zaczynaj� si� od java.awt mo�na upro�ci� do identyfikatora ko�cz�cego tak� nazw� (np. java.awt.Graphics mo�na upro�ci� do Graphics). Wykorzystano to w nast�puj�cym aplecie, uproszczonym dzi�ki u�yciu polece� importu. import java.applet.Applet; import java.awt.*; public class Master extends Applet { private int x = 50, y = 50, r = 30, d; public void init() { d = 2 * r; } public void paint(Graphics gDC) { gDC.setColor(Color.red); gDC.fillOval(x, y, d, d); gDC.setColor(Color.black); gDC.drawOval(x, y, d-1, d-1); } } Opisy aplet�w Pliki z rozszerzeniem .class, powsta�e po po skompilowaniu klasy apletowej, s� wykonywane przez Maszyn� Wirtualn� wbudowan� w przegl�dark� (np.�Netscape�4.5) Aby Maszyna Wirtualna mog�a wykona� B-kod zawarty w pliku *.class, nale�y przegl�darce dostarczy� opis apletu. Opis apletu jest umieszczany w pliku z rozszerzeniem .html (np. Index.html). W opisie podaje si� m.in. nazw� i rozmiary apletu: jego szeroko�� (width) i wysoko�� (height), wyra�one w pikselach. Plik Index.html <applet code=Master.class width=200 height=200> </applet> Po odnalezieniu B-kodu apletu przegl�darka tworzy obiekt apletowy, po czym na rzecz jego podobiektu klasy Applet, wywo�uje metody init, start, paint, stop i destroy. Je�li w klasie apletowej dostarczy si� metod� o takiej samej sygnaturze, jak� ma metoda klasy Applet, to zostanie wywo�ana metoda klasy apletowej, a nie metoda klasy Applet. Ta wa�na w�a�ciwo�� j�zyka umo�liwia przedefiniowywanie w klasie pochodnej metod jej klasy bazowej. Uwaga: Dwie metody maj� tak� sam� sygnatur�, je�li maj� takie same nazwy, a ich nag��wki, pozbawione nazw parametr�w i specyfikator�w (np. public, static, synchronized) s� identyczne. Metoda start jest wywo�ywana przed ka�dym pojawieniem si� apletu, a metoda stop przed ka�dym jego znikni�ciem. Przed pierwszym pojawieniem si� apletu jest wywo�ywana metoda init, a po ostatnim metoda destroy. Metoda paint jest wywo�ywana w�wczas, gdy nale�y odtworzy� pulpit apletu oraz po ka�dym wywo�aniu metody start. Tu� przed tym, zniszczony fragment pulpitu jest czyszczony kolorem t�a apletu. Uwaga: Nawet gdy zniszczeniu ulega tylko fragment pulpitu, metod� paint nale�y zdefiniowa� w taki spos�b, aby odtwarza�a ca�y pulpit. Nast�puj�cy program, pokazany na ekranie Maskotka Javy, zawiera metod� init, przedefiniowuj�c� metod� init klasy Applet. A zatem w�a�nie ona zostanie wywo�ana przez przegl�dark�. W taki sam spos�b b�dzie potraktowane wywo�anie przedefiniowanej metody paint. Ekran Maskotka Javy ### mascot.gif Uwaga: Poniewa� nie przedefiniowano metod start, stop i destroy, wi�c przegl�darka b�dzie wywo�ywa� metody klasy Applet. Poniewa� cia�a tych metod s� puste, wi�c ich wykonanie nie b�dzie mia�o �adnego skutku. <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; public class Master extends Applet { private Image img; public void init() { img = getImage(getDocumentBase(), "Duke.gif"); } public void paint(Graphics gDC) { gDC.drawImage(img, 50, 50, this); } } dla dociekliwych Klasy programu mo�na umieszcza� w pakietach. Definicj� klasy pakietowej nale�y poprzedzi� deklaracj� pakietu, a we frazie code opisu apletu nale�y uwzgl�dni� nazw� pakietu. Uwaga: Je�li aplet nie jest wykonywany w �rodowisku uruchomieniowym, takim jak na przyk�ad Kawa, to za pomoc� parametru �rodowiska classpath albo parametru codebase, nale�y okre�li� miejsce, sk�d ma by� �adowana jego klasa pakietowa. <applet code=jbPackage.Master.class width=200 height=200 codebase=file:/C:/jbOutput> </applet> ===================================== package jbPackage; // pakiet jbPackage import java.applet.Applet; import java.awt.*; public class Master extends Applet { // klasa pakietowa public void paint(Graphics gDC) { // wykre�lenie napisu gDC.rawString("Hello", 40, 40); } } Pulpit apletu Prostok�tny obszar zdefiniowany w opisie apletu jest jego pulpitem. Lewy-g�rny naro�nik pulpitu ma wsp�rz�dne (0,0). Wsp�rz�dne x pulpitu rosn� w prawo, a wsp�rz�dne y rosn� do do�u. Aktualne rozmiary pulpitu otrzymuje si� za pomoc� metody getSize. Dimension d = getSize(); int w = d.width, // szeroko�� h = d.height; // wysoko�� Operacje na pulpicie wykonuje si� za pomoc� wykre�lacza, wydaj�c mu takie polecenia jak setColor (wybierz kolor), fillOval (wype�nij owal), drawOval (wykre�l owal), itp. Wykre�lacz jest udost�pniany przez parametr metody paint i update albo mo�e by� utworzony za pomoc� metody getGraphics. Ka�de jej wywo�anie dostarcza odno�nik do odr�bnego wykre�lacza. Uwaga: Po zako�czeniu korzystania z wykre�lacza przydzielonego za pomoc� metody getGraphics, nale�y go zwolni� za pomoc� metody dispose. W przeciwnym razie, zw�aszcza gdy jest on przydzielany w p�tli, mo�e doj�� do nadmiernej konsumpcji zasob�w systemowych. Graphics gDC = getGraphics(); // przydzielenie // wybierz kolor gDC.setColor(Color.red); // wype�nij owal gDC.fillOval(x, y, d, d); // wybierz kolor gDC.setColor(Color.black); // wykre�l owal gDC.drawOval(x, y, d-1, d-1); gDC.dispose(); // zwolnienie Obs�ugiwanie zdarze� Podczas wykonywania apletu mog� zachodzi� zdarzenia. Obs�ug� zdarzenia deleguje si� do obiektu nas�uchuj�cego. Zrezygnowanie z delegowania powoduje, �e zdarzenie jest ignorowane. Delegowanie obs�ugi Do delegowania obs�ugi zdarze� s�u�� metody addKindListener. Do obs�ugi przycisku s�u�y metoda addActionListener, a do obs�ugi myszki i klawiatury metody addMouseListener, addMouseMotionListener i addKeyListener. Argumentem metody addKindListener jest odno�nik do obiektu klasy implementuj�cej interfejs KindListener. W takiej klasie, zgodnie z tabel� Metody�obs�ugi, nale�y dostarczy� komplet metod zdefiniowanych w interfejsie KindListener. Uwaga: Interfejsem jest klasa abstrakcyjna, kt�ra zawiera co najwy�ej definicje sta�ych i deklaracje metod. Implementowanie interfejsu nie jest niczym innym jak wielo-dziedziczeniem takiej w�a�nie klasy. Jest to jedyna dozwolona forma wielodziedziczenia. Tabela Metody obs�ugi ### Delegacja: addActionListener Interfejs: ActionListener Metoda Parametr actionPerformed ActionEvent Delegacja: addMouseListener Interfejs: MouseListener Metoda Parametr mousePressed MouseEvent mouseReleased MouseEvent mouseClicked MouseEvent mouseEntered MouseEvent mouseExited MouseEvent Delegacja: addMouseMotionListener Interfejs: MouseMotionListener Metoda Parametr mouseMoved MouseEvent mouseDragged MouseEvent Delegacja: addKeyListener Interfejs: KeyListener Metoda Parametr keyPressed KeyEvent keyReleased KeyEvent keyTyped KeyEvent ### Uwaga: Zamiast implementowa� interfejs KindListener, mo�na klas� obiektu nas�uchuj�cego zdefiniowa� jako pochodn� od pomocniczej klasy KindAdapter. W takiej klasie (nie ma jej dla interfejsu ActionListener) zdefiniowano wszystkie metody zadeklarowane w interfejsie KindListener. Nast�puj�cy program, pokazany na ekranie Obszar apletu, w zale�no�ci od tego czy kursor znajduje si� nad pulpitem apletu czy poza nim, wykre�la czerwony okr�g na ��tym tle albo ��ty okr�g na czerwonym tle. Ekran Obszar apletu ### inside.gif <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Master extends Applet { public void init() { // ustawienie koloru t�a apletu setBackground(Color.white); // delegowanie obiektu nas�uchuj�cego addMouseListener(new Watcher()); } class Watcher extends MouseAdapter { public void mouseEntered(MouseEvent evt) { setBackground(Color.yellow); } public void mouseExited(MouseEvent evt) { setBackground(Color.red); } } public void paint(Graphics gDC) { Color color = getBackground(); if(color.equals(Color.red)) gDC.setColor(Color.yellow); else gDC.setColor(Color.red); Dimension s = getSize(); int w = s.width, h = s.height; gDC.drawOval(0, 0, w-1, h-1); } } Obiekty zdarzeniowe Po zaj�ciu zdarzenia jest tworzony obiekt zdarzeniowy. W obiekcie zdarzeniowym jest zarejestrowany opis zdarzenia. Elementy opisu zale�� od rodzaju zdarzenia. Zdarzenie action Zdarzenie zachodzi m.in. po klikni�ciu przycisku (Button) oraz po naci�ni�ciu klawisza Enter podczas wprowadzania tekstu do klatki (TextField). Informacji o zdarzeniu dostarczaj� metody klasy ActionEvent. Object getSource() Dostarcza odno�nik do obiektu, w kt�rym zasz�o zdarzenie. public void actionPerformed(ActionEvent evt) { Object obj = evt.getSource(); if(obj == startButton) // ... else if(obj == stopButton) // ... } String getActionCommand() Dostarcza napis na przycisku albo zawarto�� klatki. public void actionPerformed(ActionEvent evt) { String str = evt.getActionCommand(); // ... } Zdarzenie mouse, mouseMotion i key Zdarzenia powstaj� po wykonaniu operacji za pomoc� myszki albo klawiatury. Informacji o zdarzeniu dostarczaj� metody klasy InputEvent oraz dodatkowo: dla zdarze� zwi�zanych z myszk� - metody klasy MouseEvent, a dla zdarze� zwi�zanych z klawiatur� - metody klasy KeyEvent. long getWhen() Dostarcza czas (w ms) jaki dzieli chwil� zaj�cia zdarzenia i pocz�tek epoki (1 stycznia 1970); boolean isMetaDown() // prawy przycisk myszki boolean isCtrlDown() // klawisz Ctrl boolean isShiftDown() // klawisz Shift boolean isAltDown() // klawisz Alt Dostarcza informacji o naci�ni�ciu klawisza (lub ich kombinacji). public void mousePressed(MouseEvent evt) { if(evt.isMetaDown() && evt.isShiftDown()) // ... } Tylko zdarzenia mouse i mouseMotion Dodatkowych informacji dostarczaj� metody klasy MouseEvent. int getX() Dostarcza wsp�rz�dn� x. int getY() Dostarcza wsp�rz�dn� y. Point getPoint() Dostarcza punkt (x,y). int getClickCount() Dostarcza licznik wielo-klikni�cia (np. dla dwu-klikni�cia licznik 2). public void mouseReleased(MouseEvent evt) { if(evt.isCtrlDown() && evt.getClickCount() == 2) // ... } Tylko zdarzenie key Dodatkowych informacji dostarczaj� metody klasy KeyEvent. Uwaga: Zdarzenie key mo�e by� obs�u�one tylko przez komponent (aplet, przycisk, klatk�), na kt�ry jest nastawiony celownik. Do nastawienia celownika na komponent, w szczeg�lno�ci na aplet, s�u�y metoda requestFocus. int getKeyCode() Dostarcza wirtualny kod klawisza. W metodzie keyTyped dostarcza VK_UNDEFINED. char getKeyChar() Dostarcza znak Unikodu. Je�li w Unikodzie nie ma takiego znaku, to dostarcza VK_UNDEFINED. Uwaga: Nazwy symboliczne klawiszy (np. VK_UNDEFINED, VK_SPACE) zdefiniowano w klasie KeyEvent. public void keyReleased(KeyEvent evt) { int keyCode = evt.getKeyCode(); if(keyCode == KeyEvent.VK_F1) // ... } Obs�ugiwanie myszki Nast�puj�cy program, pokazany na ekranie Wykre�lanie k�, ilustruje obs�ug� zdarze� przez obiekty klasy wewn�trznej, zewn�trznej, anonimowej i apletowej. Ekran Wykre�lanie k� ### triplet.gif Obs�uga w klasie wewn�trznej <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Master extends Applet { private int r = 30, d = 2*r; private Graphics gDC; // odno�nik do wykre�lacza public void init() { // utworzenie wykre�lacza gDC = getGraphics(); // utworzenie obiektu nas�uchuj�cego Watcher mouseWatcher = new Watcher(); // oddelegowanie obiektu nas�uchuj�cego // do obs�u�enia zdarzenia mouse addMouseListener(mouseWatcher); } // klasa obiekt�w nas�uchuj�cych class Watcher extends MouseAdapter { // metoda do obs�u�enia zdarzenia mouse public void mouseReleased(MouseEvent evt) { // pobranie wsp�rz�dnych kursora myszki int x = evt.getX(), y = evt.getY(); // wykre�lenie ko�a i okr�gu gDC.setColor(Color.red); gDC.fillOval(x-r, y-r, d, d); gDC.setColor(Color.black); gDC.drawOval(x-r, y-r, d-1, d-1); } } } Obs�uga w klasie zewn�trznej <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Master extends Applet { private int r = 30; public void init() { // utworzenie obiektu nas�uchuj�cego // dostarczenie mu wykre�lacza i promienia Watcher mouseWatcher = new Watcher(getGraphics(), r); // oddelegowanie obiektu nas�uchuj�cego // do obs�u�enia zdarzenia mouse addMouseListener(mouseWatcher); } } class Watcher extends MouseAdapter { private Graphics gDC; private int r, d; public Watcher(Graphics gDC, int r) { this.gDC = gDC; this.r = r; d = 2 * r; } public void mouseReleased(MouseEvent evt) { int x = evt.getX(), y = evt.getY(); gDC.setColor(Color.red); gDC.fillOval(x-r, y-r, d, d); gDC.setColor(Color.black); gDC.drawOval(x-r, y-r, d-1, d-1); } } Obs�uga w klasie anonimowej Klas� anonimow� jest klasa zdefiniowana bez s�owa kluczowego class i nazwy. Cia�o klasy anonimowej mo�e wyst�pi� tylko po fabrykatorze u�ytym do tworzenia obiektu new MouseAdapter() // fabrykator { // ... // cia�o } Je�li fabrykator zawiera nazw� klasy, to klasa anonimowa jest klas� pochodn� klasy wymienionej w fabrykatorze. new MouseAdapter() { // ... public void mousePressed(MouseEvent evt) { // ... } public void mouseReleased(MouseEvent evt) { // ... } } Je�li fabrykator zawiera nazw� interfejsu, to klasa anonimowa jest klas� pochodn� klasy Object i implementuje ten interfejs. new ActionListener() { // ... public void actionPerformed(ActionEvent evt) { // ... } }; <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Master extends Applet { private int r = 30, d = 2*r; private Graphics gDC; public void init() { gDC = getGraphics(); addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent evt) { int x = evt.getX(), y = evt.getY(); gDC.setColor(Color.red); gDC.fillOval(x-r, y-r, d, d); gDC.setColor(Color.black); gDC.drawOval(x-r, y-r, d-1, d-1); } } ); } } Obs�uga w klasie apletowej Poniewa� nie istnieje wielodziedziczenie, wi�c klasa Master, kt�ra dziedziczy klas� Applet, nie mo�e dodatkowo dziedziczy� klasy MouseAdapter. Dlatego, mimo i� u�ywa tylko metody mouseReleased, musi dostarczy� tak�e pozosta�e metody implementowanego przez ni� interfejsu MouseListener. <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Master extends Applet implements MouseListener { private int r = 30, d = 2*r; private Graphics gDC; public void init() { gDC = getGraphics(); addMouseListener(this); } public void mouseReleased(MouseEvent evt) { int x = evt.getX(), y = evt.getY(); gDC.setColor(Color.red); gDC.fillOval(x-r, y-r, d, d); gDC.setColor(Color.black); gDC.drawOval(x-r, y-r, d-1, d-1); } // wymagane, chocia� nie u�yte public void mousePressed(MouseEvent evt) { } public void mouseClicked(MouseEvent evt) { } public void mouseEntered(MouseEvent evt) { } public void mouseExited(MouseEvent evt) { } } Obs�ugiwanie klawiatury Nast�puj�cy program, pokazany na ekranie Wprowadzanie znak�w, wykre�la znaki wprowadzone z klawiatury. Znaki s� odbierane przez aplet. Je�li wprowadzony znak nie nale�y do Unikodu, ale nie jest znakiem Shift, to rozlega si� sygna� d�wi�kowy. Uwaga: Wywo�anie metody requestFocus nastawia celownik na aplet. Bez tego celownik jest ustawiony na okno przegl�darki i aplet nie reaguje na operacje klawiaturowe. Ekran Wprowadzanie znak�w ### enterkey.gif <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Master extends Applet { private Font font = new Font("Serif", Font.BOLD, 80); private char key = '!'; private String press = "..."; public void init() { addKeyListener( new KeyAdapter() { public void keyReleased(KeyEvent evt) { char keyChar = evt.getKeyChar(); int keyCode = evt.getKeyCode(); if(keyCode == KeyEvent.VK_SHIFT) return; if(keyChar == KeyEvent.CHAR_UNDEFINED) { // np. F1, Home, End, PgUp // ale nie: Tab, Enter, Del // bo nale�� do Unikodu Toolkit.getDefaultToolkit().beep(); key = '?'; } else { if(keyCode >= KeyEvent.VK_A && keyCode <= KeyEvent.VK_Z) { key = keyChar; } else key = '?'; } repaint(); } } ); } public void start() { // nastawienie celownika na aplet requestFocus(); } public void paint(Graphics gDC) { if(press.equals("...")) press = "Press a key!"; else gDC.setFont(font); gDC.drawString(press + key, 50, 100); press = ""; } } Odtwarzanie pulpitu Jednym z najwa�niejszych wymaga� stawianych klasie apletowej jest odtwarzanie pulpitu apletu. Konieczno�� odtworzenia pulpitu zachodzi w�wczas, gdy zas�oni�ty na chwil� pulpit zostanie ods�oni�ty. Bezpo�rednio po tym, przegl�darka wyczy�ci pulpit kolorem t�a apletu i na rzecz podobiektu klasy Applet wywo�a metod� paint. Je�li metoda paint jest napisana w�a�ciwie, to zmniejszenie okna programu do ikony (ikonizacja), a nast�pnie przywr�cenie okna (dezikonizacja), nie b�dzie mia�o wp�ywu na oblicze programu. Uwaga: Niejawne wywo�anie metody paint ma miejsce tak�e na skutek wywo�ania metody repaint. Po zako�czeniu wykonywania funkcji, z kt�rej wywo�ano repaint jest wywo�ywana metoda update. Domy�lna metoda update czy�ci pulpit apletu i wywo�uje metod� paint. Je�li dostarczy si� w�asn� metod� update, z kt�rej nie wywo�a si� metody domy�lnej, to nale�y pami�ta� o wyczyszczeniu pulpitu apletu. Nast�puj�cy program, pokazany na ekranie Odtwarzanie pulpitu, ilustruje, jak wywo�a� domy�ln� metod� update. Jak si� mo�na przekona�, sygna� d�wi�kowy rozlega si� tylko po zwolnieniu klawisza klawiatury. Ekran Odtwarzanie pulpitu ### restore.gif <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Master extends Applet { public void init() { addKeyListener( new KeyAdapter() { public void keyPressed(KeyEvent evt) { getGraphics(). drawString("KeyPressed", 20, 20); } public void keyReleased(KeyEvent evt) { repaint(); } } ); } public void start() { requestFocus(); } public void update(Graphics gDC) { Toolkit.getDefaultToolkit().beep(); super.update(gDC); // domy�lna metoda update } public void paint(Graphics gDC) { gDC.drawString("Hello World", 100, 50); } } Prosta baza danych Nast�puj�cy program umo�liwia wykre�lenie i odtworzenie nie wi�cej ni� Limit k� o promieniu 30 pikseli. W celu umo�liwienia odtwarzania pulpitu, zdefiniowano w�asn� baz� danych, na kt�r� sk�adaj� si�: licznik k� i tablice wsp�rz�dnych ich �rodk�w. <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Master extends Applet { final int Limit = 100; private int r = 30, d = 2*r; private Graphics gDC; // prosta baza danych private int[] xCen = new int [Limit], yCen = new int [Limit]; private int n = 0; // liczba k� public void init() { gDC = getGraphics(); addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent evt) { if(n == Limit) { Toolkit.getDefaultToolkit().beep(); return; } int x = evt.getX(), y = evt.getY(); draw(gDC, x, y); xCen[n] = x; yCen[n++] = y; } } ); } private void draw(Graphics gDC, int x, int y) { gDC.setColor(Color.red); gDC.fillOval(x-r, y-r, d, d); gDC.setColor(Color.black); gDC.drawOval(x-r, y-r, d-1, d-1); } public void paint(Graphics gDC) { // odtworzenie pulpitu z bazy for(int i = 0; i < n ; i++) draw(gDC, xCen[i], yCen[i]); } } Ulepszona baza danych Przytoczone uprzednio rozwi�zanie ogranicza liczb� wykre�lanych k�. Mo�na je ulepszy�, stosuj�c dynamiczne zarz�dzanie pami�ci�. Dzi�ki niemu liczba wykre�lanych k� nie jest ograniczona. Uwaga: Po wype�nieniu tablicy o pocz�tkowej rezerwacji (np. 2), tworzy si� tablic� o podwojonej pojemno�ci (4, 8, 16, itd) i kopiuje zawarto�� starej do nowej. Usuni�cie starej tablicy jest w ramach odzyskiwania nieu�ytk�w, automatycznie wykonywane przez System. <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Master extends Applet { private int r = 30, d = 2*r; private Graphics gDC; // baza danych private int s = 2, // rozmiar tablicy n = 0; // liczba k� private Point[] pCen = new Point [s]; public void init() { gDC = getGraphics(); addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent evt) { // je�li zabraknie miejsca if(n == s) { s *= 2; Point[] p2 = new Point [s]; // szybkie kopiowanie System.arraycopy(pCen, 0, p2, 0, n); pCen = p2; } int x = evt.getX(), y = evt.getY(); draw(gDC, pCen[n++] = new Point(x, y)); } } ); } private void draw(Graphics gDC, Point p) { int x = p.x, y = p.y; gDC.setColor(Color.red); gDC.fillOval(x-r, y-r, d, d); gDC.setColor(Color.black); gDC.drawOval(x-r, y-r, d-1, d-1); } public void paint(Graphics gDC) { for(int i = 0; i < n ; i++) draw(gDC, pCen[i]); } } U�ycie klasy Vector Jeszcze lepszym rozwi�zaniem jest u�ycie predefiniowanej klasy Vector, wchodz�cej w sk�ad pakietu java.util. <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.util.Vector; public class Master extends Applet { private Graphics gDC; // baza danych private Vector dataBase = new Vector(); public void init() { gDC = getGraphics(); addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent evt) { int x = evt.getX(), y = evt.getY(); Circle circle = new Circle(x, y); circle.draw(gDC); dataBase.addElement(circle); } } ); } public void paint(Graphics gDC) { int n = dataBase.size(); for(int i = 0; i < n ; i++) { Object object = dataBase.elementAt(i); Circle circle = (Circle)object; circle.draw(gDC); } } } class Circle { private int r = 30, d = 2*r, x, y; public Circle(int x, int y) { this.x = x; this.y = y; } public void draw(Graphics gDC) { gDC.setColor(Color.red); gDC.fillOval(x-r, y-r, d, d); gDC.setColor(Color.black); gDC.drawOval(x-r, y-r, d-1, d-1); } } Dobieranie kolor�w Kolory s� reprezentowane przez obiekty klasy Color. Dowolny 24-bitowy kolor opisuj� jego sk�adowe:�R�(red), G�(green), B�(blue). Ka�da ze sk�adowych jest liczb� z domkni�tego przedzia�u 0..255. W szczeg�lno�ci obiekty new�Color(255,0,0) oraz new�Color(255<<16) reprezentuj� kolor czerwony, a obiekty new Color(255,255,0) oraz newColor((255<<16)+(255<<8)) reprezentuj� kolor ��ty. Nast�puj�cy program, pokazany na ekranie Kolorowe ko�a, wykre�la ko�a o kolorach przypadkowych, ale w metodzie paint odtwarza je w takich kolorach, w jakich je wykre�lono. Ekran Kolorowe ko�a ### colorcir.gif Uwaga: Do generowania liczb pseudolosowych u�yto obiektu klasy Random z pakietu java.util. Ka�de wywo�anie na jego rzecz metody nextInt dostarcza kolejn�, pseudolosow� liczb� ca�kowit�. Na podstawie tej liczby jest tworzony przypadkowy kolor. <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.util.*; public class Master extends Applet { private Vector dataBase = new Vector(); private Graphics gDC; private Random rand = new Random(); public void init() { gDC = getGraphics(); rand = new Random(); addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent evt) { int x = evt.getX(), y = evt.getY(); Color c = new Color(rand.nextInt()); Circle circle = new Circle(x, y, c); circle.draw(gDC); dataBase.addElement(circle); } } ); } public void paint(Graphics gDC) { int n = dataBase.size(); for(int i = 0; i < n ; i++) { Object object = dataBase.elementAt(i); Circle circle = (Circle)object; circle.draw(gDC); } } } class Circle { private int r = 30, d = 2*r, x, y; private Color c; public Circle(int x, int y, Color c) { this.x = x; this.y = y; this.c = c; } public void draw(Graphics gDC) { gDC.setColor(c); gDC.fillOval(x-r, y-r, d, d); gDC.setColor(Color.black); gDC.drawOval(x-r, y-r, d-1, d-1); } } Wykre�lanie napis�w Polecenie wykre�lenia napisu wydaje si� wykre�laczowi. S�u�y do tego metoda drawString. Jej argumentami s�: napis oraz wsp�rz�dne x i y lewego ko�ca domy�lnego odcinka, na kt�rym napis spoczywa. void drawString(String str, int x, int y) Wykre�lenie tekstu str spoczywaj�cego na domy�lnym, poziomym odcinku bazowym, kt�rego lewy koniec ma wsp�rz�dne (x,y). Graphics gDC = getGraphics(); gDC.drawString("HelloWorld", 20, 40); Czcionka Wykre�lenie napisu wybran� czcionk� wymaga utworzenia obiektu klasy Font. Argumentami jej konstruktora s�: kr�j (np. Serif, Sansserif, Monospaced), styl (np. Font.BOLD, Font.ITALIC) i rozmiar czcionki. Rozmiar wyra�a si� w punktach. 1 pt�= �1/72 cala. Nast�puj�cy program, pokazany na ekranie Wielkie litery, u�ywa czcionki o kroju Serif, pochylonej i pogrubionej, o rozmiarze 80 pt. Odcinek bazowy napisu Isabel znajduje si� w po�owie wysoko�ci pulpitu. Ekran Wielkie litery ### custfont.gif <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; public class Master extends Applet { private String theName = "Isabel"; private Font font; public void init() { // utworzenie czcionki int style = Font.BOLD | Font.ITALIC; font = new Font("Serif", style, 60); } public void paint(Graphics gDC) { // wyznaczenie wysoko�ci Dimension d = getSize(); int h = d.height; // wstawienie czcionki gDC.setFont(font); // wstawienie koloru gDC.setColor(Color.red); // wykre�lenie napisu gDC.drawString(theName, 10, h/2); } } Wykre�lanie obiekt�w Polecenie wykre�lenia obiektu wydaje si� wykre�laczowi. Obszerny zestaw metod umo�liwia wykre�lanie figur i obiekt�w wype�nionych. void drawLine(xA, yA, xZ, yZ) Wykre�lenie odcinka ��cz�cego punkty o wsp�rz�dnych (xA, yA) i (xZ, yZ). void drawRect(int x, int y, int w, int h) Wykre�lenie prostok�ta o wsp�rz�dnych lewego-g�rnego wierzcho�ka (x,y) i rozmiarach w�x�h pikseli (por.�uwaga). void drawOval(int x, int y, int w, int h) Wykre�lenie owalu (okr�gu albo elipsy) wpisanego w domy�lny prostok�t, o wsp�rz�dnych lewego-g�rnego wierzcho�ka (x,y) i rozmiarach w x h pikseli (por.�uwaga). void drawArc(int x, int y, int w, int h, int f, int t) Wykre�lenie �uku wpisanego w domy�lny prostok�t, o wsp�rz�dnych lewego-g�rnego wierzcho�ka (x,y) i rozmiarach w x h pikseli, od k�ta pocz�tkowego f do k�ta ko�cowego t. void drawPolygon(int x[], int y[], int n) Wykre�lenie �amanej ��cz�cej n punkt�w o wsp�rz�dnych (x[i],�y[i]). void fillRect(int x, int y, int w, int h) Wykre�lenie wype�nionego prostok�ta (por. drawRect). void fillOval(int x, int y, int w, int h) Wykre�lenie wype�nionego owalu (por. drawOval). void fillPolygon(int x[], int y[], int n) Wykre�lenie wype�nionego wielok�ta (por. drawPolygon). void clearRect(int x, int y, int w, int h) Wykre�lenie wype�nionego prostok�ta kolorem t�a. Uwaga: Wykre�laj�c prostok�t i owal (drawRect, drawOval) podaje si� wsp�rz�dne lewego-g�rnego naro�nika domy�lnego prostok�ta, w kt�ry je wpisano oraz rozmiary tego prostok�ta zmniejszone�o�1. Wykre�laj�c wype�niony prostok�t i owal (fillRect, fillOval, clearRect) podaje si� pe�ne rozmiary domy�lnego prostok�ta. Wykre�laj�c odcinek podaje si� wsp�rz�dne jego ko�c�w. Do wykre�lenia punktu u�ywa si� metody drawLine. Nast�puj�cy program, pokazany na ekranie Obiekty graficzne, wykre�la niebieski pier�cie� o �rodku w punkcie klikni�cia. Ekran Obiekty graficzne ### bluering.gif <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Master extends Applet { private final int Thick = 5, r = 50; private Graphics gDC; private int x = -1, y; public void init() { gDC = getGraphics(); addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent evt) { // wyczyszczenie poprzedniego gDC.clearRect(x-r, y-r, 2*r, 2*r); x = evt.getX(); y = evt.getY(); // wykre�lenie nast�pnego paint(gDC); } } ); } public void paint(Graphics gDC) { // je�li jeszcze nie klikni�to if(x == -1) return; for(int i = 0; i < Thick ; i++) { if(i == 0 || i == Thick-1) gDC.setColor(Color.black); else gDC.setColor(Color.blue); int d = 2*r-1 - 2*i; gDC.drawOval(x-r+i, y-r+i, d, d); } } } Kolory wykre�lacza Z ka�dym wykre�laczem jest zwi�zany kolor bie��cy. Ustawienie i pobranie koloru bie��cego odbywa si� za pomoc� metod setColor i getColor. void setColor(Color color) Ustawia kolor bie��cy na podany. Color getColor() Dostarcza kolor bie��cy. Nast�puj�cy program, pokazany na ekranie Lewy i prawy przycisk, pos�uguje si� dwoma wykre�laczami. Jeden wykre�la okr�gi w kolorze czerwonym, a drugi ko�a w kolorze zielonym. Ekran Lewy i prawy przycisk ### gdcpair.gif <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Master extends Applet { final int r = 30; private Graphics lDC, rDC; public void init() { // utworzenie wykre�laczy lDC = getGraphics(); rDC = getGraphics(); // ustawienie kolor�w lDC.setColor(Color.red); rDC.setColor(Color.green); addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent evt) { int x = evt.getX(), y = evt.getY(); // wybranie wykre�lacza boolean rightButton = evt.isMetaDown(); Graphics gDC = rightButton ? rDC : lDC; // wykre�lenie w zamierzonym kolorze if(rightButton) gDC.fillOval(x-r, y-r, 2*r, 2*r); else gDC.drawOval(x-r, y-r, 2*r-1, 2*r-1); } } ); } } Kolor apletu Z ka�dym apletem jest zwi�zany kolor t�a. Do zarz�dzania nim s�u�� metody setBackground i getBackground. void setBackground(Color color) Ustawia kolor t�a apletu. Color getBackground() Dostarcza kolor t�a apletu. Nast�puj�cy program, pokazany na ekranie Prawe-dwuklikni�cie, wykre�la aplet o zielonym kolorze t�a. p-dwu-klikni�cie pulpitu apletu zmienia kolor jego t�a na czerwony. Ekran Prawe-dwuklikni�cie ### shiftred.gif <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Master extends Applet { public void init() { // pocz�tkowy kolor t�a setBackground(Color.green); addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent evt) { int count = evt.getClickCount(); boolean isMeta = evt.isMetaDown(); // zmiana koloru t�a if(count == 2 && isMeta) setBackground(Color.red); } } ); } Tryb XOR Do takiego wykre�lenia i wytarcia obiektu, po kt�rych nie nast�puje zmiana t�a s�u�y tryb XOR. void setXORMode(Color color) Dostosowuje wykre�lacz do wykre�lania w trybie XOR z podanym kolorem. Kolor wynikowy jest tworzony z podanego koloru, koloru t�a i koloru bie��cego. Reprezentacje tych 3 kolor�w, s� sumowane pozycyjnie, modulo-2. void setPaintMode() Dostosowuje wykre�lacz do wykre�lania w trybie zwyk�ym. Nast�puj�cy program, pokazany na ekranie Zachowywanie t�a, wykre�la odcinek ��cz�cy punkt naci�ni�cia i zwolnienia przycisku myszki. Podczas przeci�gania kursora jest wykre�lany czarny odcinek pr�bny. Pogrubiony odcinek ostateczny jest wykre�lany w kolorze przypadkowym. Uwaga: Niekt�re punkty odcinka pr�bnego nie s� czarne, poniewa� wykre�lanie w trybie XOR uwzgl�dnia kolor t�a. Ekran Zachowywanie t�a ### xorline.gif <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.util.Random; public class Master extends Applet { private final int Thick = 6; private Graphics gDC; public void init() { gDC = getGraphics(); MouseWatcher watcher = new MouseWatcher(); addMouseListener(watcher); addMouseMotionListener(watcher); } class MouseWatcher extends MouseAdapter implements MouseMotionListener { private Random rand = new Random(); private int x0, y0, xOld, yOld; public void mousePressed(MouseEvent evt) { x0 = xOld = evt.getX(); y0 = yOld = evt.getY(); gDC.setColor(Color.black); gDC.setXORMode(Color.white); gDC.drawLine(x0, y0, xOld, yOld); } public void mouseDragged(MouseEvent evt) { gDC.drawLine(x0, y0, xOld, yOld); int x = evt.getX(), y = evt.getY(); gDC.drawLine(x0, y0, x, y); xOld = x; yOld = y; } public void mouseReleased(MouseEvent evt) { gDC.setPaintMode(); gDC.setColor(new Color(rand.nextInt())); drawThick(evt.getX(), evt.getY()); } public void mouseMoved(MouseEvent evt) { } public void drawThick(int x, int y) { int thick = Thick; if(Thick == 1) thick = 2; for(int i = -thick/2; i < thick/2; i++) { long sign =(x-x0) * (y-y0); if(sign > 0) gDC.drawLine(x0-i, y0+i, x-i, y+i); else if(sign < 0) gDC.drawLine(x0-i, y0-i, x-i, y-i); else if(x == x0) gDC.drawLine(x0-i, y0, x-i, y); else gDC.drawLine(x0, y0-i, x, y-i); } } } } Wykre�lanie obraz�w Obrazy s� zazwyczaj przechowywane w formacie GIF i JPG a d�wi�ki w formacie AU i WAV. Jest wiele �atwo dost�pnych program�w, kt�rych mo�na u�y� do konwersji obraz�w i d�wi�k�w zapisanych w innych formatach. W celu za�adowania obrazu nale�y u�y� obiekt�w klas URL, Image i MediaTracker. Pierwszy nale�y zainicjowa� opisem miejsca sk�d pochodzi obraz (getDocumentBase), w drugim nale�y utworzy� opis obrazu (getImage), a trzeciemu nale�y przekaza� obraz (addImage). Nast�pnie zaczeka� na za�adowanie obrazu (waitForID). Po wykonaniu tych czynno�ci, mo�na wykre�li� obraz (drawImage). Nast�puj�cy program, pokazany na ekranie Animowany obraz GIF, wykre�la obraz z pliku Spiral.gif. Plik znajduje si� w tym samym katalogu, z kt�rego pochodzi plik Index.html zawieraj�cy opis apletu. Ekran Animowany obraz GIF ### spiranim.gif Uwaga: W wywo�aniu metody drawImage podaje si� wsp�rz�dne punktu, w kt�rym zostanie umieszczony lewy-g�rny naro�nik obrazu. <applet code=Master.class width=200 height=200> </applet> =============================================== import java.applet.Applet; import java.awt.*; import java.net.*; public class Master extends Applet { private Image img; public void init() { // miejsce sk�d pochodzi obraz URL whereFrom = getDocumentBase(); // utworzenie opisu obrazu img = getImage(whereFrom, "Spiral.gif"); // utworzenie nadzorcy medi�w MediaTracker tracker = new MediaTracker(this); // przekazanie nadzorcy opisu obrazu tracker.addImage(img, 0); // zaczekanie na obraz try { tracker.waitForID(0); } catch(InterruptedException e) { } } public void paint(Graphics gDC) { // wykre�lenie obrazu gDC.drawImage(img, 0, 0, this); } } Odtwarzanie d�wi�k�w W celu odtworzenia d�wi�ku nale�y u�y� dwuparametrowej metody play. Jej pierwszym argumentem jest opis miejsca sk�d pochodzi d�wi�k (getDocumentBase), a drugim nazwa pliku d�wi�kowego z rozszerzeniem .au albo .wav. Nast�puj�cy program, pokaz