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