Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
Java 2. Techniki
zaawansowane
Autorzy: Cay S. Horstmann, Gary Cornell
Tumaczenie: Jaromir Senczyk
ISBN: 83-7197-985-1
Tytu oryginau: Core Java 2 Volume 2 Advanced Features
Format: B5, stron: 1122
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treci
Podzikowania................................................................................................................................9
Przedmowa ................................................................................................................................... 11
Do Czytelnika ........................................................................................................................ 11
O ksice............................................................................................................................... 11
Spis treci
Rozdzia 8. JavaBeans.................................................................................................................687
Dlaczego ziarnka? ............................................................................................................... 688
Proces tworzenia ziarnek JavaBeans ................................................................................... 689
Wykorzystanie ziarnek do tworzenia aplikacji....................................................................... 693
Umieszczanie ziarnek w plikach JAR .............................................................................. 694
Korzystanie z ziarnek ..................................................................................................... 696
Spis treci
Rozdzia 9. Bezpieczestwo.........................................................................................................783
adowanie klas.................................................................................................................... 784
Implementacja wasnej procedury adujcej................................................................... 787
Weryfikacja kodu maszyny wirtualnej................................................................................... 794
Menedery bezpieczestwa i pozwolenia............................................................................. 799
Bezpieczestwo na platformie Java 2 ............................................................................ 801
Pliki polityki bezpieczestwa.......................................................................................... 806
Tworzenie wasnych klas pozwole ................................................................................ 813
Implementacja klasy pozwole ...................................................................................... 814
Tworzenie wasnych menederw bezpieczestwa......................................................... 820
Uwierzytelnianie uytkownikw....................................................................................... 828
Podpis cyfrowy..................................................................................................................... 834
Skrty wiadomoci......................................................................................................... 834
Podpisywanie wiadomoci ............................................................................................. 840
Uwierzytelnianie wiadomoci ......................................................................................... 847
Certyfikaty X.509 ........................................................................................................... 849
Tworzenie certyfikatw................................................................................................... 851
Podpisywanie certyfikatw ............................................................................................. 854
Podpisywanie kodu.............................................................................................................. 861
Podpisywanie plikw JAR ............................................................................................... 862
Wskazwki dotyczce wdroenia.................................................................................... 866
Certyfikaty twrcw oprogramowania ............................................................................. 867
Szyfrowanie ......................................................................................................................... 868
Szyfrowanie symetryczne ............................................................................................... 869
Szyfrowanie kluczem publicznym ................................................................................... 875
Strumienie szyfrujce .................................................................................................... 880
Skorowidz.................................................................................................................................1073
Zaawansowane moliwoci
pakietu Swing
W tym rozdziale:
n
Listy.
Drzewa.
Tabele.
Organizatory komponentw.
Listy
Prezentujc uytkownikowi zbir elementw do wyboru, moemy skorzysta z rnych komponentw. Jeli zbir ten zawiera bdzie wiele elementw, to ich przedstawienie za pomoc
pl wyboru zajmie zdecydowanie za duo miejsca w oknie programu. Skorzystamy wtedy
zwykle z listy bd listy rozwijalnej. Listy rozwijalne s stosunkowo prostymi komponentami
i dlatego omwilimy je ju w ksice Java 2. Podstawy. Natomiast listy reprezentowane
przez komponent posiadaj duo wiksze moliwoci, a sposb ich uycia przypomina
korzystanie z innych zoonych komponentw, takich jak drzewa czy tabele. Dlatego wanie
od list rozpoczniemy omwienie zoonych komponentw pakietu Swing.
378
Komponent JList
Zastosowanie komponentu przypomina uycie zbioru komponentw, takich jak przyciski lub pola wyboru. Rnica polega na tym, e elementy listy umieszczone s we wsplnej ramce, a wyboru dokonuje si, wskazujc dany element, a nie zwizane z nim pole bd
przycisk. Uytkownik moe te wybra wiele elementw listy, jeli pozwolimy na to.
Rysunek 6.1 pokazuje najprostszy przykad listy. Uytkownik moe z niej wybra atrybuty
opisujce lisa, takie jak quick, brown, hungry i wild oraz, z braku innych pomysw, static, private i final.
Rysunek 6.1.
Komponent klasy JList
Tworzenie listy rozpoczynamy od skonstruowania tablicy acuchw znakw, ktr nastpnie przekazujemy konstruktorowi klasy :
!
Komponenty nie przewijaj automatycznie swojej zawartoci. W tym celu musimy
umieci list w panelu przewijalnym:
"#
"#
"#
!
Rozdzia 6.
379
$
%
& '(! )) *#+, ,+- '( ./
Domylnie uytkownik moe wybiera wiele elementw listy. Wymaga to od niego zaawansowanego posugiwania si mysz: wybierajc kolejne elementy, musi jednoczenie
wciska klawisz Ctrl. Aby wytypowa pewien cigy zakres elementw, uytkownik powinien zaznaczy pierwszy z nich a nastpnie, wciskajc klawisz Shift, wybra ostatni
z elementw.
Moliwo wyboru elementw przez uytkownika moemy ograniczy, korzystajc z metody :
0
01234544&6172!
)) .8
-9
*,+ .
0
0123451264%$:544&6172!
)) .8
-9
*,+ . *,+ +#
./
Z lektury ksiki Java 2. Podstawy przypominamy sobie z pewnoci, e podstawowe elementy interfejsu uytkownika generuj zdarzenia akcji w momencie ich aktywacji przez
uytkownika. Listy wykorzystuj jednak inny mechanizm powiadomie. Zamiast nasuchiwa zdarze akcji, w przypadku list nasuchiwa bdziemy zdarze wyboru na licie.
W tym celu musimy doda do komponentu listy obiekt nasuchujcy wyboru i zaimplementowa nastpujc metod obiektu nasuchujcego:
* ; ;#&#
4; ;!
zwraca warto , gdy wybr nie jest ostateczny. Gdy uytkownik puszcza klawisz myszy, generowane jest kolejne zdarzenie, dla ktrego wywoanie metody zwrci
tym razem warto . Jeli nie jestemy zainteresowani przejciowymi zdarzeniami na
licie, to wystarczy poczeka jedynie na zdarzenie, dla ktrego metoda zwrci
wanie warto . W przeciwnym razie musimy obsugiwa wszystkie zdarzenia.
Zwykle po zawiadomieniu o zdarzeniu bdziemy chcieli si dowiedzie, ktre elementy zostay wybrane. Metoda zwraca tablic obiektw zawierajc wybrane
elementy.
380
Nie moemy rzutowa tablicy zwrconej przez metod na
tablic . Zwracana przez metod tablica zostaa utworzona nie jako tablica
acuchw znakw, ale jako tablica obiektw, z ktrych kady jest akurat acuchem
znakw. Jeli chcemy przetwarza zwrcon tablic jako tablic acuchw znakw, to
powinnimy skorzysta z poniszego kodu:
;#
.##&* ;#
(
( !
Jeli lista nie dopuszcza wyboru wielu elementw, to moemy skorzysta z metody
Listy nie obsuguj dwukrotnych klikni mysz. Projektanci pakietu Swing zaoyli, e
na licie dokonuje si jedynie wyboru, a nastpnie zaznacza si komponent przycisku,
aby wykona jak akcj. Niektre interfejsy uytkownika posiadaj moliwo dwukrotnego kliknicia elementu listy w celu dokonania jego wyboru i wykonania na nim
pewnej akcji. Uwaamy, e nie jest to zbyt dobry styl tworzenia interfejsu uytkownika,
poniewa wymaga, by uytkownik samodzielnie odkry moliwo takiego jego dziaania. Jeli jednak z pewnych powodw chcemy skorzysta z moliwoci implementacji
takiego zachowania listy, to musimy doda do niej obiekt nasuchujcy mysz i obsugiwa zdarzenia myszy w nastpujcy sposb:
* ; .
& 0
4; ;!
< ;&& ! ?!
!; !
7,
$#
!
:
!
Listing 6.1 zawiera tekst rdowy programu demonstrujcego wykorzystanie listy wypenionej acuchami znakw. Zwrmy uwag na sposb, w jaki metoda
tworzy acuch komunikatu z wybranych elementw listy.
Listing 6.1. ListTest.java
.* ,#;##
@
.* ,#;##
;@
.* ,#;#A
@
.* ,#;#A
;@
)@@
"#. .
,B
+
#
+#
#,B, C#D +#/
@)
* #
6
Rozdzia 6.
*
# ; .# #
!
E#. <#.
E#. !
<#.
F<#&
7*# E#.4G165725&74!
<#.
!
)@@
%#.# +#
#,B#
H
C/
H *#+,BB +#
+C8 +
#
C/
"++.,B #
+ &
#9 .8#
C/
# #
+ < *+
## #
/ #C +#
C/
@)
#
E#. A
E#.
*
E#. !
6
6
!
+ I1F6J J413J6!
*;##
#
#<#
!
"#
"#
"#
!
"# *
"# !
*#
"#!
#
381
382
n !"#!tworzy
n !
!#!okrela
lub warto .
n !
'!#! metoda
wywoywana za kadym
Modele list
W poprzednim podrozdziale pokazalimy najczciej spotykany sposb wykorzystania list
polegajcy na:
n
Rozdzia 6.
383
W naszym pierwszym przykadzie utworzylimy list zawierajc okrelony zbir acuchw znakw. Czsto jednak zachodzi potrzeba dodawania nowych elementw listy bd
usuwania elementw ju umieszczonych na licie. Zaskakujcy moe wyda si fakt, e
klasa nie zawiera metod umoliwiajcych takie operacje na licie. Aby zrozumie tego przyczyn, musimy zapozna si bliej z wewntrzn architektur komponentu listy.
Podobnie jak w przypadku komponentw tekstowych take i lista jest przykadem zastosowania wzorca model-widok-nadzorca w celu oddzielenia wizualizacji listy (czyli kolumny
elementw wywietlonych w pewien sposb) od danych (kolekcji obiektw).
Klasa odpowiedzialna jest jedynie za wizualizacj danych i niewiele wie na temat ich
reprezentacji. Potrafi jedynie pobra dane, korzystajc z obiektu implementujcego interfejs
:
* <#
0
* + !
* 7, 4.: !
* ; #
F##
F##
!
* ; .;
F##
F##
!
Wykorzystujc ten interfejs, komponent klasy moe okreli liczb elementw i pobra kady z nich. Moe take doda si jako obiekt nasuchujcy danych. Dziki temu bdzie powiadamiany o kadej zmianie w kolekcji elementw i bdzie mg aktualizowa reprezentacj list na ekranie.
Jaki jest cel takiego rozwizania? Dlaczego komponent nie przechowuje po prostu
swoich elementw za pomoc wektora?
Zwrmy uwag, e interfejs nie okrela sposobu przechowywania obiektw. W szczeglnoci nie wymaga on nawet, by obiekty byy przechowywane! Metoda ' " moe
wyznacza warto elementu od nowa, za kadym razem gdy jest wywoywana. Moe okaza si to przydatne, jeli lista prezentowa ma bardzo liczn kolekcj danych, ktrych nie
chcemy przechowywa.
A oto najprostszy przykad: lista umoliwia bdzie uytkownikowi wybr spord wszystkich moliwych kombinacji trzech liter (patrz rysunek 6.2).
Rysunek 6.2.
Wybr z listy
zawierajcej du
liczb elementw
384
Wyznaczenie n-tego acucha jest troch skomplikowane szczegy znajdziemy w tekcie programu umieszczonym w listingu 6.2.
Po utworzeniu modelu listy atwo wykreowa tak list, ktra pozwoli uytkownikowi na
przegldanie wartoci dostarczanych przez model:
I
0 N!!
Zalet programu jest to, e prezentowane na licie acuchy nie s nigdzie przechowywane.
Generowane s jedynie elementy listy widoczne w danym momencie dla uytkownika.
Musimy jeszcze dostarczy do listy informacj, e kady z jej elementw posiada sta szeroko i wysoko.
W przeciwnym razie lista bdzie wyznacza te wartoci dla kadego elementu, co bdzie
zbyt czasochonne.
W praktyce listy zawierajce tak du liczb elementw s rzadko przydatne, poniewa
przegldanie ich jest kopotliwe dla uytkownika. Dlatego te uwaamy, e projektanci list
pakietu Swing przesadzili nieco z ich uniwersalnoci. Liczba elementw, ktre uytkownik moe wygodnie przeglda na ekranie, jest tak maa, e mogyby one by przechowywane po prostu wewntrz komponentu listy. Oszczdzioby to programistom tworzenia
modeli list. Z drugiej jednak strony zastosowane rozwizanie sprawia, e sposb wykorzystania komponentu jest spjny ze sposobami uywania komponentw ) i ) ,
w przypadku ktrych taka uniwersalno okazuje si przydatna.
Rozdzia 6.
385
386
Rozdzia 6.
387
n ! #!tworzy
n !- #!zwraca
element modelu.
Wstawianie i usuwanie
Kolekcji elementw listy nie moemy modyfikowa bezporednio. Operacje te moemy
wykonywa jedynie za porednictwem modelu. Zamy, e chcemy umieci na licie kolejne elementy. Najpierw pobierzemy referencj odpowiedniego modelu:
0 .
0 !
Jednak interfejs nie zawiera metod umoliwiajcych wstawianie i usuwanie elementw, poniewa nie wymaga on przechowywania elementw listy.
Sprbujmy wic inaczej. Jeden z konstruktorw klasy korzysta z wektora obiektw:
$ ;#
$ !
;#
#4. !
;#
#4.
!
;#
!
Elementy wektora moemy nastpnie usuwa lub dodawa, ale oczywicie lista nie zarejestruje tych operacji i wobec tego nie bdzie odzwierciedla zmian w zbiorze elementw.
Nie istnieje konstruktor klasy , ktry posiadaby parametr klasy 2. Jednak ju konstrukcja komponentu listy z wykorzystaniem wektora jest rzadko przydatna
i wobec tego brak ten nie stanowi istotnego ograniczenia.
Rozwizanie polega na utworzeniu modelu klasy 3 , wypenieniu go pocztkowymi elementami i zwizaniu z list.
F<#
0 .
F<#
0 !
.#4.!
.#4.
!
.!
388
Jak atwo zauway, klasa 3 stosuje nazwy metod odmienne ni klasy kolekcji.
Zastosowany model listy wykorzystuje wektor do przechowania danych. Model ten dziedziczy mechanizm powiadamiania listy z klasy , podobnie jak nasza klasa w poprzednim podrozdziale.
Dostpne s konstruktory klasy tworzce list w oparciu o tablic lub wektor
obiektw. Wydawa si moe, e wykorzystuj one model 3 w celu
przechowania elementw listy. Nie jest to prawd. Konstruktory te korzystaj z uproszczonego modelu, ktry umoliwia jedynie dostp do elementw, ale nie posiada mechanizmu powiadamiania o zmianach. Poniej prezentujemy kod konstruktora klasy
tworzcego list na podstawie wektora:
*
<# $
F##!
:
#
0 !
* + !
F##
+ !
* 7, 4.: !
F##.: !
!
n ! #!pobiera
model listy.
n !' " !#!umieszcza
Rozdzia 6.
389
Jeli licie dostarczymy taki obiekt, to jego metoda wywoywana bdzie dla kadego elementu listy, aby:
n
ustali jego wymiary (w przypadku gdy nie wybralimy listy o staych wymiarach
komrek),
narysowa go.
Obiekt ten musi tworzy i zwraca obiekt typu
"4, ktrego metody ,
- oraz 4
"4 wykonaj odpowiednie operacje wymagane dla prezentacji elementw listy.
Najprostszym sposobem spenienia tego wymagania jest wykorzystanie klasy wewntrznej
dysponujcej tymi metodami:
#
0&% .*.
&%
* &.*
&%&.* <#
<# 7, ;# <# A
<# #
<# # J#
E
!
"# !
* ; *#&.* 3#*
!
))
,B .
* F.
"<+ !
))
+#+#,B +.#
390
Rysunek 6.3.
Lista o komrkach
rysowanych przez
program
Rozdzia 6.
391
Zwrmy uwag, e w tym przypadku nie implementujemy wcale metod 4
"4
oraz ,-. Implementacje tych metod posiada bowiem klasa . Nasze
zadanie polega jedynie na skonfigurowaniu tekstu, czcionki i koloru etykiety klasy
zgodnie z naszymi wymaganiami.
Klasa .
moe by nawet klas pochodn klasy i sama konfigurowa swoje parametry w wywoaniu metody
"4, a nastpnie
zwraca warto :
#
E&% A
# .*.
&%
* &.*
&%&.*
7, ;# A #
# J#
E
!
E < E!;#
6A <E#. !!
E <!
7*# !
K#
U
K# !
V
K# !!
E
U
E !
V
E !!
Kod taki stanowi wygodny skrt w sytuacjach, w ktrych istnieje komponent ( w naszym przypadku) o funkcjonalnoci wystarczajcej do narysowania zawartoci komrki listy.
Listing 6.3. ListRenderingTest.java
.* ,#;#@
.* ,#;##
@
.* ,#;##
;@
.* ,#;#A
@
.* ,#;#A
;@
)@@
"#. .
,B
+
# /
392
Rozdzia 6.
393
"# !
* ; *#&.* 3#*
!
E < E!;#
A <E#. !
E0
<. E0
<!
&
U
K# !
V
K# !!
<% ( ( I ! J !!
&
U
E !
V
E !!
E <!
#
A ( <.:
!!
* F.
"<+ !
E < E!;#
A <E#. !
3#*
3#*
!
E0
<. E0
<!
F.
<.
I A!
<.J !!
n
!67 #!zwraca
wybrana.
n !
!
#!instaluje
obiekt
n
"4!
"4 ! *!!"*!!/*
rysuje zawarto komrek. Jeli komrki listy nie posiadaj staych rozmiarw,
to komponent ten musi take implementowa metod ,-.
394
"
rysowany element,
/
.
Drzewa
Kady uytkownik komputera, ktrego system operacyjny posiada hierarchicznie zbudowany system plikw, spotka si w praktyce z jego reprezentacj za pomoc drzewa, tak
jak na przykad na rysunku 6.4. Katalogi i pliki tworz tylko jedn z wielu moliwych
struktur drzewiastych. Programici stosuj drzewa rwnie do opisu hierarchii dziedziczenia klas. Take w yciu codziennym czsto spotykamy struktury drzewiaste, takie jak hierarchie administracyjne pastw, stanw, miast itd. (patrz rysunek 6.5).
Rysunek 6.4.
Drzewo katalogw
Rozdzia 6.
395
Rysunek 6.5.
Hierarchia pastw,
stanw i miast
Najprostsze drzewa
Pierwszy przykadowy program wywietla bdzie drzewo o kilku wzach (patrz rysunek
6.8). Podobnie jak inne komponenty biblioteki Swing, take i klasa ) jest przykadem
zastosowania wzorca model-widok-nadzorca. W praktyce oznacza to, e komponentowi
interfejsu uytkownika musimy dostarczy model danych. W przypadku klasy ) bdzie
to parametr konstruktora:
60 .
6
6 .!
396
Model drzewa tworzymy, definiujc klas implementujc interfejs ) . Z moliwoci tej skorzystamy w dalszej czci rozdziau, a na pocztku uyjemy klasy 3 )
dostarczanej przez bibliotek Swing.
Kreujc model tej klasy, musimy dostarczy mu korze.
62
F<#60 .
F<#60 !
)% jest kolejnym z interfejsw zwizanych z drzewami. Drzewo powstaje z wzw dowolnych klas implementujcych interfejs )%. Na razie wykorzystamy w tym celu konkretn klas 3 )% udostpnian przez bibliotek Swing. Klasa ta implementuje interfejs )% bdcy specjalizacj interfejsu )% (patrz rysunek 6.7).
Rysunek 6.7.
Zalenoci pomidzy
klasami drzewa
Wze klasy 3 )% przechowuje obiekt zwany obiektem uytkownika.
Drzewo rysuje reprezentacj obiektw uytkownika dla wszystkich wzw. Dopki nie
zostanie zainstalowany specjalizowany obiekt rysujcy wzy, to drzewo wywietla po prostu acuch znakw bdcy wynikiem wywoania metody .
Nasz pierwszy przykad wykorzystywa bdzie acuchy znakw jako obiekty uytkownika. W praktyce drzewo tworz zwykle bardziej zoone obiekty, na przykad drzewo reprezentujce system plikw skada si moe z obiektw klasy . .
Obiekt uytkownika moemy przekaza jako parametr konstruktora wza bd pniej za
pomoc metody +.
F<#0#62
F<#0#62 6A#
!
L
7, &#<# !
Rozdzia 6.
397
Po skonstruowaniu i poczeniu wszystkich wzw moemy utworzy model drzewa, przekazujc mu korze, a nastpnie wykorzysta model do opracowania komponentu ).
F<#60 0
F<#60 !
6
6 0!
Moemy nawet przekaza korze bezporednio konstruktorowi klasy ), ktry w takim
przypadku sam utworzy model drzewa:
6
6 !
398
Rozdzia 6.
399
Rysunek 6.9.
Pocztkowy
wygld drzewa
Rysunek 6.10.
Zwinite i rozwinite
poddrzewa
Do wersji SDK 1.3 wcznie linie czce wzy drzewa domylnie nie byy rysowane
(patrz rysunek 6.12). Poczwszy od SKD 1.4, rysowane s domylnie.
Rysunek 6.12.
Drzewo bez linii
czcych wzy
400
Istnieje take styl linii 1- pokazany na rysunku 6.13. Poziome linie oddzielaj wtedy
wzy podrzdne korzenia. Nie jestemy przekonani o celowoci takiego rozwizania.
Rysunek 6.13.
Drzewo
wykorzystujce styl
linii Horizontal
Domylnie korze drzewa nie posiada uchwytu, ktry umoliwiaby zwinicie caego drzewa.
Moemy go doda nastpujco:
%J#
!
Rysunek 6.14 pokazuje rezultat. Moemy teraz zwin cae drzewo do korzenia.
Rysunek 6.14.
Drzewo posiadajce
uchwyt korzenia
Moemy take w ogle usun reprezentacj korzenia drzewa, uzyskujc w ten sposb las
drzew, z ktrych kade posiada wasny korze. Tworzc taki las, nadal musimy jednak poczy wszystkie drzewa wsplnym korzeniem, ktry nastpnie ukrywamy, wywoujc
%$
<#
!
Efekt przedstawia rysunek 6.15. Wystpuj na nim dwa korzenie oznaczone USA i Germany. W rzeczywistoci s to wzy posiadajce wsplny, ukryty korze.
Rysunek 6.15.
Las
Zajmijmy si teraz limi drzewa. Zwrmy uwag, e ikony lici rni si od ikon pozostaych wzw drzewa (patrz rysunek 6.16).
Rozdzia 6.
401
Rysunek 6.16.
Ikony lici
Kady wze drzewa reprezentowany jest za pomoc pewnej ikony. Wyrni mona trzy
rodzaje takich ikon: ikona licia, ikona wza, ktrego poddrzewo jest rozwinite i ikona
wza, ktrego poddrzewo jest zwinite. Dla uproszczenia dwa ostatnie rodzaje ikon bdziemy nazywa wsplnie ikonami folderu.
Obiekt rysujcy wzy drzewa musi otrzyma informacj, jakiej ikony powinien uy dla danego wza. Domylny proces decyzyjny przebiega nastpujco: jeli metoda zwraca
warto , to rysowana jest ikona licia. W przeciwnym razie uywana jest ikona folderu.
Metoda klasy 3 )% zwraca warto dla kadego wza, ktry nie posiada wzw podrzdnych. W ten sposb wzy posiadajce wzy podrzdne
otrzymuj ikon folderu, a pozostae wzy ikon licia.
Czasami rozwizanie takie nie jest jednak waciwe. Zamy, e do naszego drzewa dodalimy wze reprezentujcy stan Montana i dopiero zastanawiamy si, jakie miasta powinnimy umieci jako jego wzy podrzdne. Nie chcemy przy tym, aby wze reprezentujcy stan posiada ikon licia, poniewa koncepcyjnie przysuguje ona tylko miastom.
Klasa ) nie wie, ktre wzy powinny by limi. Decyduje o tym model drzewa. Jeli
wze, ktry nie posiada wzw podrzdnych, nie jest liciem z punktu widzenia koncepcji
drzewa, to model drzewa moe zastosowa inne kryterium rozpoznawania lici. Polega ono
na wykorzystaniu waciwoci wza zezwalajcej na posiadanie wzw podrzdnych.
Dla wzw, ktre nie bd posiada wzw podrzdnych, naley wtedy wywoa:
:
& <#
!
oraz poinformowa model drzewa, by, decydujc czy danym wze jest liciem, sprawdza,
czy moe on posiada wzy podrzdne. W tym celu wywoujemy metod 7
klasy 3 ) :
.
:
:
& !
Od tego momentu wzy, ktre mog posiada wzy podrzdne, otrzymuj ikon folderu,
a pozostae ikon licia.
Takie kryterium doboru ikony moemy take uzyska, tworzc obiekt klasy ) za pomoc odpowiedniego konstruktora:
6
6 !
))
H+C / .B *
##9
H+C/
*+H +.#,B H -#
402
n ) ) !" #!tworzy
n !
1 !#,!jeli
n !
!#,
n ! #!zwraca
na poziomie koncepcji.
n !
#!zwraca
n !+ !#!okrela
wza.
n ! !#!zwraca
n !7
!#,!jeli
n 3 )% !#!tworzy
Rozdzia 6.
403
n !4
,42 !72*!! #!dodaje
par 725
do niewielkiej tablicy, ktr zarzdza kady komponent. Mechanizm ten jest
stosowany przez niektre komponenty Swing w celu przechowywania
specyficznych waciwoci zwizanych z wygldem komponentu.
Aby zaimplementowa takie zachowanie, musimy uzyska informacj o tym, ktry z wzw drzewa jest aktualnie wybrany. Klasa ) zaskoczy nas z pewnoci sposobem
identyfikacji wzw w drzewie. Wykorzystuje ona cieki do obiektw nazywane ciekami drzewa. cieka taka zaczyna si zawsze od korzenia i zawiera sekwencje wzw podrzdnych (patrz rysunek 6.18).
Rysunek 6.18.
cieka drzewa
Zastanawia moe, w jakim celu klasa ) potrzebuje caej cieki. Czy nie wystarczyby
jej obiekt klasy )% i moliwo wywoania metody ,? Okazuje si, e klasa
) nie ma pojcia o istnieniu interfejsu )%. Nie jest on wykorzystywany przez interfejs ) , a dopiero przez implementujc go klas 3 ) . Moemy
tworzy te inne modele drzewa, ktre nie bd wykorzystywa interfejsu )%. Wic
404
Poniewa potrzeba taka pojawia si bardzo czsto, to udostpniono dodatkow metod, ktra natychmiast zwraca wybrany wze drzewa.
F<#0#62
2 F<#0#62!
#
"#&.* !
Metody tej nie nazwano %, poniewa drzewo nie operuje na wzach, a jedynie na ciekach.
cieki s jedn z dwu metod wykorzystywanych przez klas ) do opisu wzw.
Istnieje kilka metod klasy ), ktre wykorzystuj lub zwracaj warto indeksu
okrelajc pozycj wiersza. Jest to po prostu numer wiersza (numeracja rozpoczyna
si od 0), w ktrym znajduje si dany wze. Numerowane s jedynie wzy widoczne
w danym momencie i w zwizku z tym numer wiersza danego wza ulega zmianie podczas operacji, takich jak wstawianie, zwijanie i rozwijanie, wykonywanych dla wzw poprzedzajcych dany wze w drzewie. Dlatego te naley unika korzystania z numerw
wzw. Wszystkie metody klasy ) uywajce numerw wzw posiadaj odpowiedniki posugujce si ciekami.
Po uzyskaniu wybranego wza moemy doda do niego wzy podrzdne, ale nie w poniszy sposb:
2#
2! )) 214Y
Zmieniajc struktur wza, dokonujemy zmiany jedynie modelu, ale jego widok nie uzyskuje o tym informacji. Moemy sami wysa odpowiednie zawiadomienie, ale jeli skorzystamy z metody %$ klasy 3 ) , to zrobi to za nas automatycznie model drzewa. Na przykad ponisze wywoanie doda nowy wze jako ostatni wze
podrzdny wybranego wza i powiadomi o tym widok drzewa:
.
21
2
2
2&& !!
Natomiast metoda "%.", usunie wze i powiadomi widok drzewa:
..;2E."#
2!
Rozdzia 6.
405
Jeli struktura drzewa pozostaje zachowana, a zmieni si jedynie obiekt uytkownika, wystarczy wywoa:
.&# #2!
Automatyczne powiadamianie widoku drzewa jest gwna zalet korzystania z klasy 3
) . Jeli utworzymy wasny model drzewa, to sami musimy zawiadamia jego
widok o zmianach. (Patrz Core Java Foundation Classes autorstwa Kim Topley).
Klasa 3 ) posiada metod , ktra powoduje przeadowanie modelu. Nie naley jednak z niej korzysta w celu aktualizacji widoku drzewa po kadej
przeprowadzonej zmianie modelu. Przeadowanie modelu powoduje, e zwijane s
wszystkie wzy drzewa z wyjtkiem wzw podrzdnych korzenia. Uytkownik bdzie
wic zmuszony rozwija drzewo po kadej wprowadzonej zmianie.
Gdy widok drzewa jest zawiadamiany o zmianie w strukturze wzw, to aktualizuje odpowiednio reprezentacj graficzn drzewa. Nie rozwija jednak przy tym automatycznie wzw,
jeli nowe wzy zostay dodane jako wzy podrzdne do zwinitego wza. Szczeglnie jeli
uytkownik doda nowy wze do wza, ktry jest zwinity, to nie wywoa adnej zmiany
w biecej prezentacji drzewa. Uytkownik nie bdzie wic wiedzie, czy nowy wze zosta
faktycznie dodany, dopki sam nie rozwinie odpowiedniego poddrzewa. W takim przypadku
program powinien postara o rozwinicie odpowiednich wzw, tak by widoczny by nowo
dodany wze. W tym celu wykorzysta mona metod "7 klasy ). Jej parametrem jest cieka prowadzca do wza, ktry powinien by widoczny.
Musimy wic skonstruowa ciek prowadzc od korzenia do nowego wza. Wywoamy
w tym celu metod ,)
klasy 3 ) , ktra zwrci tablic )%
wszystkich wzw cieki od danego wza do korzenia. Tablic t przekaemy jako parametr konstruktora klasy ),.
Poniej demonstrujemy przykadowy kod rozwijajcy ciek do nowego wza.
62
."#6%
2!
6"# *#
6"#
!
.#$
*#!
Ciekawe, e klasa 3 ) ignoruje zupenie istnienie klasy ),, mimo
e musi komunikowa si z klas ). Klasa ) wykorzystuje cieki, ale nigdy
nie uywa tablic wzw.
Zamy teraz, e drzewo nasze umieszczone jest wewntrz przewijalnego panelu. Po dodaniu nowego wza moe on nadal nie by widoczny, poniewa znajdzie si poza widocznym fragmentem drzewa. Zamiast wywoa metod "7 , wykorzystamy wtedy:
"#6$
*#!
406
Rysunek 6.19.
Przewinicie panelu
w celu prezentacji
nowego wza
Listing 6.5 zawiera kompletny tekst rdowy programu edycji drzewa. Umoliwia on wstawianie wzw i edytowanie ich. Zwrmy przy tym uwag, w jaki sposb rozwijane s wzy drzewa i przewijany panel, tak aby mona byo zobaczy nowe wzy dodane do drzewa.
Listing 6.5. TreeEditTest.java
.* ,#;##
@
.* ,#;##
;@
.* ,#;#A
@
.* ,#;#A
@
)@@
"#. .
,B ,H +
#
@)
* #
646
*
# ; .# #
!
E#. <#.
64E#. !
<#.
F<#&
7*# E#.4G165725&74!
<#.
!
Rozdzia 6.
)@@
%#.# +#
#,B# + *+
# +
@)
#
64E#. A
E#.
* 64E#. !
6 646
!
+ I1F6J J413J6!
))
+ +
62 .##.*6 !
.
F<#60 !
6 .!
4# !
)) .
++# +
*+
,#. *#
"#
"#
"# !
&"# !#
"# K#&4264%!
.#K
!
))
+ *# *+
/
* 62 .##.*6 !
F<#0#62
F<#0#62 I!
F<#0#62
F<#0#62 L:!
# !
F<#0#62
#
F<#0#62 &#<#!
#
#!
F<#0#62
F<#0#62 #
!
## !
F<#0#62 &*!
## !
#
F<#0#62 0#!
#
#!
F<#0#62 : :!
## !
F<#0#62 3.#!
# !
#
F<#0#62
PJ
!
#
#!
F<#0#62 X!
## !
)@@
6
+ *+
.8
#,B #
H+C#
+#
#
H+C# *+H #+
H
#
H+C#
407
408
Rozdzia 6.
409
n ),! , #!zwraca
wzy wzdu
cieki oraz, jeli drzewo jest umieszczone w panelu przewijalnym, przewija panel,
tak by widoczny by ostatni wze cieki.
!
n !,
"4 #!zwraca
410
n )%!, #!zwraca
n !%$ )%!
*! )%!4*
o podanym indeksie.
n !"%.", )%!#!usuwa
n !
)%!#!zawiadamia
wze z modelu.
n ! #!aduje
Przegldanie wzw
Czsto, aby odnale poszukiwany wze, musimy przejrze wszystkie jego wzy. Klasa
3 )% posiada kilka metod przydatnych w tym celu.
Metody .'" i 4.'" zwracaj obiekty wylicze,
ktrych metoda /' " umoliwia przegldanie wszystkich wzw podrzdnych biecego wza, korzystajc z metody przegldania wszerz i w gb. Rysunek 6.21 pokazuje
porzdek przegldania wzw przykadowego drzewa w obu metodach.
Rysunek 6.21.
Kolejno
przegldania
wzw drzewa
Rozdzia 6.
411
Przegldanie wszerz jest nieco atwiejsze do wyjanienia. Drzewo przegldane jest warstwami. Najpierw odwiedzany jest korze drzewa, potem jego wszystkie wzy podrzdne,
a nastpnie ich wzy podrzdne itd.
W przypadku przegldania w gb sposb poruszania si po drzewie przypomina mysz biegajc po labiryncie w ksztacie drzewa. Porusza si ona wzdu cieek drzewa a do napotkania licia, po czym wycofuje si i wybiera nastpn ciek.
Taki sposb przegldania drzewa nazywany bywa take przegldaniem od koca, poniewa
wzy podrzdne s przegldane przed wzami nadrzdnymi. Zgodnie z tym nazewnictwem
dodano metod przeszukiwania od koca 4) bdc synonimem metody
4.) przeszukiwania w gb. Aby zestaw ten by kompletny, uzupeniono
go metod 4) , ktra przeglda drzewo rwnie w gb, ale najpierw wzy
nadrzdne, a potem podrzdne.
Poniej typowy przykad uycia metod przegldania drzewa:
4.# #E
#E
4.# !
Z przegldaniem drzewa zwizana jest take metoda 4."'", ktra
wyznacza ciek od jednego z przodkw wza do danego wza i tworzy wyliczenie wzw znajdujcych si na ciece. Jej implementacja polega na wywoywaniu metody
, do momentu znalezienia przodka, a nastpnie przejciu cieki z powrotem.
Nasz nastpny program ma przeglda drzewo. Bdzie on wywietla drzewo dziedziczenia
klas. Po wprowadzeniu nazwy klasy w polu tekstowym w dolnej czci okna klasa ta zostanie dodana do drzewa wraz z jej wszystkimi klasami bazowymi (patrz rysunek 6.22).
Rysunek 6.22.
Drzewo dziedziczenia
412
Rysowanie wzw
Specyfika aplikacji czsto wymaga zmiany sposobu prezentacji drzewa. Najczciej polega
ona na zmianie ikon folderw i lici, zmianie czcionki opisujcej wze lub zastpieniu opisu
obrazkiem. Wszystkie te zmiany s osigalne przez zainstalowanie nowego obiektu rysujcego komrki danego drzewa. Domylnie klasa ) wykorzystuje obiekt klasy 3
)
, ktra jest klas pochodn klasy . Etykieta reprezentowana przez
obiekt klasy skada si w tym przypadku z ikony wza i jego opisu.
Obiekt rysujcy komrki drzewa nie jest odpowiedzialny za narysowanie uchwytw wzw umoliwiajcych zwijanie i rozwijanie poddrzew. Uchwyty te s czci oglnego
wygldu komponentw interfejsu uytkownika i nie powinny by modyfikowane.
Rozdzia 6.
413
Metoda ta wywoywana jest dla kadego wza. Zwraca ona komponent, ktrego metoda
4 rysuje reprezentacj wza drzewa. Metodzie 4 przekazywany jest odpowiedni
obiekt &4, ktry zawiera informacj o wsprzdnych umoliwiajc narysowanie
reprezentacji wza we waciwym miejscu drzewa.
Zastanawia moe, dlaczego nie wystarczy po prostu umieci metody 4 w klasie
implementujcej interfejs )
. Przyczyna tego jest bardzo prozaiczna.
Czsto atwiej wykorzysta dla prezentacji wzw drzewa istniejce ju komponenty interfejsu, ni programowa metod 4 od podstaw. Z metody tej skorzystali take
projektanci biblioteki Swing, poniewa domylny obiekt rysujcy komrki drzewa stanowi rozszerzenie komponentu , ktry zapewnia odpowiednie rozmieszczenie
ikony i tekstu.
Metoda )
"4 klasy 3 )
zwraca po prostu
warto , czyli innymi sowy komponent etykiety. (Przypomnijmy, e klasa 3
)
jest pochodn klasy ). Aby zmodyfikowa komponent, musimy
sami utworzy klas pochodn klasy 3 )
i zastpi jej metod
)
"4 implementacj, ktra:
n
zwrci .
414
Nie bdziemy pokazywa osobnego przykadu obiektu rysujcego komrk drzewa dowolnej postaci. Sposb jego dziaania jest analogiczny do pracy obiektu rysujcego komrki listy przedstawionego na pocztku tego rozdziau.
Zaprzgnijmy zatem do pracy obiekty rysujce komrki drzewa. Listing 6.6 zawiera tekst
rdowy programu tworzcego drzewo klas. Program prezentuje drzewo dziedziczenia
klas, wyrniajc klasy abstrakcyjne kursyw. W polu tekstowym w dolnej czci okna
programu uytkownik moe wpisa nazw dowolnej klasy, a nastpnie wybra klawisz
Enter lub przycisk Add, aby doda klas i jej klasy bazowe do drzewa. Naley poda wycznie pen nazw klasy, czyli na przykad : :2.
Dziaanie programu jest troch skomplikowane, poniewa wykorzystuje on przy tworzeniu
drzewa refleksj klas, co odbywa si wewntrz metody
. (Szczegy nie s w tym
przypadku istotne. Przykadowy program tworzy akurat drzewo klas, poniewa drzewo
dziedziczenia jest dobrym przykadem struktury drzewiastej. Zwykle programy reprezentuj jednak za pomoc drzewa inne struktury danych). Metoda
wywouje metod
+, aby sprawdzi, czy klasa znajduje si ju w drzewie. Metoda +
przeglda drzewo wszerz. Jeli klasa nie znajduje si jeszcze w drzewie, to program
dodaje najpierw do drzewa jej klasy bazowe, a na kocu dan klas i troszczy si o to, by
jej wze by widoczny.
Obiekt klasy
%")
prezentuje nazw klasy czcionk prost lub pochy
w zalenoci od modyfikatora 6)
) obiektu klasy
. Program korzysta z czcionki,
ktr dla reprezentacji etykiet drzewa przewidzia biecy wygld komponentw i tworzy
na jej podstawie wersj pochy. Poniewa wszystkie wywoania zwracaj ten sam obiekt
klasy , to kolejne wywoanie metody )
"4 musi odtworzy oryginaln czcionk, jeli wczeniej uyta bya jej wersja pochya.
Konstruktor klasy
)." zmienia dodatkowo ikony reprezentujce wzy drzewa.
Rozdzia 6.
415
416
Rozdzia 6.
)@@
F#, +
# #
H ,, #
#+
/ .# ,
++
+
R*##. #
## #
R
#
H+C
@)
* F<#0#62 #&#
&#
!
)) #, #
H +
#
)) *.,# * /
B #
#.
<
1<# ! [[
".; !!
)) ,- #
# +#,,
H ,8
+
+
## ,,
H+C
F<#0#62 <L
7, !
< Y !
)) #
# +#,,
H
+
)) #,*
#8 #9 +
# ,, #
#+
&#
*#
!
F<#0#62 *#
<
!
*#
*# #&#
!
)) #, #
H ,#
H+C *+H
F<#0#62
2
F<#0#62 !
.
21
2 *#
*#&& !!
))
*#
# 8
H+C ,
+
6"# *#
6"# ."#6%
2!!
.#$
*#!
2
*;# F<#0#62
*;# F<#60 .
*;# 6
*;# 6AE AE
*;#
# <# I1F6J M((
*;#
# <# J413J6 N((
)@@
X#
# *
,B#
H+C +
# +B +
CB *B
*+*# #
#
#,!
@)
#
&#
2#.6&% A
F<#6&%
417
418
n '"!.'" #
n '"!4.'" #
n '"!4'" #
n '"!4'" #
Rozdzia 6.
419
n
"4!)
"4 )!* ! *!
komrki drzewa.
Parametry:
rysowany wze,
/4
.
n !$ $!#
n !4$ $!#
n !
$ $!#
420
Jest ona wywoywana za kadym razem, gdy wze drzewa zostaje wybrany lub przestaje
by wybrany.
Obiekt nasuchujcy dodajemy do drzewa w zwyky sposb:
#
!
Moemy okreli sposb wyboru wzw drzewa przez uytkownika. Wybrany moe by tylko
jeden wze, cigy zakres wzw lub dowolny, potencjalnie niecigy zbir wzw. Klasa
) wykorzystuje klas ) do zarzdzania wyborem wzw. Dla modelu,
ktry musimy najpierw pobra, okreli moemy jeden z nastpujcych stanw wyboru: $%&'(
)
''(''
)$%,
%)$&++()
''(''
)$% lub 3$
%)$&++()
''(''
)$% (ten ostatni jest
stanem domylnym). Nasza przegldarka umoliwia bdzie wybr pojedynczej klasy:
. 60123456%44544&6172
0 !
0 .!
Po okreleniu sposobu wyboru na drzewie nie musimy wicej zajmowa si modelem wyboru.
Sposb wyboru wielu wzw drzewa zaley od biecego wygldu komponentw interfejsu uytkownika. W przypadku wygldu Metal wystarczy przytrzyma klawisz Ctrl podczas kliknicia mysz, aby dokona wyboru kolejnego wza lub usun jego wybr, jeli wczeniej by ju wybrany. Podobnie przytrzymanie klawisza Shift umoliwia wybranie
zakresu wzw.
Aby uzyska informacje o tym, ktre z wzw zostay wybrane, wywoujemy metod
,:
W przypadku gdy moliwo wyboru ograniczylimy do jednego wza, moemy skorzysta z metody ,, ktra zwrci ciek do pierwszego wybranego wza lub
warto , jeli aden wze nie zosta wybrany.
Klasa ) ' dysponuje metod ,, ktra zwraca tablic obiektw klasy ), reprezentujcych zmiany wyboru, a nie aktualnie wybrane wzy.
Program, ktrego kod rdowy zawiera listing 6.7, wykorzystuje mechanizm wyboru wza
drzewa. Program ten stanowi rozbudowan wersj programu z listingu 6.6. Jednak aby uczyni jego tekst rdowy moliwie krtkim, zrezygnowalimy tym razem z uycia wasnego
obiektu rysujcego komrki drzewa. W kodzie konstruktora ramki ograniczamy moliwo
wyboru do jednego wza i dodajemy do drzewa obiekt nasuchujcy wyboru. Gdy wywoana
zostaje jego metoda
, ignorujemy jej parametr i korzystamy z metody
,. Pobieramy ostatni wze uzyskanej cieki i zawarty w nim obiekt uytkownika.
Nastpnie wywoujemy metod . 34, ktra korzysta z mechanizmu refleksji,
aby utworzy acuch znakw opisujcy wszystkie skadowe danej klasy. Otrzymany acuch
znakw wywietlamy w polu tekstowym okna.
Rozdzia 6.
421
422
Rozdzia 6.
K #K
K :!
#K#:
#
!
*## #K!
&"# !# *# K#7L6J!
)@@
I
+,
+
R*##. ,
+#
R
H+C +#
#,B
+#
,- +#,,
H
+
@)
* F<#0#62 <L
7, 7, ,!
))
+#
H+C# +#
#,B 8
#
4.# #E
4.# !
#
04.
!!
F<#0#62
F<#0#62!A4. !
< L
7, !#
,!!
)@@
F#, +
# #
H ,, #
#+
/ .# ,
++
+
R*##. #
## #
#
R
#
H+C
@)
* F<#0#62 #&#
&#
!
))) #, #
H +
#
)) *.,# * /
B #
#.
<
1<# ! [[
".; !!
)) ,- #
# +#,,
H ,8
+
+
## ,,
H+C
F<#0#62 <L
7, !
< Y !
)) #
# +#,,
H
+
)) #,*
#8 #9 +
# ,, #
#+
&#
*#
!
F<#0#62 *#
<
!
*#
*# #&#
!
)) #, #
H ,#
H+C *+H
F<#0#62
2
F<#0#62 !
423
424
n ),! , #
n ),! , #
n !
) '!#!wywoywana,
Rozdzia 6.
425
"
n ),!, #
n ),!, #
Zanim rozpoczniemy omawianie programu, zalecamy, by skompilowa go, uruchomi i zapozna si z jego dziaaniem. Kady wze utworzonego przez program drzewa odpowiada
zmiennej skadowej obiektu. Jeli z kolei ta zmienna reprezentuje take obiekt, to moemy
rozwin jej wze, aby sprawdzi zmienne take i tego obiektu. Program umoliwia inspekcj obiektw skadajcych si na jego interfejs uytkownika. Jeli rozejrzymy si troch po drzewie, to znajdziemy znajome obiekty odpowiadajce komponentom interfejsu
uytkownika. Jednoczenie nabierzemy take respektu dla zoonoci mechanizmw biblioteki Swing, ktra nie jest zwykle widoczna dla programisty.
Istotna rnica w dziaaniu tego programu w stosunku do poprzednich przykadw polega
na tym, e nie uywa on klasy 3 ) . Jeli program dysponuje ju danymi zorganizowanymi w hierarchiczn struktur, to nie ma sensu duplikowa jej za pomoc nowego modelu i dodatkowo zajmowa si jeszcze zapewnieniem synchronizacji obu struktur.
Sytuacja taka wystpuje wanie w przypadku naszego programu, poniewa obiekty interfejsu uytkownika s ju powizane wzajemnymi referencjami.
Interfejs ) definiuje szereg metod. Pierwsza ich grupa umoliwia klasie ) odnalezienie wzw drzewa przez pobranie najpierw jego korzenia, a pniej wzw podrzdnych. Klasa ) korzysta z tych metod jedynie, gdy uytkownik rozwija wze drzewa.
426
Przykad ten ukazuje, dlaczego interfejs ) , podobnie jak klasa ), nie korzysta
bezporednio z pojcia wzw. Korze i jego wzy podrzdne mog by dowolnymi
obiektami. Interfejs ) umoliwia klasie ) uzyskanie informacji o sposobie ich
powizania.
Kolejna metoda interfejsu ) wykonuje operacj odwrotn do metody
:
1A7<& 7, *# 7, !
Jeli w wyniku dziaania programu dane modelu drzewa ulegaj zmianie, to drzewo musi
zosta o tym powiadomione, aby dokona aktualizacji swojego widoku. Dlatego te drzewo
powinno by dodane jako obiekt nasuchujcy ) do modelu. Model musi
wic posiada typowe metody zwizane z zarzdzaniem obiektami nasuchujcymi:
; #60
60
!
; .;60
60
!
Parametr tych metod opisuje miejsce wystpienia zmian w drzewie. Szczegy tworzenia
obiektu zdarzenia opisujcego wstawienie bd usunicie wza s do skomplikowane,
ale musimy si nimi zajmowa tylko wtedy, gdy wzy naszego drzewa s rzeczywicie
dodawane bd usuwane. Listing 6.8 pokazuje konstrukcj obiektu zdarzenia w przypadku
zastpienia korzenia nowym obiektem.
Programici biblioteki Swing znueni wysyaniem obiektw zdarze utworzyli klas
/::' zawierajc list obiektw nasuchujcych. Rozdzia 8.
ksiki Java 2. Podstawy zawiera wicej informacji na ten temat.
Jeli uytkownik zmodyfikuje wze drzewa, to model zostaje o tym poinformowany przez
wywoanie jego metody:
; ;#E"#&# 6"# *# 7,
$#!
Rozdzia 6.
427
Gdy nie zezwolimy uytkownikowi na edycj drzewa, to metoda ta nigdy nie zostanie wywoana.
W przypadku takim konstrukcja modelu drzewa staje si atwa. Naley zaimplementowa
trzy ponisze metody:
7, % !
&& 7, *#!
7, & 7, *# A!
Opisuj one struktur drzewa. Nastpnie musimy dostarczy jeszcze implementacji pozostaych
piciu metod, co pokazano w listingu 6.8 i bdziemy gotowi do wywietlenia wasnego drzewa.
Zajmijmy si teraz implementacj naszego programu. Drzewo zawiera bdzie obiekty klasy
.
Gdybymy skorzystali z klasy 3 ) , to wzy naszego drzewa byyby obiektami klasy 3 )% zawierajcymi obiekty uytkownika klasy .
Zmienna ta posiada typ '"4 2: , nazw ;; i warto, ktr stanowi referencja do
obiektu . W programie zdefiniujemy klas suc reprezentacji zmiennych:
$## ;
$## 4.*&#
, ,!
Jeli zmienna jest typu podstawowego, musimy uy dla jej wartoci obiektu opakowujcego.
$## &#
##
F
##!!
Jeli typem zmiennej jest klasa, to zawiera bdzie ona pola. Korzystajc z mechanizmu refleksji, dokonujemy wyliczenia wszystkich pl i umieszczamy je w tablicy 2. Poniewa metoda . klasy
nie zwraca pl klasy bazowej, to musimy j dodatkowo
wywoa dla wszystkich klas bazowych danej klasy. Odpowiedni kod odnajdziemy w konstruktorze klasy . Metoda . klasy zwraca tablic pl, natomiast
metoda acuch znakw opisujcy wze drzewa. Opis ten zawiera zawsze typ
i nazw zmiennej. Jeli zmienna jest typu podstawowego, to opis zawiera take jej warto.
Jeli typem zmiennej jest tablica, to program nie wywietla jej elementw. Nie jest to
trudne zadanie i pozostawiamy je jako wiczenie dla czytelnikw.
Przejdmy teraz do omwienia modelu drzewa. Pierwsze dwie jego metody s bardzo proste.
* 7, % !
* && 7, *#!
$##!*#!E
!
+ !
428
Powysze trzy metody udostpniaj struktur drzewa komponentowi klasy ). Implementacja pozostaych metod jest rutynowa (patrz listing 6.8).
Drzewo w naszym przykadzie jest struktur nieskoczon. Moemy to sprawdzi, dokonujc inspekcji jednego z obiektw typu 07
. Jeli wybierzemy jego zmienn
o nazwie , to powrcimy do wyjciowego obiektu. Jego poddrzewo moemy w ten
sposb rozwija w nieskoczono. Oczywicie program nie przechowuje nieskoczonego
zbioru wzw, a jedynie tworzy je na danie, gdy uytkownik rozwija kolejne poddrzewa.
Przykad ten koczy omawianie tematyki drzew. Przejdziemy teraz do tematu tabel, kolejnego zoonego komponentu biblioteki Swing. Koncepcyjnie drzewa i tabele nie maj
wiele wsplnego, ale w obu przypadkach wykorzystywane s te same mechanizmy modelu
danych i rysowania komrek.
Listing 6.8. ObjectInspectorTest.java
.* ,#;##
@
.* ,#;##
;@
.* ,#;##<@
.* ,#;#@
.* ,#;#A
@
.* ,#;#A
;@
.* ,#;#A
@
)@@
"#. .
,B
+
#
C#
. +
#
I-
# *# /
@)
* #
7,1
*6
*
# ; .# #
!
Rozdzia 6.
E#. <#.
7,1
*E#. !
<#.
F<#&
7*# E#.4G165725&74!
<#.
!
)@@
%#.# +#
#,B# +
@)
#
7,1
*E#. A
E#.
* 7,1
*E#. !
6 7,1
*6
!
+ I1F6J J413J6!
)) ,# *
+
*, *# ,
#.
$## ;
$## &#
!
!
7,60 .
7,60 !
.
% ;!
))
+ *+, +
6 .!
&"# !#
"# !
K#&4264%!
*;# 6
*;#
# <# I1F6J M((
*;#
# <# J413J6 N((
)@@
0 +
# *
,B
H *
B+#D /
,H+ #;#
IH+C *+H *+,B +.
C#
@)
#
7,60 .*.
60
)@@
6
+ *
+
@)
* 7,60 !
)@@L.
++# +.B
+ +
#
R*##. ; +.# *
## *++ +
@)
* ;
% $## ;!
$## % ;
;
<6&# %!
* 7, % !
429
430
Rozdzia 6.
431
432
n !
!zwraca
korze drzewa.
koncepcyjnym liciem.
n !) ) ! #
n !") ) ! #
Rozdzia 6.
433
n !%
) '!#
n !%$ ) '!#
n !%
" ) '!#
n !
) '!#
"
n ) ' !*!),!#!tworzy
Tabele
Klasa komponentu ) wywietla dwuwymiarow siatk obiektw. Tabele stanowi
czsto wykorzystywany komponent interfejsu uytkownika. Projektanci biblioteki Swing
woyli wiele wysiku w uniwersalne zaprojektowanie komponentu tabel. Tabele s skomplikowanym komponentem, ale w ich przypadku projektantom klasy ) udao si ukry
t zoono. W peni funkcjonalne tabele o duych moliwociach tworzymy ju za pomoc kilku linijek kodu. Oczywicie kod ten moemy rozbudowywa, dostosowujc wygld
i zachowanie tabeli do naszych specyficznych potrzeb.
W podrozdziale tym przedstawimy sposb tworzenia najprostszych tabel, ich interakcje
z uytkownikiem i najczstsze modyfikacje komponentu. Podobnie jak w przypadku innych zoonych komponentw biblioteki Swing, omwienie wszystkich aspektw korzystania z tabel przekracza moliwoci tego rozdziau. Wicej informacji na ten temat znale
mona w ksice Core Java Foundation Classes autorstwa Kim Topley lub Graphic Java 2
napisanej przez Davida M. Gearyego.
Najprostsze tabele
Podobnie jak komponent drzewa, take i klasa ) nie przechowuje danych tabeli, ale
uzyskuje je, korzystajc z modelu tabeli. Klasa ) dysponuje konstruktorem, ktry
umoliwia obudowanie dwuwymiarowej tablicy obiektw za pomoc domylnego modelu.
Z takiego rozwizania skorzystamy w naszym pierwszym przykadzie. W dalszej czci
rozdziau zajmiemy si innymi modelami tabel.
Rysunek 6.25 przedstawia typow tabel opisujc cechy planet ukadu sonecznego. (Planeta posiada cech gaseous, jeli skada si w wikszoci z wodoru i helu. Kolumn Color
wykorzystamy dopiero w kolejnych przykadach programw).
434
Rysunek 6.25.
Przykad
najprostszej tabeli
Jak mona zauway, analizujc kod programu zawarty w listingu 6.9, dane tabeli przechowywane s za pomoc dwuwymiarowej tablicy obiektw:
*;# 7,
0
F ?MM(!
1 (!
K#E:4 &
$
F O(Q?!
1 (!
K#E:4 &
Tabela wywouje metod kadego z tych obiektw i wywietla uzyskany rezultat.
Wyjania to midzy innymi sposb prezentacji danych w kolumnie Color w postaci :
:
<:::*<:::*<:::.
Nazwy kolumn tabeli przechowywane s w osobnej tablicy acuchw znakw:
*;# .2#.
"# %#
0
3#
&
Otrzymana tabela posiada zaskakujco bogate moliwoci. Zmniejszymy jej rozmiar tak,
by pokazay si paski przewijania. Zwrmy uwag, e podczas przewijania zawartoci tabeli nazwy kolumn pozostaj na waciwym miejscu!
Nastpnie wybierzmy jeden z nagwkw kolumn i przecignijmy go w lewo lub w prawo.
Spowoduje to przesunicie caej kolumny (patrz rysunek 6.26), ktr umieci moemy
w innym miejscu tabeli. Zmiana ta dotyczy jedynie widoku tabeli i pozostaje bez wpywu
na dane modelu.
Aby zmieni szeroko kolumny, wystarczy umieci kursor myszy na linii oddzielajcej
kolumny. Kursor przybierze wtedy ksztat strzaki, umoliwiajc przesunicie linii oddzielajcej kolumny (patrz rysunek 6.27).
Rozdzia 6.
435
Rysunek 6.26.
Przesunicie kolumny
Rysunek 6.27.
Zmiana
szerokoci kolumn
Uytkownik moe wybiera wiersze tabeli za pomoc myszy. Wybrane wiersze zostaj podwietlone. Sposb obsugi takiego zdarzenia pokaemy w dalszej czci rozdziau. Uytkownik moe take wybra komrk tabeli i zmodyfikowa j. W biecym przykadzie modyfikacja ta nie spowoduje jeszcze zmiany danych modelu. W praktyce w programach naley
wyczy moliwo edycji komrek tabeli lub obsugiwa zdarzenia edycji i odpowiednio
modyfikowa dane modelu. Zagadnienia te omwimy nieco pniej.
Listing 6.9. PlanetTable.java
.* ,#;##
@
.* ,#;##
;@
.* ,#;#A
@
.* ,#;#A
#@
)@@
"#. .
,B *+C# *
, #
@)
* #
"#6#
*
# ; .# #
!
E#. <#.
"#6#E#. !
<#.
F<#&
7*# E#.4G165725&74!
<#.
!
)@@
%#.# +#
#,B# #H # *#
@)
#
"#6#E#. A
E#.
* "#6#E#. !
436
$
F O(Q?!
1 (!
K#E:4 &
4#
F ON]^!
1 '!
K#E:4 &
0#
F NN_]!
1 ?!
K#E:4 &
*
F ]'M_?!
1 'O!
K#6%L4 &#
#
F O(?O^!
1 '^!
K#6%L4 &#
L#
F ?QQQ_!
1 ']!
K#6%L4 &
2*
F ?M]OO!
1 ^!
K#6%L4 &
"
F ''N]!
1 '!
K#E:4 &#
*;# .2#.
"# %#
0
3#
&
*;#
# <# I1F6J M((
*;#
# <# J413J6 ?((
Rozdzia 6.
437
n ) !*!! "%"#!tworzy
tabel, wykorzystujc
domylny model.
Parametry:
"%"
komrki tabeli,
nazwy (tytuy) kolumn tabeli.
Modele tabel
W poprzednim przykadzie obiekty tabeli przechowywane byy za pomoc dwuwymiarowej tablicy. Rozwizanie takie nie jest jednak zalecane w kadym przypadku. Jeli kod
nasz umieszcza dane w tablicy, aby zaprezentowa je nastpnie w postaci tabeli, oznacza
to, e powinnimy zastanowi si nad implementacj wasnego modelu tabeli.
Implementacja wasnego modelu tabeli nie jest trudna, poniewa wykorzysta moemy klas
) , ktra dostarcza implementacji wikszoci potrzebnych metod. Sami
zaimplementowa musimy jedynie trzy ponisze metody:
* %
& !
* &.& !
* 7, $#:
.!
Istnieje wiele sposobw implementacji metody . Moemy po prostu wyliczy
odpowiedni warto na danie lub pobra konkretn warto z bazy danych. Przyjrzyjmy
si kilku przykadom.
W pierwszym z nich tabela zawiera bdzie wartoci, ktre wyliczy program. Bd one
przedstawia wzrost inwestycji w rnych scenariuszach (patrz rysunek 6.28).
Rysunek 6.28.
Tabela reprezentujca
wzrost inwestycji
438
Metody
i
"
zwracaj odpowiednio liczb wierszy i kolumn tabeli.
* %
& !
#
* &.& !
.#A%# P .%# > '
Jeli nie podamy nazw kolumn, to metoda
"%" klasy ) nazwie
kolejne kolumny A, B, C itd. Aby zmieni nazwy kolumn, zastpimy metod
"%
" i wykorzystamy procentowy przyrost inwestycji jako nazw kolumn.
* &.2#. !
# > .%#! ) '(((
2.E.#"1
# !<.# #!
Rozdzia 6.
* 1;
.6#E#. !
6 1;
.6#!
+ I1F6J J413J6!
6#0 .
1;
.6#0 N( Q '(!
6# #
6# .!
&"# !#
"# #! &!
*;#
# <# I1F6J O((
*;#
# <# J413J6 N((
)@@
0 #
+#,B
#- ./ # 8B#
6## *#+, *+
,
, ##
/8
#
+#
@)
#
1;
.6#0 A
:
#6#0
)@@
6
+ . #
,
R*##. +# #
R*##. ' #,8
+#
*# *
#
R*##. ? #,
8
+#
*# *
#
@)
* 1;
.6#0 ' ?!
#
.%# '
.#A%# ?
* %
& !
#
* &.& !
.#A%# P .%# > '
* 7, $#: !
# > .%#! ) '(((
*
<K## 12161:5K::2&4
@ 0#*
' > # *
!
2.E.#&1
# !<.# <K##!
* &.2#. !
439
440
Rozdzia 6.
441
Jeli baza danych dysponuje przewijalnymi kursorami, to warto komrki moemy uzyska bardzo atwo, przesuwajc kursor do danego wiersza i pobierajc warto kolumny.
* 7, $#: !
%
%
!
#
> '!
7, > '!
# `4A* !
) .
Listing 6.11. ResultSetTable.java
.* ,#;##
@
.* ,#;##
;@
.* ,#;#@
.* ,#;#
@
442
Rozdzia 6.
I
:#* !
* ;
&
I
4; ;!
!
# `4A* !
443
444
Rozdzia 6.
.
0#F## !
# `4A* !
*#6# !
* &.2#. !
.&.2#. > '!
# `4A* !
*#6# !
* &.& !
.&.& !
# `4A* !
*#6# !
(
)@@
"# +/ /
R +/ /
@)
* %
%
!
*;# %
*;# %
0#F##
.
)@@
X#
#
+
,B# *+
,#
H*
FK& ?
@)
#
%
6#0 A
%
6#0
)@@
6
+ . #
R*##. #%
+/ /
@)
445
446
Rozdzia 6.
447
A !!
7,
7,
< , ( , =
,>>!
,
7, , > '!
##
!
# `4A* !
.* 4 > !
* 7, $#: !
< = #
+ !!
7,!# !!
* %
& !
#
+ !
*;# :#
#
Filtry sortujce
Dwa ostatnie przykady wykazay, e tabele nie przechowuj pokazywanych za ich pomoc
danych, lecz pobieraj je, korzystajc z modelu. Take i model nie musi przechowywa danych moe wylicza ich wartoci na dania lub pobiera je z bazy danych.
Wprowadzimy teraz kolejny przydatny mechanizm zwany modelem filtra, ktry umoliwia
prezentacj informacji danej tablicy w innej formie. W naszym przykadzie forma ta polega bdzie na posortowaniu wierszy tabeli. Po uruchomieniu programu, ktrego tekst rdowy zawiera listing 6.12, sprbujmy klikn dwukrotnie jedn z kolumn tabeli. Spowoduje to uporzdkowanie tabeli wedug wartoci wybranej kolumny (patrz rysunek 6.30).
Rysunek 6.30.
Sortowanie
wierszy tabeli
448
Rysunek 6.31 pokazuje sposb, w jaki model filtra wspdziaa z obiektem klasy )
i rzeczywistym modelem tabeli.
Rysunek 6.31.
Model filtra tabeli
Rozdzia 6.
449
Jeli wartoci danej kolumny nie mona porwna, to porwnujemy reprezentujce je acuchy znakw. Tym sposobem moemy posortowa tabel take wedug kolumn zawierajcych wartoci logiczne lub definicje kolorw (cho adna z reprezentujcych je klas nie
implementuje interfejsu
"4 ).
Klas
zdefiniujemy jako klas wewntrzn klasy . , poniewa metoda "
4) klasy
potrzebuje dostpu do biecej kolumny modelu. Poniej przedstawiamy
odpowiedni kod:
#
E0 A
:
#6#0
*;# #
%
.*.
&.*##
* A
* .*#6 7, !
%
%
%
!
7, # .$#: A
&.!
7, .$#: %
A
&.!
< #
#< &.*##!
&.*##!#!.*#6 !
# !.*#6 !!
*;# 6#0 .
*;#
&.
*;# %
450
Poniej prezentujemy take implementacj metody klasy filtra. Tumaczy ona
warto indeksu na warto indeksu modelu :/:
* 7, $#: !
.$#:
A !
Model filtra sortujcego jest kolejnym udanym przykadem zastosowania wzorca modelwidok. Poniewa oddziela on dane od sposobu ich prezentacji, to moemy dowolnie zmienia ich wzajemne odwzorowanie.
Listing 6.12. TableSortTest.java
.* ,#;##
@
.* ,#;##
;@
.* ,#;#@
.* ,#;#A
@
.* ,#;#A
;@
.* ,#;#A
#@
)@@
"#. .
,B
# #
C
#, .
I *+
## # #8
B9 ,B + .
@)
* #
6#6
*
# ; .# #
!
E#. <#.
6#E#. !
<#.
F<#&
7*# E#.4G165725&74!
<#.
!
)@@
%#.# +#
#,B# #H # *##
@)
#
6#E#. A
E#.
* 6#E#. !
6 6#6
!
+ I1F6J J413J6!
))
+ . # #+ . <#
F<#6#0 .
F<#6#0
.2#.
!
<# E0
E0 .!
)) *#+, #H
<# 6# #
6#
!
Rozdzia 6.
0
:#* !
* ; .
& 0
4; ;!
)) +
HU
< ;&& ! = ?!
))
*#
+# # /, .
#&.
#.:" ;" !!
)) +#.#
. #
.
.
))
, ,B
.&.
#;&.1A60 #&.!
.&.!
!
*;# 7,
0
F ?MM(!
1 (!
K#E:4 &
$
F O(Q?!
1 (!
K#E:4 &
4#
F ON]^!
1 '!
K#E:4 &
0#
F NN_]!
1 ?!
K#E:4 &
*
F ]'M_?!
1 'O!
K#6%L4 &#
#
F O(?O^!
1 '^!
K#6%L4 &#
L#
F ?QQQ_!
1 ']!
K#6%L4 &
451
452
Rozdzia 6.
453
454
n !
#
n !
"
#
i kolumnie.
n ! ! *!!*!! "#!nadaje
warto
#
n !) 3
#!zawiadamia
n ) 1!) #!zwraca
n ! ", ,!4#!zwraca
indeks kolumny
w modelu dla danej kolumny w tabeli. Wartoci te s rne, jeli kolumny tabeli
zostay poprzestawiane lub ukryte.
modelu tabeli tak, by zwracaa klas opisujc typ kolumny, to klasa ) bdzie moga
wybra waciwy obiekt rysujcy dla danej klasy. Tabela 6.1 przedstawia sposb prezentacji
kolumn rnych typw przez domylne obiekty rysujce wykorzystywane przez klas ) .
Tabela 6.1. Domylne obiekty rysujce
Typ
Reprezentacja w postaci
1.#1
obrazka
K#
pola wyboru
7,
acucha znakw
Rozdzia 6.
455
Pola wyboru i obrazki w komrkach tabeli zobaczy moemy na rysunku 6.32 (dzikujemy
w tym miejscu Jimowi Evinsowi, http://www.snaught.com/JimCoolIcons/Planets, za udostpnienie obrazkw planet).
Rysunek 6.32.
Tabela wykorzystujca
obiekty rysujce
Metoda ta wywoywana jest za kadym razem, kiedy komrka tabeli wymaga narysowania.
Zwraca komponent, ktrego metoda 4 wykorzystywana jest do narysowania komrki tabeli.
Aby wywietli komrk typu
, wystarczy, e zwrcimy panel, ktrego kolor ta ustawiony bdzie zgodnie z kolorem okrelonym przez obiekt
znajdujcy si w komrce
tabeli. Obiekt ten zostanie przekazany metodzie za porednictwem parametru .
#
&6#&% .*.
6#&%
* &.* 6#&%&.* 6# #
7, ;# #
# #
E
.!
*#
K# &!;#!
*#
*;# "# *#
"# !
Musimy jeszcze przekaza do tabeli informacj, aby skorzystaa z obiektu rysujcego powyszej klasy w przypadku wszystkich komrek zawierajcych obiekty klasy
. Uyjemy w tym celu metody 3
klasy ) , ktrej parametrami bd obiekt
klasy
i obiekt rysujcy.
456
Odtd nowy obiekt rysujcy bdzie wykorzystywany dla obiektw danego typu.
Czsto wykorzystuje si obiekty rysujce, ktre rnicuj wygld komrki w zalenoci
od jej stanu (przegldana, wybrana). W tym celu musimy dysponowa rozmiarami komrki oraz schematem kolorw zwizanym ze stanami wybrania i przegldania komponentw interfejsu.
Aby uzyska informacj o rozmiarach komrki, skorzysta mona z metody
klasy ) . Kolory zwizane z wybraniem komponentw zwracaj metody
67 i ..
Jeli obiekt rysujcy wywietla acuch znakw lub ikon, to moemy go utworzy, rozszerzajc klas 3 )
, ktra wykona dziaania zwizane z obsug stanu wyboru i przegldania komrki.
Edycja komrek
Aby umoliwi edycj komrek, model tabeli musi definiowa metod
'
wskazujc, czy dana komrka tabeli moe by edytowana. Zwykle zezwala si raczej od
razu na edycj caej kolumny ni poszczeglnych komrek. W programie przykadowym
pozwolimy na edycj komrek czterech kolumn tabeli.
* #
&4# !
2:045&7L02
[[ 07725&7L02
[[ 3:47L5&7L02
[[ &77%5&7L02
*
# <# 2:045&7L02 (
*
# <# 07725&7L02 ?
*
# <# 3:47L5&7L02 N
*
# <# &77%5&7L02 M
Jeli uruchomimy program, ktrego tekst rdowy zawiera listing 6.13, to zauwaymy, e
w kolumnie Gaseous moemy edytowa pole wyboru. Natomiast w kolumnie Moons moemy wybiera warto z listy rozwijalnej (rysunek 6.33). Za chwil pokaemy, w jaki sposb zainstalowa list rozwijaln jako edytor wartoci komrki.
Wybierajc komrki pierwszej kolumny tabeli, moemy zmienia ich zawarto, wpisujc
dowolny cig znakw.
Rozdzia 6.
457
Rysunek 6.33.
Edytor komrki
Wszystkie powysze przykady stanowi odmiany klasy 3
'. Obiekt klasy
3
' moe zosta utworzony po wykorzystaniu obiektu klasy )/. ,
76/ lub
"6/. Klasa ) sama automatycznie instaluje edytor pl wyboru dla
kolumn klasy oraz edytor pl tekstowych dla pozostaych typw kolumn, ktre nie
posiadaj wasnego obiektu rysujcego. Edytory pl tekstowych pozwalaj w takim przypadku na modyfikacj acucha znakw bdcego wynikiem zastosowania metody
do obiektu zwrconego przez metod modelu tabeli.
Po zakoczeniu edycji komrki edytor przekazuje rezultat z powrotem do modelu tabeli,
korzystajc z metody . Zadaniem programisty jest takie zaimplementowanie tej
metody, aby jej wywoanie przez edytor spowodowao nadanie odpowiedniej wartoci
obiektowi w modelu tabeli.
Edytor pola tekstowego moe atwo przeksztaci warto komrki w acuch znakw,
korzystajc z metody obiektu zwrconego przez wywoanie metody
. Jednak przeksztacenie w odwrotnym kierunku spoczywa na barkach programisty.
Po zakoczeniu edycji komrki edytor wywoa metod , ktrej przekae acuch znakw. Metoda ta musi umie odpowiednio sparsowa ten acuch. Na przykad
jeli komrka zawieraa numeryczn warto cakowit, metoda moe wykorzysta metod $:4$.
Aby uy w komrkach tabeli edytora listy rozwijalnej, musimy go zainstalowa samodzielnie, poniewa klasa ) nie moe sama ustali zbioru wartoci dla danego typu
komrki. W przypadku komrek kolumny Moons naszej tabeli umoliwimy uytkownikowi wybr wartoci z przedziau od 0 do 20. Poniej fragment kodu inicjujcy list
rozwijaln.
&.KA .&.
&.KA !
< ( = ?( >>!
.&.#1.
1 !!
458
Domylnie wszystkie wiersze tabeli posiadaj t sam wysoko. Moemy jednak zmieni
wysoko poszczeglnych wierszy, psugujc si wywoaniem:
#
%
J
!
Rzeczywista wysoko komrki pomniejszona bdzie o jej margines, ktry domylnie wynosi 1. Wielko marginesu moemy zmieni, uywajc poniszej metody.
#
%
0# .#!
Rozdzia 6.
459
Edytor koloru komrek nie jest standardowym edytorem tabeli. Aby utworzy wasny
edytor, naley zaimplementowa interfejs )
'. Jest to do pracochonne zadanie i dlatego wersja SDK 1.3 wprowadzia klas
' zawierajc implementacj obsugi zdarze.
Metoda )
'
"4 interfejsu )
' pobiera komponent rysujcy komrk tabeli. Jest zdefiniowana tak samo jak metoda )
"4
interfejsu )
z t rnic, e nie posiada parametru .. Poniewa
komrka jest edytowana, to automatycznie przyjmuje si, e wartoci tego parametru jest
. Komponent edytora zastpuje obiekt rysujcy podczas edycji komrki. W naszym
przykadzie wywoanie metody zwraca pusty, niepokolorowany panel, sygnalizujc w ten
sposb, e komrka jest edytowana.
Edytor musi rozpocz swoje dziaanie po klikniciu komrki przez uytkownika.
460
Jeli zastpimy t metod, tak by zwracaa warto , to tabela w ogle nie umieci komponentu edytora.
Po zainstalowaniu edytora wywoywana jest metoda
, prawdopodobnie
dla tego samego zdarzenia. Metoda ta rozpocz powinna proces edycji, na przykad otwierajc okno dialogowe.
* #
& 4;7, #4;!
F#
$
!
Jeli proces edycji bdzie musia zosta zatrzymany lub przerwany (poniewa uytkownik wybra inn komrk tabeli), to wywoana zostanie metoda 4
' lub
'
. Powinnimy wtedy zamkn okno dialogowe. Wywoanie metody 4
' oznacza, e tabela chce zachowa warto zmodyfikowan w procesie edycji. Metoda powinna
zwrci warto , jeli warto komrki jest dozwolona. W przypadku wyboru kolorw dozwolona bdzie dowolna warto. Jednak jeli tworzymy edytor innych rodzajw danych, to
powinnimy zawsze sprawdza, czy powstaa w procesie edycji warto jest dozwolona.
Po zakoczeniu edycji naley take wywoa metod klasy bazowej, ktra obsuguje dla nas
zdarzenia.
* ; #&4 !
F#
$
<#
!
*#&4!
Musimy dostarczy take metod, ktra umoliwi pobranie wartoci powstaej w procesie edycji:
* 7, &4$# !
&
& !
Rozdzia 6.
461
Proces edycji powinien zosta przerwany take na skutek zamknicia okna dialogowego.
Osigniemy to, instalujc obiekt nasuchujcy okna:
F##I
I
:#* !
* ;
&
I
4; ;!
#&4 !
!
Musimy zastpi t metod, aby przekaza do modelu now warto. Parametr jest
obiektem zwrconym przez edytor komrki. W przypadku edytora, ktry sami zaimplementowalimy, znamy typ obiektu zwrconego za pomoc metody
' .
W przypadku edytora klasy 3
' istniej natomiast trzy moliwoci. Moe to
by typ 6 , jeli edytor by polem wyboru lub acuch znakw, jeli edytorem byo
pole tekstowe lub obiekt wybrany przez uytkownika z listy rozwijalnej.
462
Rozdzia 6.
))
-
# #H
#
%
J '((!
&"# !#
"# #!
K#&4264%!
*;#
# <# I1F6J O((
*;#
# <# J413J6 M((
)@@
0 # *# -#,B
#-
*
/
## , #
@)
#
"#6#0 A
:
#6#0
* &.2#. !
.2#.
* &#
&.&#
!
(&#
!
* &.& !
(
* %
& !
* 7, $#: !
* ;
$#: 7, , !
,
* #
&4# !
2:045&7L02
[[ 07725&7L02
[[ 3:47L5&7L02
[[ &77%5&7L02
*
# <# 2:045&7L02 (
*
# <# 07725&7L02 ?
463
464
Rozdzia 6.
)@@
X#
#
,B
*#
B+ ./
@)
#
&6#&% .*.
6#&%
* &.* 6#&%&.* 6# #
7, ;# #
# #
E
.!
*#
K# &!;#!
*#
)) +
## ,
*# / C#
)) - ,
*++ & ./
*;# "# *#
"# !
)@@
4
#,B #
@)
#
&6#&4 A
:
#&4
.*.
6#&4
&6#&4 !
*#
"# !
)) *+
, #
&
&&
!
F# &&
#F#
"# & <#
&
I
:#* !
* ;
&
I
4; ;!
#&4 !
!
465
466
n !
1 !#!nadaje
pikseli.
n !
1 !*!!#!nadaje
n !
!"#!okrela
wierszami.
Rozdzia 6.
n !
1 #!pobiera
467
n !
1 !#!pobiera wysoko
n !
#!pobiera wielko
wierszami.
n
!
!*!! "*! ! 4#!zwraca
4
n
!
"
! "$/#!zwraca
n
"4!)
"4 ) ! *!! *
Parametry:
.
, "
n )
"!
" !/#!zwraca obiekt
n !
' )
'!#
n !
)
!#
468
"
n 3
'
"6/!"6/#!tworzy
"
n !
' '!#!zwraca
proces edycji.
Zwraca warto , jeli edytowana komrka powinna zosta wybrana.
Warto powinna by zwrcona, jeli nie chcemy, by proces edycji
zmienia wybr komrek.
edytowan warto.
"
n
"4!)
'
"4 ) ! *!! *!
, "
!
n
#!tworzy
biay.
n
!
#
n !
!#
Rozdzia 6.
469
Parametry: 4
"
7,
obiekty nasuchujce przyciskw OK i Cancel.
n !
!3
"4!"4*!! *!
!
#
470
Zachowanie
:L675%41W457EE
:L675%41W4524G65&7L02
:L675%41W45LK4`L4265&7L02
:L675%41W45:65&7L02
:L675%41W45:5&7L02
Rozdzia 6.
471
Jeli tryb wyboru wierszy jest wczony, to moemy okreli, czy uytkownikowi wolno
wybra pojedynczy wiersz, cigy zakres wierszy bd dowolny zbir wierszy. W tym celu
musimy pobra model wyboru i skorzysta z jego metody :
#0 !
0 .!
Rysunek 6.37.
Wybr zakresu
komrek tabeli
Ukrywanie kolumn
Metoda "
" klasy ) usuwa kolumn z widoku tabeli. Dane kolumny nie s
usuwane z modelu tabeli, a jedynie ukrywane przed jej widokiem. Parametrem metody
472
Wywoanie tej metody spowoduje dodanie kolumny jako ostatniej kolumny tabeli. Jeli chcemy
j umieci w innym miejscu tabeli, to musimy skorzysta jeszcze z metody "
".
Now kolumn moemy doda take, tworzc nowy obiekt klasy )
" o indeksie
odpowiadajcym numerowi kolumny w modelu.
##&.
6#&. .&.1A!!
Moemy utworzy wiele obiektw tej klasy, ktre stanowi bd reprezentacje jednej i tej
samej kolumny modelu.
Klasa ) nie dysponuje metodami, ktre umoliwiayby wstawienie lub usunicie kolumny z modelu. A take metodami, ktre umoliwiayby ukrycie wierszy. Jeli chcemy
ukrywa wiersze tabeli, musimy utworzy model filtra podobny do pokazanego wczeniej
modelu filtra sortujcego.
Rozdzia 6.
473
Program, ktrego kod rdowy zamieszczamy w listingu 6.14, stanowi ilustracj operacji
wyboru i edycji tabeli. W modelu tabeli umiecilimy prosty zbir danych (tabliczk mnoenia). Menu Edit programu umoliwia:
n
474
Rozdzia 6.
## !
#
&.:
.
1.
!!
1.
#&4# !!
!
0# .
1.!
1.#:
475
476
Rozdzia 6.
477
)) ##,
#. ./.
#-9 (
< ( = #%
& ! >>!
< , ( , = #&.& ! ,>>!
< #
& ,!!
#
$#:
1 (! ,!
!
#0# #&
1.!
*;# F<#6#0 .
*;# 6# #
*;# :#
.;&.
*;#
# <# I1F6J M((
*;#
# <# J413J6 N((
n !
- !"#!okrela
Parametry: "
n !
' !#,!jeli
n !
#!zwraca
478
n )
" !"
"$/#!tworzy
o danym indeksie.
n !,0 !#
n !0 !#
n !/0 !#
n !
- !#,!jeli
n ! !"#!okrela
Parametry: "
tryb wyboru.
n !
!3#
n !
" ! "%"*!! "3#
o indeksie .
n !"
!#!usuwa
wiersz z modelu.
n !"
!*!!*!!#!przesuwa wszystkie wiersze o indeksach
Rozdzia 6.
479
Musimy przyzna, e moliwoci klasy ', s w obecnym stanie do ograniczone. Potrafi ona wywietli proste strony w formacie HTML, ale z wikszoci stron, ktre
moemy spotka obecnie w sieci, Internet ma problemy. Rwnie edytor HTML nie posiada duych moliwoci, ale to akurat nie jest duym ograniczeniem, poniewa rzadko ktra
aplikacja wymaga od uytkownika edytowania pliku w formacie HTML.
Dobrym zastosowaniem klasy ', moe by wywietlanie zawartoci systemu
pomocy zapisanej w formacie HTML. Poniewa korzystamy wtedy z wasnych plikw rdowych HTML, to moemy unika w nich konstrukcji, z ktrymi klasa ', obecnie sobie nie radzi.
Wicej informacji na temat tworzenia systemw pomocy dla profesjonalnych aplikacji
znajdziemy pod adresem http://java.sun.com/products/javahelp/index.html.
Klasa pochodna )/, klasy ', umoliwia przechowywanie i edycj tekstu sformatowanego przy uyciu rnych czcionek z moliwoci umieszczania w nim
rnych komponentw. Jeli bdziemy chcieli utworzy aplikacj umoliwiajc uytkownikowi formatowanie tekstu, to powinnimy najpierw zapozna si z programem
demonstracyjnym StylePad doczonym do SDK.
Program, ktrego kod zamieszczamy w listingu 6.15, korzysta z panelu edytora w celu wywietlenia zawartoci strony w jzyku HTML. W dolnej czci jego okna umieszczone jest
pole tekstowe, w ktrym wprowadzi naley adres URL. Musi ona zaczyna si od 4B
lub B. Wybranie przycisku Load spowoduje wywietlenie w panelu edytora strony
o podanym adresie (patrz rysunek 6.38).
Rysunek 6.38.
Panel edytora
wywietlajcy
stron HTML
Hipercza na wywietlonej stronie s aktywne i wybranie jednego z nich spowoduje zaadowanie kolejnej strony. Przycisk Back umoliwia powrt do poprzedniej strony.
Program ten jest waciwie prost przegldark stron internetowych. Oczywicie nie posiada on moliwoci komercyjnie dostpnych przegldarek, takich jak listy zakadek czy buforowanie stron. Panel edytora nie umoliwia te wywietlania apletw.
480
Rysunek 6.39.
Panel edytora
w trybie edycji
Przedstawione moliwoci panelu edytora daj si atwo wykorzysta. Do zaadowania nowego dokumentu uywamy metody ,. Jej parametrem jest acuch znakw bd
obiekt klasy +
. Klasa ', jest klas pochodn klasy )/
"4. Dlatego
moemy te uy metody )/, jeli chcemy umieci w panelu zwyky, a nie sformatowany tekst.
Aby nasuchiwa zdarze wyboru hipercza, tworzymy obiekt implementujcy interfejs
124 7. Interfejs ten zawiera tylko jedn metod, 24 7+4, ktra wywoywana jest, gdy uytkownik przesuwa kursor myszy ponad hiperczem lub wybiera je.
Metoda posiada parametr typu 124 7'.
Aby dowiedzie si o rodzaju zdarzenia, musimy wywoa metod ')24, ktra
zwrci moe jedn z trzech poniszych wartoci:
J*4;4;6*:&61$:64F
J*4;4;6*4264%4F
J*4;4;6*4G164F
Rozdzia 6.
481
Pierwsza z wartoci oznacza, e uytkownik klikn cze. W takiej sytuacji zwykle bdziemy chcieli zaadowa now stron. Pozostae wartoci moemy wykorzysta na przykad do wywietlania wskazwek, gdy uytkownik przemieszcza kursor ponad czem.
Pozostaje dla nas tajemnic powd, dla ktrego w interfejsie 124 7 nie
zdefiniowano osobnych metod w celu obsugi rnych rodzajw zdarze.
Metoda +
klasy 124 7' zwraca adres URL dla hipercza. Poniej przykad
kodu obiektu nasuchujcego hipercza, ktry umoliwia przegldanie stron adowanych
przez uytkownika przy uyciu hipercza.
"##J*
J*
!
* ; *L*# J*4; ;!
< ;4;6* !
J*4;4;6*:&61$:64F!
"#
"# ;L% !!
# 174A* !
"#
6A 4A*V > !
!
Metoda obsugi zdarzenia pobiera po prostu odpowiedni adres URL i aktualizuje zawarto
panelu edytora. Metoda , moe wyrzuci wyjtek $'/4. W takiej sytuacji
wywietlamy w panelu edytora informacj o bdzie w postaci zwykego tekstu.
Program, ktrego tekst rdowy zawiera listing 6.15, wykorzystuje wszystkie moliwoci klasy ',, ktre przydatne s do zbudowania systemu pomocy opartego o pliki
w formacie HTML. Implementacja klasy ', jest bardziej skomplikowana ni
w przypadku komponentw drzewa bd tabeli. Jeli jednak nie wykorzystujemy tej klasy do tworzenia wasnego edytora tekstu, to szczegami tej implementacji nie musimy
si interesowa.
Listing 6.15. EditorPaneTest.java
.* ,#;##
@
.* ,#;##
;@
.* ,#;#@
.* ,#;#@
.* ,#;#A
@
.* ,#;#A
;@
)@@
"#. .
,B
-
#
J60
+# *.B *# #
482
J*
!
* ; *L*# J*4; ;!
< ;4;6* !
J*4;4;6*:&61$:64F!
)) +#*#.H, #
L% # *+ *+
K#
#*
;L% ! !!
)) *+, #
L%
*
.
6A ;L% ! !!
"#
"# ;L% !!
# 174A* !
"#
6A 4A*V > !
!
)) *
.8
#,B
CB+ ,
<# &KA #
&KA !
##:
Rozdzia 6.
483
484
"
n !, +
! #!aduje
obiekt
$% &
n !24 7+4 124 7'!#!wywoywana,
gdy hipercze
zostanie wybrane.
$% &"
n +
!+
#!zwraca
Organizatory komponentw
Omwienie zaawansowanych moliwoci biblioteki Swing zakoczymy przedstawieniem komponentw, ktre pomagaj programicie w organizacji innych komponentw.
Nale do nich panele dzielone umoliwiajce podzia ich obszaru na wiele czci, ktrych rozmiary mona regulowa, panele z zakadkami pozwalajce na przegldanie
wielu paneli i panele pulpitu utwiajce implementacj aplikacji posiadajcych wiele
ramek wewntrznych.
Rozdzia 6.
485
Panele dzielone
Panele dzielone umoliwiaj podzia ich obszaru na dwie czci. Linia podziau panelu moe by zmieniana. Rysunek 6.40 pokazuje ramk zawierajc dwa panele dzielone. Panel
zewntrzny podzielony zosta poziomo, w jego dolnej czci umieszczono obszar tekstowy,
a w grnej kolejny panel dzielony. Ten ostatni podzielony zosta pionowo. W jego lewej
czci umieszczono list, a w prawej etykiet zawierajc obrazek.
Rysunek 6.40.
Ramka zawierajca
dwa zagniedone
panele
Tworzc panel dzielony, musimy okreli sposb jego podziau i dostarczy komponenty,
ktre umieszczone zostan w poszczeglnych czciach panelu.
*"# "#
*"# *"#J7%1W726:5"16 *#
*#1.#!
I to wszystko. Moemy jeszcze doda do linii podziau ikony, ktre umoliwi maksymalizacj obszaru wybranej czci panelu. Ikony te wida w grnej czci linii podziau na rysunku 6.40. W przypadku wygldu Metal s one reprezentowane za pomoc trjktw.
Wybranie jednego z nich powoduje maksymalizacj obszaru czci panelu w kierunku
wskazywanym przez wierzchoek trjkta.
Dodanie tej waciwoci linii podziau moliwe jest za pomoc poniszej metody.
"#
764A*## !
Inna moliwo polega na wczeniu odrysowywania zawartoci czci paneli podczas przesuwania linii podziau. Jest to przydatne w niektrych sytuacjach, ale zawsze powoduje spowolnienie dziaania linii podziau. Moliwo t moemy wczy za pomoc wywoania:
"#
&
# !
486
Rozdzia 6.
@)
* "# .!
#.
#
.
.
.#
1.#1 #. > <!
* !
#.
)@@
"# *
*#
R *
@)
* F
* !
%#
V > #
> \0
V > .
> \
)@@
487
488
n 4 , #
n 4 , !#
n 4 , !*! !2#
n 4 , !*!
"4!*!
"4!#
n 4 , !*! !2*!
"4!*
n !)'/4 #
n !)'/4 !#
Obie metody daj ten sam efekt umieszczaj komponent w pierwszej czci panelu.
Rozdzia 6.
489
n !
"4
"4!#
n !6"
"4
"4!#
Obie metody daj ten sam efekt umieszczaj komponent w drugiej czci panelu.
Panele z zakadkami
Panele z zakadkami umoliwiaj uporzdkowanie zawartoci zoonych okien dialogowych. Pozwalaj take na przegldanie zestawu dokumentw lub obrazw (patrz rysunek
6.41). Takie bdzie te ich zastosowanie w naszym przykadowym programie.
Rysunek 6.41.
Panel z zakadkami
Ostatni parametr metody jest komponentem, ktry umieszczony zostanie na zakadce.
Jeli chcemy, by zakadka zawieraa wiele komponentw, to najpierw musimy umieci je
w kontenerze, na przykad klasy , .
Ikona zakadki jest opcjonalna. Istnieje wersja metody , ktra nie wymaga tego parametru:
#"##6# .*!
Now zakadk moemy take umieci midzy ju istniejcymi, korzystajc z metody
):
Umieszczenie w panelu nowej zakadki nie powoduje, e staje si ona automatycznie widoczna. W tym celu musimy wybra j za pomoc metody $/. Ponisze
wywoanie pokazuje, w jaki sposb spowodowa wywietlenie dodanej wanie zakadki:
#"#
1A #"#6#& ! P '!
490
Rysunek 6.42.
Panel z przewijaniem
zakadek
lub
#"#
6##" 6#"#&%756:K5:a7L6!
Program przykadowy pokazuje zastosowanie pewnej techniki przydatnej w przypadku paneli z zakadkami. Polega ona na umieszczeniu komponentu na zakadce, dopiero w momencie gdy ma zosta ona pokazana. W naszym programie oznacza to, e obrazek planety
zostanie umieszczony na zakadce dopiero po jej wybraniu.
Aby uzyska powiadomienie o wyborze zakadki, musimy zainstalowa obiekt nasuchujcy
. Zwrmy uwag, e obiekt ten instalujemy dla panelu, a nie dla jednego z jego
komponentw.
#"##&#
!
Gdy uytkownik wybierze zakadk, to wywoana zostanie metoda
obiektu
nasuchujcego. Korzystajc z metody $/, moemy dowiedzie si, ktra
zakadka zostaa wybrana:
* ;
#&#  ;!
#"#1A !
Rozdzia 6.
0 !
$
!
4# !
0#
!
* !
# !
L#
!
2* !
" !
&#
!
* ;
#&#  ;!
491
492
Rozdzia 6.
n ), #
n ), !4 "#
Pobieraj lub ustawiaj tytu, ikon lub komponent zakadki o danym indeksie.
n !/) $!#
n !/) ! #
n !/)
"4!#
obiekt nasuchujcy
powiadamiany w momencie wybrania przez uytkownika zakadki.
493
494
Rozdzia 6.
495
Rysunek 6.44.
Aplikacja
w jzyku Java
posiadajca trzy
wewntrzne ramki
podajc przy tym, czy maj zawiera ikony zmiany rozmiarw i zamknicia.
Zwykle bdziemy chcieli, by ramki posiaday wszystkie te ikony.
1#E#. <#.
1#E#.
)) +.## +.#/
)) .8
-9 +#.H#
)) .#
.#+#,#
! )) +
H
W obecnej wersji implementacji wygldu Metal ikona ramki nie jest wywietlana, gdy
ramka jest zwinita.
496
We wczesnych wersjach biblioteki Swing ramki wewntrzne byy pokazywane automatycznie i wywoanie metody nie byo konieczne.
8. Dodajemy ramki do panelu 374,:
*# <#.!
10. Umieszczamy kolejn ramk poniej, tak by nie zasaniaa istniejcej ramki.
Rozdzia 6.
497
Rysunek 6.46.
Rozmieszczenie
ssiadujce
ramek wewntrznych
Rozmieszczenie kaskadowe charakteryzuje si jednakowym rozmiarem okien i przesuniciem ich pozycji. Metoda ." klasy 374, zwraca tablic wszystkich wewntrznych ramek.
1#E#. <#.
*:E#.
!
498
ikona,
w peni rozwinity.
Korzystajc z metody $, moemy dowiedzie si, ktre ramki zwinite s do ikony
i pomin je podczas rozmieszczania. Jeli ramka znajduje si w stanie w peni rozwinitym, to musimy najpierw sprowadzi j do stanu poredniego, wywoujc /"" #.
Jest to kolejna metoda, ktrej wywoanie moe zosta zawetowane. Trzeba wic obsuy
wyjtek ,42'/4.
Ponisza ptla rozmieszcza kaskadowo wszystkie wewntrzne ramki panelu pulpitu:
< ( = <#.
>>!
< Y<#.
1 !!
)) */, *+*
#+9 #.
# *-
)) .8 +
#9 +#
#
<#.
0#A.. <#
!
<#.
#* A
!
A > <#.F
#
> <#.F
#
)) +#
,# C# + **
< A >
b
*I !! A (
< > b
*J !! (
# "*$4A* !
Uzyskanie rozmieszczenia ssiadujcego okazuje si nieco bardziej skomplikowane, szczeglnie jeli liczba ramek nie jest kwadratem innej liczby. Najpierw musimy uzyska liczb
ramek, ktre nie s zwinite do ikony. Nastpnie obliczy liczb kolumn jako
!0#
<#.&!
Rozdzia 6.
499
(
< ( = <#.
>>!
< Y<#.
1 !!
<#.
0#A.. <#
!
<#.
#* @
@
!
>>
<
!
(
>>
<
P A#!
)) +*+# #
+
>>
*J ! )
# "*$4A* !
Przykadowy program prezentuje take inn typow operacj zwizana z ramkami: wybr
kolejnych ramek, ktre nie s zwinite do ikony. Klasa 374, nie udostpnia metody zwracajcej wybran ramk. Musimy wic sami wywoa metod dla wszystkich ramek tak dugo, a znajdziemy t wybran. Nastpnie wyszukujemy kolejn ramk,
ktra nie jest zwinita do ikony i prbujemy j wybra.
<#.
A
!
500
Rozdzia 6.
501
502
Jeli chcemy zosta po prostu powiadomieni o zamkniciu okna, to nie musimy korzysta z mechanizmu zgaszania weta. Wystarczy jedynie zainstalowa obiekt nasuchujcy
klasy $ .". Zachowuje si on podobnie do obiektu nasuchujcego
klasy 0. Gdy zamykana jest wewntrzna ramka, to wywoywana jest jego
metoda ."
bdca odpowiednikiem metody
. Pozostae sze powiadomie o zmianach ramki wewntrznej (otwarcie (zamknicie), zwinicie do ikony (rozwinicie), aktywacja (deaktywacja)) rwnie odpowiada znanym metodom
obiektw nasuchujcych zwykych okien.
Moliwo ta stanowi odpowiednik odrysowywania linii podziau komponentw klasy 4
,.
We wczesnych wersjach biblioteki Swing odrysowywanie zawartoci ramek podczas
przecigania naleao wyczy za pomoc poniszego wywoania.
**&"*
F
*"##0 !
Rozdzia 6.
503
Program z listingu 6.18 otwiera na pulpicie ramki zawierajce strony HTML. Wybranie z menu
opcji File/Open umoliwia umieszczenie zawartoci wybranego pliku HTML w nowej ramce.
Wybranie hipercza na stronie w ramce powoduje otwarcie nowej strony w osobnej ramce. Pozycje menu Window/Cascade i Window/Tile umoliwiaj uzyskanie rnych rozmieszcze ramek na pulpicie. Listing 6.18 koczy omwienie zaawansowanych moliwoci pakietu Swing.
Listing 6.18. InternalFrameTest.java
.* ,#;##
@
.* ,#;##
;@
.* ,#;##
@
.* ,#;#@
.* ,#;#@
.* ,#;#@
.* ,#;#A
@
.* ,#;#A
;@
)@@
"#. .
,B
+
# #.
H+
@)
* #
1#E#.6
*
# ; .# #
!
E#. <#.
F
*E#. !
<#.
F<#&
7*# E#.4G165725&74!
<#.
!
)@@
%#.# ** +#
#,B# *#
-
#,B +#
#-9 */
J60
@)
#
F
*E#. A
E#.
* F
*E#. !
6 1#E#.6
!
+ I1F6J J413J6!
*
F
*"# !
&"#
*!
))
+ .
0K# .K#
0K# !
0K# .K#!
0 <0
0 E!
.K## <0!
01. *1.
01. 7*!
*1.#:
504
Rozdzia 6.
)@@
6
+
H+B #.H **
R*##. .*
B+ #.
H+,
R*##. C #.
H+,
@)
* ; #1#E#. &.* !
<# 1#E#. <#.
1#E#.
)) +.## +.#/
)) .8
-9 +#.H#
)) .#
.#+#,#
! )) +
H
<#.&"# !# !
*# <#.!
<#.
E#.1
1.#1 .<!!
)) #, #
C,B # *
+9 +#.H #.
<#.#$#&#
505
506
Rozdzia 6.
507
508
,#;#A
<
EE !
* # #* E <!
<#. <2#. !
&#
!
<#.
I .!
[[ <#.
I .!
[[ <
F !
* F
* !
J60 E
!
7*F#
!
< E&
:""%7$457"6172!
))
#
# *
<#.
E !"# !
L% <L
L% <V > <#.!
#1#E#. #4"# <L!
<#.!
# 0#<.L%4A* !
Rozdzia 6.
)@@
6
+ *# #
R*##. #
L% . J60
@)
* &.* #4"# L% !
))
+ *# # .8
#,B *
+#
H * *CB+#
4"# "#
4"# !
"#
4# <#
!
"##J*
J*
!
* ; *L*# J*4; ;!
< ;4;6* !
J*4;4;6*:&61$:64F!
#1#E#. #4"#
;L% !! ;L% ! !!
!
"#
"# !
# 174A* !
"#
6A 4A*V > !
"# "#!
*;# F
*"#
*
*;# AE#.G
*;# AE#.a
*;# <#.F
#
*;#
# <# I1F6J O((
*;#
# <# J413J6 M((
&
n $ ."! ." #!zwraca
pulpitu.
n !3 !"#!okrela
509
510
'
(
n $ ." #
n $ ." ! #
n $ ." ! *! !- #
n $ ." ! *! !- *! ! #
n $ ." ! *! !- *! ! *!
"/"- #
n $ ." ! *! !- *! ! *!
tytu ramki,
-
"/"-
n !
- #
n !
#
n !/"- #
n !$ #
Rozdzia 6.
ramk i zmienia
jej rozmiar.
Parametry: /, 2
n $!."$ #
n !."$ $!#
n !
! #!instaluje
wywoywana, gdy
metoda !ograniczonej waciwoci zawiadamia obiekt nasuchujcy zmiany,
ktra moe by zawetowana.
powd weta,
wetowane zdarzenie.
511