You are on page 1of 142

IDZ DO

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

Ksika ta dostarcza dowiadczonym programistom rozwiza niezbdnych do penego


wykorzystania moliwoci Javy. To praktyczny przewodnik uatwiajcy rozwizywanie
nawet najbardziej zoonych problemw programistycznych. Dodatkowo zawiera
zupenie nowy rozdzia powicony wykorzystaniu jzyka XML w programach pisanych
w Javie oraz zaktualizowane omwienie wielu zaawansowanych moliwoci tej
platformy od kolekcji po metody macierzyste, od bezpieczestwa po bibliotek Swing.
Autorzy identyfikuj problemy najczciej napotykane przez dowiadczonych
programistw Javy i dostarczaj przemylanych rozwiza zilustrowanych przykadami
kodu, ktre uczyniy z tej ksiki prawdziwy bestseller. Dziki niej ujrzysz w nowym
wietle zagadnienia interfejsu ODBC, tworzenia aplikacji sieciowych, wykorzystania
zdalnych obiektw i wiele innych.
Najwaniejsze informacje dla programistw Java:
Zaktualizowane omwienie wielowtkowoci, kolekcji i aplikacji sieciowych.
Zmienione przedstawienie problematyki zdalnych obiektw.
Nowe, zaawansowane techniki wykorzystania architektury komponentw
JavaBeans.
Zaawansowane techniki tworzenia interfejsu uytkownika wykorzystujce
biblioteki Swing i AWT.
Ksika bdzie dla Ciebie kolejnym krokiem w poznaniu moliwoci Javy. Jest
rozszerzeniem i doskonaym uzupenieniem publikacji Java 2. Postawy.

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

Rozdzia 1. Wielowtkowo ...........................................................................................................15


Czym s wtki? ..................................................................................................................... 16
Zastosowanie wtkw...................................................................................................... 21
Uruchamianie i wykonywanie wtkw............................................................................... 22
Wykonywanie wielu wtkw.............................................................................................. 27
Interfejs Runnable ........................................................................................................... 28
Przerywanie wtkw............................................................................................................... 30
Waciwoci wtkw .............................................................................................................. 32
Stany wtkw................................................................................................................... 32
Odblokowanie wtku........................................................................................................ 35
Wtki martwe................................................................................................................... 35
Wtki-demony .................................................................................................................. 36
Grupy wtkw .................................................................................................................. 36
Priorytety wtkw................................................................................................................... 38
Wtki egoistyczne.................................................................................................................. 45
Synchronizacja ...................................................................................................................... 51
Komunikacja midzy wtkami bez synchronizacji............................................................. 51
Synchronizacja dostpu do wspdzielonych zasobw ..................................................... 55
Blokady obiektw............................................................................................................. 60
Metody wait i notify.......................................................................................................... 61
Bloki synchronizowane..................................................................................................... 66
Synchronizowane metody statyczne................................................................................. 67
Zakleszczenia........................................................................................................................ 68
Dlaczego metody stop i suspend nie s zalecane? ......................................................... 71
Limity czasu..................................................................................................................... 76
Programowanie interfejsu uytkownika przy uyciu wtkw.................................................... 77
Wtki i Swing ................................................................................................................... 77
Animacja.......................................................................................................................... 85
Liczniki czasu................................................................................................................... 91
Paski postpu.................................................................................................................. 94
Monitory postpu............................................................................................................. 99
Monitorowanie postpu strumieni wejcia ..................................................................... 103
Zastosowanie potokw do komunikacji pomidzy wtkami ................................................. 109

Java 2. Techniki zaawansowane


Rozdzia 2. Kolekcje ..................................................................................................................... 115
Interfejsy kolekcji................................................................................................................. 115
Rozdzielenie interfejsw kolekcji od ich implementacji .................................................. 116
Interfejsy Collection i Iterator w bibliotekach jzyka Java............................................... 118
Kolekcje konkretne.............................................................................................................. 123
Listy powizane ............................................................................................................. 123
Klasa ArrayList............................................................................................................... 132
Zbiory z kodowaniem mieszajcym ................................................................................ 132
Zbiory drzewiaste........................................................................................................... 139
Mapy.............................................................................................................................. 145
Specjalizowane klasy map ............................................................................................. 150
Szkielet kolekcji................................................................................................................... 155
Widoki i opakowania ...................................................................................................... 158
Operacje masowe .......................................................................................................... 164
Wykorzystanie biblioteki kolekcji z tradycyjnymi bibliotekami ......................................... 165
Algorytmy............................................................................................................................. 166
Sortowanie i tasowanie.................................................................................................. 167
Wyszukiwanie binarne.................................................................................................... 170
Proste algorytmy ............................................................................................................ 171
Programowanie wasnych algorytmw ............................................................................ 173
Tradycyjne kolekcje ............................................................................................................. 174
Klasa Hashtable ............................................................................................................ 174
Wyliczenia...................................................................................................................... 175
Zbiory waciwoci ......................................................................................................... 176
Stosy ............................................................................................................................. 182
Zbiory bitw ................................................................................................................... 182

Rozdzia 3. Programowanie aplikacji sieciowych..........................................................................187


Poczenia z serwerem........................................................................................................ 188
Implementacja serwerw..................................................................................................... 191
Obsuga wielu klientw .................................................................................................. 194
Wysyanie poczty elektronicznej........................................................................................... 197
Zaawansowane programowanie przy uyciu gniazdek sieciowych ........................................ 202
Poczenia wykorzystujce URL ........................................................................................... 207
URL i URI ....................................................................................................................... 208
Zastosowanie klasy URLConnection do pobierania informacji ....................................... 210
Wysyanie danych do formularzy .......................................................................................... 219
Skrypty CGI i serwlety .................................................................................................... 219
Wysyanie danych do serwera stron internetowych ........................................................ 221
Zbieranie informacji w sieci Internet.................................................................................... 227
Bezpieczestwo apletw................................................................................................ 233
Serwery proxy ................................................................................................................ 236
Testowanie apletu prognozy pogody .............................................................................. 243

Rozdzia 4. Poczenia do baz danych: JDBC .................................................................................247


Architektura JDBC................................................................................................................ 248
Typowe zastosowania JDBC ........................................................................................... 251
Jzyk SQL ............................................................................................................................ 252
Instalacja JDBC ................................................................................................................... 258
Podstawowe koncepcje programowania przy uyciu JDBC ................................................... 258
Adresy URL baz danych.................................................................................................. 259
Nawizywanie poczenia............................................................................................... 259

Spis treci

Wykonywanie polece jzyka SQL .................................................................................. 264


Zaawansowane typy jzyka SQL (JDBC 2) ...................................................................... 266
Wypenianie bazy danych ............................................................................................... 268
Wykonywanie zapyta.......................................................................................................... 272
Przewijalne i aktualizowalne zbiory wynikw zapyta ........................................................... 282
Przewijalne zbiory rekordw (JDBC 2) ............................................................................. 283
Aktualizowalne zbiory rekordw (JDBC 2) ....................................................................... 286
Metadane............................................................................................................................ 290
Transakcje........................................................................................................................... 300
Aktualizacje wsadowe (JDBC 2)...................................................................................... 301
Zaawansowane zarzdzanie poczeniami........................................................................... 302

Rozdzia 5. Obiekty zdalne ...........................................................................................................305


Wprowadzenie do problematyki obiektw zdalnych: role klienta i serwera ..................... 306
Wywoania zdalnych metod (RMI)......................................................................................... 308
Namiastka i szeregowanie parametrw ......................................................................... 309
Dynamiczne adowanie klas ........................................................................................... 311
Konfiguracja wywoania zdalnych metod .............................................................................. 311
Interfejsy i implementacje.............................................................................................. 312
Odnajdywanie obiektw serwera .................................................................................... 315
Po stronie klienta........................................................................................................... 319
Przygotowanie wdroenia ............................................................................................... 323
Wdroenie programu ...................................................................................................... 326
Przekazywanie parametrw zdalnym metodom .................................................................... 326
Przekazywanie lokalnych obiektw ................................................................................. 326
Przekazywanie zdalnych obiektw .................................................................................. 338
Wykorzystanie zdalnych obiektw w zbiorach................................................................. 341
Klonowanie zdalnych obiektw....................................................................................... 342
Niewaciwe zdalne parametry....................................................................................... 343
Wykorzystanie RMI w apletach ............................................................................................ 344
Aktywacja obiektw serwera................................................................................................ 348
Java IDL i CORBA................................................................................................................. 355
Jzyk IDL........................................................................................................................ 356
Przykad aplikacji CORBA ............................................................................................... 361
Implementacja serwerw CORBA ................................................................................... 370

Rozdzia 6. Zaawansowane moliwoci pakietu Swing .................................................................377


Listy..................................................................................................................................... 377
Komponent JList ............................................................................................................ 378
Modele list..................................................................................................................... 382
Wstawianie i usuwanie .................................................................................................. 387
Odrysowywanie zawartoci listy...................................................................................... 389
Drzewa ................................................................................................................................ 394
Najprostsze drzewa........................................................................................................ 395
Przegldanie wzw ...................................................................................................... 410
Rysowanie wzw ......................................................................................................... 412
Nasuchiwanie zdarze w drzewach ............................................................................... 419
Wasne modele drzew.................................................................................................... 425
Tabele ................................................................................................................................. 433
Najprostsze tabele......................................................................................................... 433
Modele tabel.................................................................................................................. 437
Filtry sortujce ............................................................................................................... 447

Java 2. Techniki zaawansowane


Rysowanie i edytowanie zawartoci komrek................................................................. 454
Operacje na wierszach i kolumnach............................................................................... 469
Wybr wierszy, kolumn i komrek .................................................................................. 470
Komponenty formatujce tekst ........................................................................................... 478
Organizatory komponentw ................................................................................................. 484
Panele dzielone ............................................................................................................. 485
Panele z zakadkami ...................................................................................................... 489
Panele pulpitu i ramki wewntrzne................................................................................. 494
Rozmieszczenie kaskadowe i ssiadujce..................................................................... 497
Zgaszanie weta do zmiany waciwoci......................................................................... 500

Rozdzia 7. Zaawansowane moliwoci biblioteki AWT ..................................................................513


Potokowe tworzenie grafiki .................................................................................................. 514
Figury................................................................................................................................... 516
Wykorzystanie klas obiektw graficznych ....................................................................... 518
Pola ..................................................................................................................................... 531
lad pdzla ......................................................................................................................... 535
Wypenienia......................................................................................................................... 543
Przeksztacenia ukadu wsprzdnych ................................................................................ 549
Przycinanie .......................................................................................................................... 557
Przezroczysto i skadanie obrazw ................................................................................... 562
Wskazwki operacji graficznych........................................................................................... 570
Czytanie i zapisywanie plikw graficznych............................................................................ 575
Wykorzystanie obiektw zapisu i odczytu plikw graficznych.......................................... 576
Odczyt i zapis plikw zawierajcych sekwencje obrazw ................................................ 578
Operacje na obrazach.......................................................................................................... 588
Dostp do danych obrazu .............................................................................................. 588
Filtrowanie obrazw ....................................................................................................... 595
Drukowanie ......................................................................................................................... 604
Drukowanie grafiki ......................................................................................................... 604
Drukowanie wielu stron.................................................................................................. 614
Podgld wydruku............................................................................................................ 616
Usugi drukowania ......................................................................................................... 625
Usugi drukowania za porednictwem strumieni ............................................................ 631
Atrybuty drukowania....................................................................................................... 636
Schowek.............................................................................................................................. 643
Klasy i interfejsy umoliwiajce przekazywanie danych .................................................. 644
Przekazywanie tekstu..................................................................................................... 644
Interfejs Transferable i formaty danych.......................................................................... 649
Przekazywanie obrazw za pomoc schowka ................................................................. 651
Wykorzystanie lokalnego schowka do przekazywania referencji obiektw ...................... 656
Wykorzystanie schowka systemowego do przekazywania obiektw Java ....................... 662
Mechanizm przecignij i upu......................................................................................... 666
Cele mechanizmu przecignij i upu ......................................................................... 668
rda mechanizmu przecignij i upu ...................................................................... 677
Przekazywanie danych pomidzy komponentami Swing ................................................. 683

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

Wzorce nazw waciwoci ziarnek i zdarze......................................................................... 701


Typy waciwoci ziarnek ..................................................................................................... 703
Waciwoci proste ........................................................................................................ 703
Waciwoci indeksowane ............................................................................................. 704
Waciwoci powizane ................................................................................................. 705
Waciwoci ograniczone ............................................................................................... 711
Tworzenie wasnych zdarze zwizanych z ziarnkami........................................................... 721
Edytory waciwoci ............................................................................................................. 727
Implementacja edytora waciwoci ............................................................................... 735
Klasa informacyjna ziarnka.................................................................................................. 749
Klasa FeatureDescriptor ................................................................................................ 751
Indywidualizacja ziarnka ...................................................................................................... 758
Implementacja klasy indywidualizacji ............................................................................. 760
Kontekst ziarnka ................................................................................................................. 768
Zaawansowane zastosowanie introspekcji..................................................................... 768
Odnajdywanie ziarnek siostrzanych................................................................................ 771
Korzystanie z usug kontekstu ziarnka ........................................................................... 773

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

Rozdzia 10. Internacjonalizacja...................................................................................................883


Lokalizatory ......................................................................................................................... 884
Liczby i waluty ..................................................................................................................... 890
Data i czas .......................................................................................................................... 896
Tekst ................................................................................................................................... 903
Porzdek alfabetyczny.................................................................................................... 903
Granice tekstu ............................................................................................................... 910

Java 2. Techniki zaawansowane


Formatowanie komunikatw .......................................................................................... 916
Formatowanie z wariantami ........................................................................................... 920
Konwersje zbiorw znakw ............................................................................................ 924
Internacjonalizacja a pliki rdowe programw.............................................................. 925
Zasoby ................................................................................................................................ 926
Lokalizacja zasobw ...................................................................................................... 927
Tworzenie klas zasobw ................................................................................................ 928
Lokalizacja graficznego interfejsu uytkownika .................................................................... 931
Lokalizacja apletu .......................................................................................................... 934

Rozdzia 11. Metody macierzyste ..................................................................................................951


Wywoania funkcji jzyka C z programw w jzyku Java ....................................................... 953
Wykorzystanie funkcji printf............................................................................................ 954
Numeryczne parametry metod i wartoci zwracane ............................................................. 959
Wykorzystanie funkcji printf do formatowania liczb ........................................................ 959
acuchy znakw jako parametry ........................................................................................ 961
Wywoanie funkcji sprintf przez metod macierzyst...................................................... 964
Dostp do skadowych obiektu............................................................................................ 966
Dostp do statycznych skadowych klasy ............................................................................ 969
Sygnatury ............................................................................................................................ 971
Wywoywanie metod jzyka Java.......................................................................................... 973
Wywoywanie metod obiektw........................................................................................ 973
Wywoywanie metod statycznych.................................................................................... 976
Konstruktory .................................................................................................................. 977
Alternatywne sposoby wywoywania metod .................................................................... 977
Tablice................................................................................................................................. 980
Obsuga bdw................................................................................................................... 984
Interfejs programowy wywoa jzyka Java .......................................................................... 989
Kompletny przykad: dostp do rejestru systemu Windows ................................................. 992
Rejestr systemu Windows.............................................................................................. 992
Interfejs dostpu do rejestru na platformie Java............................................................ 994
Implementacja dostpu do rejestru za pomoc metod macierzystych ........................... 995

Rozdzia 12. Jzyk XML ..............................................................................................................1009


Wprowadzenie do jzyka XML............................................................................................ 1010
Struktura dokumentu XML ........................................................................................... 1012
Parsowanie dokumentw XML........................................................................................... 1015
Definicje typw dokumentw ............................................................................................. 1026
Praktyczny przykad ...................................................................................................... 1034
Przestrzenie nazw.............................................................................................................. 1046
Wykorzystanie parsera SAX ............................................................................................... 1048
Tworzenie dokumentw XML ............................................................................................. 1053
Przeksztacenia XSL .......................................................................................................... 1061

Skorowidz.................................................................................................................................1073

Zaawansowane moliwoci
pakietu Swing
W tym rozdziale:
n

Listy.

Drzewa.

Tabele.

Komponenty formatujce tekst.

Organizatory komponentw.

W rozdziale tym kontynuowa bdziemy rozpoczte w ksice Java 2. Podstawy omwienie


pakietu Swing wykorzystywanego do tworzenia interfejsu uytkownika. Pakiet Swing posiada
bardzo rozbudowane moliwoci, a w ksice Java 2. Podstawy zdoalimy przedstawi jedynie komponenty najczciej uywane. Wikszo niniejszego rozdziau powicimy zoonym
komponentom, takim jak listy, drzewa i tabele. Komponenty umoliwiajce formatowanie tekstu, na przykad HTML, posiadaj jeszcze bardziej zoon implementacj. Omwimy sposb
ich praktycznego wykorzystania. Rozdzia zakoczymy przedstawieniem organizatorw komponentw, takich jak panele z zakadkami i panele z wewntrznymi ramkami.

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

Java 2. Techniki zaawansowane


Listy czsto skadaj si z acuchw znakw, ale w praktyce zawiera mog dowolne obiekty
i kontrolowa przy tym sposb ich prezentacji. Wewntrzna architektura listy, ktra umoliwia taki stopie oglnoci, prezentuje si do elegancko. Niestety projektanci z firmy Sun
postanowili pochwali si elegancj tworzonych rozwiza, zamiast ukry j przed programistami korzystajcymi z komponentu. Skutkiem tego posugiwanie si listami w najprostszych
przypadkach jest troch skomplikowane, poniewa programista musi manipulowa mechanizmami, ktre umoliwiaj wykorzystanie list w bardziej zoonych przypadkach. Omwienie
rozpoczniemy od przedstawienia najprostszego i najczciej spotykanego zastosowania tego
komponentu listy, ktrej elementami s acuchy znakw. Pniej przejdziemy do bardziej
zoonych przykadw ilustrujcych uniwersalno komponentu.

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 :

   

    
 
    
 
 !

Moemy wykorzysta w tym celu take anonimow tablic:


 
    
  

 

    !

Komponenty  nie przewijaj automatycznie swojej zawartoci. W tym celu musimy
umieci list w panelu przewijalnym:
 "#  "#  
 "#
  !

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

379

Panel ten, a nie list, umieszczamy nastpnie na docelowym panelu okna.


Rozdzielenie prezentacji listy od mechanizmu przewijania jest z pewnoci rozwizaniem
eleganckim, ale mao praktycznym. Waciwie prawie wszystkie listy wymagaj przewijania. Zmuszanie programistw, by za kadym razem, gdy tworz najprostsz list, podziwiali dziaanie tego mechanizmu, jest okrutne.
Domylnie lista mieci osiem elementw widocznych jednoczenie. Moemy to zmieni,
korzystajc z metody  
:

   $ %
&  '(! )) * #+, ,  +- '( ./

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 
  0 1234544&6172!
)) . 8
-9
  * , + .

    0 
  0 123451264%$: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; ;!

Podczas dokonywania wyboru na licie generuje si sporo zdarze. Zamy na przykad,


e uytkownik przechodzi do kolejnego elementu listy. Gdy naciska klawisz myszy, generowane jest zdarzenie zmiany wyboru na licie. Zdarzenie to jest przejciowe i wywoanie
metody
; : ,  !

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

Java 2. Techniki zaawansowane


Kady z jej elementw musimy rzutowa na acuch znakw.
7, ;#    $# !
<   (  = ;#  >>!
 
   
 !;# 

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 

 . Zwraca ona pierwszy element wybrany na licie.


    !  $# !

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.

Zaawansowane moliwoci pakietu Swing


* # ;  .#  # !

E#. <#.  
 E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!


)@@
%#.# +#
#,B#  H C/
 H * #+,BB + #
+C 8  +
# C/
 "++.,B #
 + &
#9 . 8#
 C/

# #
 + < * +
## #
/ #C +#  C/

@)
#  E#. A E#.

*  E#. !

6  6 !
+ I1F6J J413J6!

 



  
*;## # #<#


    
 
 !
 "#  "#  
 "#
  !
"# *  
"# !
*#  "#!

  #     

    !



* ;  ;#&#   4; ;!

7, ;# 
   $# !
K<< A  
K<< *<A!
<     (  = ;#  >>!


  !;# 
A#**
 !
A#**  !

A#** <<A!
# 6A A  !!

!
& #  "#  & "# !
 "## * K  # 7L6J!
#  
# *<A > <<A!
 "## # K  # &4264%!


381

382

Java 2. Techniki zaawansowane


*;# # <#  I1F6J  M((
*;# # <#  J413J6  N((
*;#  
  
*;# # #
*;#  *<A  6 
*;#  <<A  < A ,.* ;  #+ 



 
n  !"#!tworzy

list wywietlajc podane elementy.

n  ! 
 !#!okrela

liczb elementw widocznych

jednoczenie na licie (bez przewijania).


n  !    !" #!okrela

moliwo wyboru pojedynczego

lub wielu elementw.


Parametry: " 

jedna z wartoci $%&'('' )$%*


$%&'($%)'
('' )$%*
+)$,'($%)'
('' )$%.

n  !     ! #!dodaje

do listy obiekt nasuchujcy zdarze wyboru na licie.


n !   #!zwraca

elementy wybrane na licie lub pust


tablic, jeli aden element nie zosta wybrany.

n !   #!zwraca

pierwszy element wybrany na licie

lub warto  .


       
n  !     '!#! metoda

wywoywana za kadym

razem, gdy wybr na licie uleg zmianie.

Modele list
W poprzednim podrozdziale pokazalimy najczciej spotykany sposb wykorzystania list
polegajcy na:
n

utworzeniu niezmiennego zbioru elementw listy (acuchw znakw),

umoliwieniu przewijania listy,

obsudze zdarze wyboru elementw listy.

W dalszej czci przedstawimy bardziej skomplikowane sposoby wykorzystania list, czyli:


n

listy o bardzo duej liczbie elementw,

listy o zmiennej zawartoci,

listy zawierajce elementy inne ni acuchy znakw.

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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

Java 2. Techniki zaawansowane


Istnieje 26 26 26 = 17 576 takich kombinacji. Zamiast przechowywa je wszystkie,
program bdzie tworzy je podczas przewijania listy przez uytkownika.
Implementacja programu okazuje si bardzo prosta. Zadanie dodania i usuwania odpowiednich obiektw nasuchujcych wykona za nas klasa   , ktr rozszerzymy. Naszym zadaniem bdzie jedynie dostarczenie implementacji metod -
i ' ":
# I   0  A : # 0 

* I   0   !     
*  + !   !0#*
?O ! 
* 7, 4.:  !

))
+#+# P C#D
  

  


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!!

    0    0 1234544&6172!


 "#  "#  
 "#
  !

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.

   EA &I  Q(!

   EA &J 'Q!

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.

Zaawansowane moliwoci pakietu Swing

Listing 6.2. LongListTest.java


.*  ,#;##
@
.*  ,#;##
;@
.*  ,#;#A
@
.*  ,#;#A
;@
)@@
" #. .  ,B
 + #   /# #.+
+#+#
,
.
@)
* #   6 

* # ;  .#  # !

E#. <#.  
  E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!


)@@
%#.# +#
#,B# CB  H C/
 H * #+,BB + #
+C 8  +
# C/

@)
#   E#. A E#.

*   E#. !

6   6 !
+ I1F6J J413J6!

    
  
I   0  N!!

    0 
  0 1234544&6172!

   EA &I  Q(!

   EA &J 'Q!
 "#  "#  
 "#
  !
"# *  
"# !
*#  "#!

  #     

    !



* ;  ;#&#   4; ;!

K<<

 K<<!
   $# !
,
   !!

!
& #  "#  & "# !
 "## * K  # 7L6J!

385

386

Java 2. Techniki zaawansowane


#  
# *<A > <<A!
 "## # K  # &4264%!
, < A!

)@@
7-# * .  + ## * #+
# +# * . B 
R*##.
 
 * .  + ##
@)
* ;  , 
 !

K<< A  
K<< *<A!
A#**
 !
A#** <<A!
# 6A A  !!

*;# # <#  I1F6J  M((
*;# # <#  J413J6  N((
*;#  
  
*;# # #
*;#  *<A  6  
 
*;#  <<A   ,.* ;  #+ 

)@@
0    #.+ ,B  .#,  
@)
# I   0  A : # 0 

)@@
6
+ . 
R*##.  C -9  .#, C
#!
@)
* I   0   !     
*  + !

 !0#*
:6 P E1%6 > ' !

* 7, 4.:  !

K<<   
K<< !
<     (  =  >>!

#   #! E1%6 >  S :6 P E1%6 > '!!
  ( !
   ) :6 P E1%6 > '!

 

*;#  
* # <# # E1%6  T#T
* # <# # :6  T+T


Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

387


 
n    !  #!tworzy

list, ktra wywietla elementy dostarczane

przez okrelony model.


n  !./  0 ! #

jeli parametr  ma warto wiksz


od zera, to okrela on szeroko kadej komrki listy. Wartoci domyln jest 1,
co wymusza wyznaczenie rozmiarw kadej komrki z osobna.

n  !./  1 !#

jeli parametr  ma warto wiksz


od zera, to okrela on wysoko kadej komrki listy. Wartoci domyln jest 1,
co wymusza wyznaczenie rozmiarw kadej komrki z osobna.


  
n !- #!zwraca

liczb elementw w danym modelu.

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

Java 2. Techniki zaawansowane


Moemy teraz dodawa i usuwa elementy modelu, ktry bdzie powiadamia list o tych
zmianach.
. . ;4.
!
. # 4. 
!

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##.: ! 
!


Pokazuje on, e jeli zmienimy zawarto wektora po utworzeniu listy, to pokazywa


ona bdzie mylc mieszank starych i nowych elementw, a do momentu gdy caa
lista zostanie odrysowana. (Sowo kluczowe  w deklaracji konstruktora nie zabrania wprowadzania zmian zawartoci wektora w innych fragmentach kodu. Oznacza
ono jedynie, e konstruktor nie modyfikuje referencji 3. Sowo kluczowe 
jest wymagane w tej deklaracji, poniewa obiekt 3 wykorzystywany jest przez
klas wewntrzn).


 
n   !  #!pobiera

model listy.


  
n  !' " ! #!umieszcza

obiekt na kocu danych modelu.

n  !" ' " ! #!usuwa

pierwsze wystpienie obiektu


z modelu. Zwraca warto , jeli obiekt zosta odnaleziony w modelu,
warto   w przeciwnym razie.

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

389

Odrysowywanie zawartoci listy


Jak dotd wszystkie przykady wykorzystyway listy zawierajce acuchy znakw. W praktyce rwnie atwo moemy utworzy list ikon, dostarczajc konstruktorowi tablic lub wektor wypeniony obiektami klasy $ . W ogle moemy reprezentowa elementy listy za pomoc dowolnych rysunkw.
Klasa  automatycznie wywietla acuchy znakw oraz ikony, ale w pozostaych przypadkach naley dostarczy jej obiekt odrysowujcy zawarto komrek listy. Obiekt taki musi
nalee do klasy, ktra implementuje poniszy interfejs:
<#  &% 

& .*   &% & .*     
7, ;#   A
 #     # J# E  !


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

Java 2. Techniki zaawansowane


Program, ktrego kod rdowy zawiera listing 6.3, umoliwia wybr czcionki, korzystajc
z jej rzeczywistego przedstawienia na licie (patrz rysunek 6.3). Metoda 4 "4 
wywietla nazw danej czcionki, wykorzystujc j sam. Musi take dopasowa kolorystyk do aktualnego wygldu klasy . Uzyskujemy j, posugujc si metodami . 
 567  oraz   .  5  67  klasy .
Metoda ,- mierzy acuch znakw w sposb opisany w ksice Java 2. Podstawy w rozdziale 7.

Rysunek 6.3.
Lista o komrkach
rysowanych przez
program

Obiekt rysujcy komrki instalujemy za pomoc metody  


:
<   &%  
E &%  !!

Od tego momentu wszystkie komrki listy bd rysowane przez ten obiekt.


W wielu przypadkach sprawdza si prostsza metoda tworzenia obiektw rysujcych komrki list. Jeli komrka skada si z tekstu, ikony i zmienia swj kolor, to wszystkie te
moliwoci uzyska moemy, korzystajc z obiektu klasy  . Aby na przykad pokaza
nazw czcionki za jej pomoc, moemy skorzysta z nastpujcego obiektu:
# E &%  .*.  &% 

* & .*   &% & .*     
7, ;#   A  #   
 # J# E  !

# #  
# !
E  <   E !;#
# 6A < E#. !!
# E  < !
# 7*# !
# K#   
U   K#  !
V  K#  !!
# E    
U   E   !
V  E   !!
 #



Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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
 + # /

 ,B  ./  


@)
* #  % 6 

* # ;  .#  # !

E#. <#.  
 % E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!


)@@
%#.# +#
#,B#  H +   *   
 /  
* #+
# , 
#B +   + B

392

Java 2. Techniki zaawansowane


@)
#  % E#. A E#.

*  % E#. !

6  % 6 !
+ I1F6J J413J6!
:#  <   
:#  !
<#  1W4  ?M
<  # 
E  < E ":12 1W4!!
<  # 
E  # < E ":12 1W4!!
<  # 
E  0  *#  E ":12 1W4!!
<  # 
E  F#  E ":12 1W4!!
<  # 
E  F# 1* E ":12 1W4!!
<    
  <   :# !!
<   $ %
&  M!
<    0 
  0 1234544&6172!
<   &%  
E &%  !!
 "#  "#  
 "# <  !
"# *  
"# !
*#  "#!
<  #     

    !



* ;  ;#&#   4; ;!

E  <   E !<   $# !
A E  < !

!
& #  "#  & "# !
 "## * K  # 7L6J!
A  
6A:#
6  
 < A ,.* ;  #+ !
A E  E !<   (!!
A I#* !
A I#*I  !
 "## A K  # &4264%!

*;# 6A:# A
*;#   <  
*;# # <#  I1F6J  M((
*;# # <#  J413J6  N((

)@@
7  ,B  ./   *+ 8 +  /, #+
H +#
#  ./#
@)
# E &%  .*.  &% 


Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

393

* & .*   &% & .* 


<#     <# 7, ;#
<#   A <#  #   
<#  # J# E  !

 

"# !

* ;  *#& .*  3#* !

E  <   E !;#
 A  < E#. !
E 0 <.  E 0 < !
 &    
U   K#  !
V  K#  !!
<% ( ( I  ! J !!
 &    
U   E   !
V  E   !!
 E  < !
 #
 A ( <.:  !!

* F.   "< + !

E  <   E !;#
 A  < E#. !
3#*   3#* !
E 0 <.  E 0 < !
 
F.   <. I  A!
<.J !!






 
n !67  #!zwraca

kolor ta komrki listy, ktra nie jest wybrana.

n !  67  #!zwraca

kolor ta komrki listy, ktra zostaa

wybrana.
n  ! 
  
!
#!instaluje

obiekt

wykorzystywany do rysowania zawartoci komrek listy.


   
n "4 ! 
 "4  ! *!!"*!!/*

 ! *!  . #!zwraca komponent, ktrego metoda 4

rysuje zawarto komrek. Jeli komrki listy nie posiadaj staych rozmiarw,
to komponent ten musi take implementowa metod ,-.

394

Java 2. Techniki zaawansowane


Parametry: 

lista, ktrej komrki maj zosta narysowane,

"

rysowany element,

/

indeks elementu w modelu,

 

warto , jeli komrka jest wybrana,

. 

warto , jeli komrka jest bieca.

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

W programach czsto trzeba zaprezentowa dane w postaci struktury drzewiastej. Biblioteka


Swing dostarcza w tym celu klas ). Klasa ) (wraz z klasami pomocniczymi) suy
do tworzenia reprezentacji graficznej drzewa i przetwarzania akcji uytkownika polegajcych
na rozwijaniu i zwijaniu wzw drzewa. W podrozdziale tym nauczymy si korzysta z moliwoci klasy ). Podobnie jak w przypadku innych zoonych komponentw biblioteki
Swing, skoncentrujemy si na omwieniu najczstszych i najbardziej przydatnych przypadkw zastosowa klasy ). Jeli spotkasz si z nietypowym zastosowaniem drzewa, to polecamy ksik Core Java Foundation Classes autorstwa Kim Topley (Prentice-Hall, 1998)
lub Graphic Java 2 napisan przez Davida M. Gearyego (Prentice-Hall, 1999).

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

395

Rysunek 6.5.
Hierarchia pastw,
stanw i miast

Zanim przejdziemy do konkretw, warto usystematyzowa terminologi zwizan z opisem


drzew (patrz rysunek 6.6). Drzewo skada si z wzw. Kady wze jest albo liciem, albo
posiada wzy podrzdne. Kady wze drzewa z wyjtkiem jego korzenia, posiada dokadnie jeden wze nadrzdny. Kade drzewo posiada jeden korze. Czasami wystpuje kolekcja drzew, z ktrych kade posiada wasny korze. Nazywamy j lasem.
Rysunek 6.6.
Terminologia drzew

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 . !

Dostpne s take konstruktory tworzce drzewo na podstawie kolekcji elementw:


6 7,   !
6 $    !
6 J# #   ! ))
# - # #,B H
H+C#. +
#

396

Java 2. Techniki zaawansowane


Konstruktory te s jednak mao przydatne, gdy tworz las drzew, z ktrych kade posiada jeden wze. Ostatni z konstruktorw jest wyjtkowo nieprzydatny, poniewa wzy umieszczane s w drzewie w praktycznie przypadkowy sposb okrelony przez kody
mieszajce elementw.

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.

Zaawansowane moliwoci pakietu Swing

397

Nastpnie musimy utworzy powizania pomidzy wzami nadrzdnymi i podrzdnymi.


Konstrukcj drzewa rozpoczniemy od korzenia, a pniej dodamy do niego wzy podrzdne:
F<#0#62   
 
F<#0#62  I  !
F<#0#62   
 
F<#0#62  L:!
 #  !
F<#0#62  #
 
F<#0#62  &#< #!
 # #!

Rysunek 6.8 pokazuje drzewo utworzone przez program.


Rysunek 6.8.
Najprostsze drzewo

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  !

Listing 6.4 zawiera kompletny tekst rdowy programu.


Listing 6.4. SimpleTree.java
.*  ,#;##
@
.*  ,#;##
;@
.*  ,#;#A
@
.*  ,#;#A
@
)@@
" #.
-
#,B #,*  + +

@)
* # .*6

* # ;  .#  # !

E#. <#.  
.*6E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!



398

Java 2. Techniki zaawansowane


)@@
%#.# +#
#,B# +

-
#,B #
. ++  *++ * #.
. 
@)
# .*6E#. A E#.

* .*6E#. !

6 .*6!
+ I1F6J J413J6!
))  , .  +
#
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   
6  !
& #  "#  & "# !
 "## 
 "# !!

*;# # <#  I1F6J  N((
*;# # <#  J413J6  ?((


Po uruchomieniu programu powstanie drzewo, ktre zobaczymy na rysunku 6.9. Widoczny


bdzie jedynie korze drzewa oraz jego wzy podrzdne. Wybranie mysz uchwytu wza
spowoduje rozwinicie poddrzewa. Odcinki wystajce z ikony uchwytu wza skierowane
s w prawo, gdy poddrzewo jest zwinite i w d w przeciwnym razie (patrz rysunek 6.10).
Nie wiemy, co mieli na myli projektanci wygldu interfejsu zwanego Metal, tworzc ikon
uchwytu wza, ale nam przypomina ona w dziaaniu klamk drzwi. Kierujemy j w d,
aby rozwin poddrzewo.

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

399

Rysunek 6.9.
Pocztkowy
wygld drzewa

Rysunek 6.10.
Zwinite i rozwinite
poddrzewa

Wygld drzewa zaley od wybranego wygldu komponentw interfejsu uytkownika.


Opisujc dotd drzewo, korzystalimy ze standardowego dla aplikacji Java wygldu interfejsu Metal. W przypadku interfejsw Motif lub Windows uchwyty wzw posiadaj
posta kwadratw zawierajcych znaki plus lub minus (patrz rysunek 6.11).
Rysunek 6.11.
Drzewo o wygldzie
Windows

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

Korzystajc z SDK 1.4., moemy wyczy rysowanie linii czcych wzy:


*&" * 6 2 !

400

Java 2. Techniki zaawansowane


lub wczy je z powrotem:
*&" * 6 : !

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.

Zaawansowane moliwoci pakietu Swing

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

Java 2. Techniki zaawansowane


 
n ) )  !"  #!tworzy

drzewo na podstawie modelu.

n ) )% ! #


n ) )% ! *! !7  #

Tworz drzewo, korzystajc z domylnego modelu i wywietlajc pocztkowo


korze i jego wzy podrzdne.
Parametry:   korze,
7  ,

jeli posiada warto , to wze jest


liciem, gdy moe posiada wzy podrzdne.

n  ! 
1   !#,!jeli 

posiada warto , to korze


posiada uchwyt umoliwiajcy zwinicie drzewa.

n  !
   !#,

jeli  posiada warto , to korze jest


wywietlany. W przeciwnym razie jest ukryty.


 
n  ! #!zwraca

warto , jeli dany wze reprezentuje li

na poziomie koncepcji.
n  !    #!zwraca

warto , jeli dany wze moe

posiada wzy podrzdne.


  
n  !+ !#!okrela

obiekt uytkownika dla danego

wza.


 
n  ! ! #!zwraca

warto , jeli wze   zostanie

wywietlony jako li.


  
n  !7     !#,!jeli 

posiada warto , to wzy


wywietlane s jako licie, w przypadku gdy metoda     zwraca
warto  . Gdy  posiada warto  , to wzy wywietlane s jako licie,
jeli metoda  zwraca warto .


   
n 3  )%  !#!tworzy

podany obiekt uytkownika.

wze drzewa zawierajcy

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

n  !  )% ! #!dodaje

403

do wza wze podrzdny.

n  !     !#,!jeli 

posiada warto , to do wza

mog by dodawane wzy podrzdne.


  
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.

Modyfikacje drzew i cieki drzew


Nastpny przykad programu ilustrowa bdzie sposb modyfikacji drzew. Rysunek 6.17
przedstawia potrzebny interfejs uytkownika. Jeli wybierzemy przycisk Add Sibling lub Add
Child, to program doda do drzewa nowy wze opisany jako New. Jeli wybierzemy przycisk
Delete, to usuniemy wybrany wze.
Rysunek 6.17.
Modyfikowanie drzewa

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

Java 2. Techniki zaawansowane


zdarza si, e obiekty w takim modelu nie bd posiada metod , i   , ale
wykorzystywa bd inny sposb pocze pomidzy wzami. czenie wzw jest zadaniem modelu drzewa. Klasa ) nie posiada adnej wiedzy na temat natury tych pocze. I to jest wanie przyczyn, dla ktrej klasa ) musi wykorzystywa kompletne
cieki drzewa.
Klasa ), zarzdza sekwencj referencji do obiektw klasy  (nie )% !).
Wiele metod klasy ) zwraca obiekty klasy ),. Gdy dysponujemy ju ciek, to
moemy pobra wze znajdujcy si na jej kocu, korzystajc z metody 4 "
4 . Aby na przykad odnale aktualnie wybrany wze drzewa, korzystamy z metody
  , klasy ). W rezultacie otrzymujemy obiekt klasy ),, za pomoc ktrego moemy z kolei uzyska aktualnie wybrany wze.
6"#  "#   "# !
F<#0#62   2   F<#0#62 !
 "## "#& .*  !

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:
.  2 1 
2   2 
 2 & &  !!

Natomiast metoda " % . ", usunie wze i powiadomi widok drzewa:
. . ;2 E ."#  2 !

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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 $  *#!

Wywoanie to spowoduje nie tylko rozwinicie wzw wzdu cieki prowadzcej do


nowego wza, ale i takie przewinicie zawartoci panelu, e nowy wze bdzie widoczny
(patrz rysunek 6.19).

406

Java 2. Techniki zaawansowane

Rysunek 6.19.
Przewinicie panelu
w celu prezentacji
nowego wza

Domylnie wzy drzewa nie mog by modyfikowane. Jeli jednak wywoamy:


 4 # !

to uytkownik moe edytowa wzy, klikajc je dwukrotnie mysz, zmieniajc acuch


opisujcy wze i zatwierdzajc zmian klawiszem Enter. Dwukrotne kliknicie wza mysz powoduje wywoanie domylnego edytora komrki implementowanego przez klas 3
   '  (patrz rysunek 6.20). Mona zainstalowa wasny edytor, ale temat ten
omwimy podczas przedstawiania tabel, w przypadku ktrych zastosowanie edytorw komrek jest bardziej naturalne.
Rysunek 6.20.
Domylny edytor
komrek

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 +
#
@)
* # 64 6 

* # ;  .#  # !

E#. <#.  
64 E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!



Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

)@@
%#.# +#
#,B# + *+    
# +

@)
# 64 E#. A E#.

* 64 E#. !

6 64 6 !
+ 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

Java 2. Techniki zaawansowane


@)
* ;  .#K  !

"# *#  
"# !
K  # K   
K  : !
# K # :   

:   !



* ;  # "< . : 4; ;!

F<#0#62   2 
 F<#0#62 !
#  "#& .*  !
<  2   ! 
F<#0#62  *#
 F<#0#62 !
 2 "# !
< *#  ! 
F<#0#62  
2 
 
F<#0#62  2
!
  1 A  *#1 A  2 !
.  2 1 
2  *#
 1 A > '!
))
-
# 

H+C
62     . "#6 %  
2 !
6"# *#  
6"#   !
  "#6 $  *#!

!
*## # K !
K  # & K   
K  : & !
# & K # :   

:   !



* ;  # "< . : 4; ;!

F<#0#62   2 
 F<#0#62 !
#  "#& .*  !
<  2   ! 
F<#0#62  
2 
 
F<#0#62  2
!
.  2 1 
2   2 
 2 & &  !!
))
-
# 

H+C
62     . "#6 %  
2 !
6"# *#  
6"#   !

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

409

  "#6 $  *#!



!
*## # & K !
K  K   
K  F!
K # :   

:   !



* ;  # "< . : 4; ;!

F<#0#62   2 
 F<#0#62 !
#  "#& .*  !
<  2  Y  ZZ
 2 "# ! Y !
. . ;2 E ."#  2 !

!
*## K !
& "# !# *# K  # 7L6J!

*;# F<#60  . 
*;# 6 
*;# # <#  I1F6J  M((
*;# # <#  J413J6  ?((



 
n ),!  , #!zwraca

ciek do aktualnie wybranego wza


(lub pierwszego wybranego, jeli wybranych zostao wiele wzw) bd warto
 , jeli aden wze nie jest wybrany.

n ! , "4  #!zwraca

obiekt aktualnie wybranego


wza (lub pierwszego wybranego, jeli wybranych zostao wiele wzw) bd
warto  , jeli aden wze nie jest wybrany.

n  !"7  ),!4#!rozwija wszystkie

wzy wzdu cieki.

n  ! ,)   ),!4#!rozwija wszystkie

wzy wzdu
cieki oraz, jeli drzewo jest umieszczone w panelu przewijalnym, przewija panel,
tak by widoczny by ostatni wze cieki.


   !
n !, "4  #!zwraca

do ktrego dostp reprezentuje cieka.

ostatni obiekt cieki czyli wze,

410

Java 2. Techniki zaawansowane


 
n )% !, #!zwraca

wze nadrzdny danego wza.

n )% !   !/#!zwraca

wze podrzdny o danym indeksie.


Warto indeksu musi by z przedziau od 0 do     #!8!9.

n !    #!zwraca

liczb wzw podrzdnych danego wza.

n '" !  #!zwraca

obiekt wyliczenia umoliwiajcy przegldanie


wszystkich wzw podrzdnych danego wza.


 
n  !% $  )% !  *! )% !4*

!/#!wstawia    jako nowy wze podrzdny wza 4

o podanym indeksie.
n  !" % . ",  )% ! #!usuwa
n  !   )% ! #!zawiadamia

wze   z modelu.

obiekty nasuchujce modelu

o modyfikacji wza  .

n  !   )% !4*!!  $/#!zawiadamia

obiekty nasuchujce modelu, e ulegy modyfikacji wzy podrzdne wza 4


o podanych indeksach.

n  !  #!aduje

wszystkie wzy do modelu. Operacja ta wykonywana


powinna by jedynie, gdy zasza zasadnicza modyfikacja wzw spowodowana
zewntrzn przyczyn.

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.

Zaawansowane moliwoci pakietu Swing

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.#  !

 # E # 0 4. !!




  # E A4. !

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

W przykadzie tym wykorzystamy fakt, e obiekt uytkownika danego wza moe by


dowolnego typu. Poniewa wzy naszego drzewa reprezentowa bd klasy, umiecimy
w nich obiekty klasy .
Poniewa nie chcemy, by drzewo zawierao wiele wystpie tej samej klasy, to najpierw
bdziemy musieli je przeszuka, aby sprawdzi, czy dana klasa ju wystpuje. Ponisza
metoda znajduje wze zawierajcy podany obiekt uytkownika pod warunkiem, e istnieje
on w drzewie.

412

Java 2. Techniki zaawansowane


* F<#0#62  < L 7, 7, ,!

4.#    
   

 # 0 4. !!

F<#0#62   
 F<#0#62 !A4. !
<  L 7, !# ,!!
  

 


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.

Wygld drzewa zmodyfikowa moemy na trzy rne sposoby.


1. Zmieniamy ikony, czcionk oraz kolor ta wykorzystywany przez obiekt klasy
3 ) 
. Ustawienia te wykorzystywane bd podczas rysowania

wszystkich wzw drzewa.


2. Instalujemy wasny obiekt rysujcy komrki drzewa, ktry nalee bdzie do klasy
pochodnej klasy 3 ) 
. Moe on zmienia ikony, czcionk

i kolor ta, rysujc poszczeglne wzy.


3. Instalujemy wasny obiekt rysujcy komrki drzewa, ktry implementowa bdzie
interfejs ) 
 i rysowa dowoln reprezentacj wzw drzewa.

Przyjrzyjmy si po kolei tym sposobom. Najprostszy z nich wymaga utworzenia obiektu


klasy 3 ) 
, zmiany ikony i zainstalowania obiektu dla danego drzewa:
F<#6&%   
 
F<#6&%  !
  #<1  
.#1  P#< !!
))  # -
  &  1  
.#1   P#< !!
))  # +
H
H+C#
  7*1  
.#1  
P#< !!
))  #  +
H
H+C#
 &%   !

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

413

Efekt takiego rozwizania przedstawia rysunek 6.22.


Nie zalecamy zmiany czcionki bd koloru ta dla caego drzewa, poniewa to jest zadaniem wygldu komponentw interfejsu uytkownika.
Moemy jednak zmienia czcionk pojedynczych wzw drzewa dla ich wyrnienia. Jeli
przyjrzymy si uwanie rysunkowi 6.22, to zauwaymy, e nazwy klas abstrakcyjnych pisane s kursyw.
Aby zmienia wygld poszczeglnych wzw, musimy zainstalowa wasny obiekt rysujcy
komrki drzewa. Przypomina on obiekty rysujce komrki list, ktre omwilimy w 9. rozdziale ksiki Java 2. Podstawy. Interfejs ) 
 posiada pojedyncz metod:
& .*  6&% & .*  6 
7, ;#  #    # A*#  
 # #<  
  # # E  !

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

wywoa metod klasy nadrzdnej w celu przygotowania danych komponentu


etykiety,

zmodyfikuje waciwoci etykiety,

zwrci .

# &# 2#.6&%  A F<#6&% 



* & .*  6&% & .*  6 
7, ;#  #    # A*#  
 # #<  
  # # E  !

*6&% & .*   ;#
  A*#   #< 
 # E  !
F<#0#62   
 F<#0#62 !;#
  L 7, !

414

Java 2. Techniki zaawansowane


E  <        
E  *#E !
  


Parametr   metody ) 


 "4  nie jest obiektem uytkownika,
ale obiektem reprezentujcym wze! Przypomnijmy w tym miejscu, e obiekty uytkownika wykorzystywane s przez klas 3  )% , natomiast klasa
) moe zawiera wzy dowolnego typu. Jeli drzewo skada si z wzw klasy
3  )% , to obiekt uytkownika moemy pobra z nich dopiero, wywoujc metod +, tak jak uczynilimy to w powyszym przykadzie.
Obiekt klasy 3 ) 
 wykorzystuje ten sam obiekt klasy  dla
wszystkich wzw, zmieniajc jedynie tekst etykiety. Jeli wic dokonamy zmiany
czcionki dla danego wza, to musimy przywrci czcionk domyln, gdy metoda zostanie wywoana po raz kolejny. W przeciwnym razie wszystkie kolejne wzy zostan
opisane zmienion czcionk! Kod programu w listingu 6.6 pokazuje sposb przywrcenia domylnej czcionki.

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.

Zaawansowane moliwoci pakietu Swing

Listing 6.6. ClassTree.java


.*  ,#;##
@
.*  ,#;##
;@
.*  ,#;##<@
.*  ,#;#@
.*  ,#;#A
@
.*  ,#;#A
;@
.*  ,#;#A
@
)@@
" #. .  ,B * / 
##
 ./ +
# # *+C# + +
# #  
# #+

@)
* # &# 6

* # ;  .#  # !

E#. <#.  
&# 6E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!


)@@
%#.# +#
#,B# +
# #+ *   

 *+  . 8
#,B #
# # +
#
@)
# &# 6E#. A E#.

* &# 6E#. !

6 &# 6!
+ I1F6J J413J6!
))  +. +
# ,  # # 7,
   
F<#0#62  ,#;##7,# !
.   
F<#60   !
  
6 . !
)) #, # H +
#
# &# &# !!
)) 
+  
H+C/

&# 2#.6&%   


 
&# 2#.6&%  !
  &  1  
1.#1   P#<!!
  7*1  
1.#1  
P#<!!
  #<1  
1.#1  P#<!!
 &%   !
& "# !# 
 "# !
K  # &4264%!
# 6AE !


415

416

Java 2. Techniki zaawansowane


)@@
F #, *   
  *+ 
@)
* ;  # 6AE !

"# *#  
"# !
:   #    

:   !



* ;  # "< . : 4; ;!

)) #, +
# # H /, #+
# +#, , H
))
*   
.


 A  AE 6A !
# &# &# < 2#. A!!
))  
#   + * #  

AE  6A !

# &# 2 E  4A*  !

7* "# 
0 #F#  
&#   <  !



)) 
+ *   

AE  
6AE ?(!
AE # :   #  !
*## AE !
K  # K   
K  : !
# K # :   #  !
*## # K !
& "# !# *# K  # 7L6J!

)@@
W#, , 
+

R*##. , +# 
R
H+C +#
#,B   
,-   .#
+

@)
* F<#0#62  < L 7, 7, ,!

)) +#, ,
H+C +#
#,B #  8
#
4.#     # E 4.#  !

 # 0 4. !!

F<#0#62   
 F<#0#62 !A4. !
<  L 7, !# ,!!
  


Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

 

)@@
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  !
.  2 1 
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

Java 2. Techniki zaawansowane



* & .*  6&% & .*  6 
7, ;#  #    # A*#  
 # #<  
  # # E  !

*6&% & .*   ;#
  A*#   #< 
 # E  !
)) * #  8
#
F<#0#62   
 F<#0#62 !;#
&#   &# ! L 7, !
)) *+ *
+. 8 
+ + H
)) * CB *
# #,BB #, +  * ,
< *#E   !

*#E   E  !
)@
  ,B  ./H +
#

C
# ,  +# #.
#  /#  * # # - , +  !
@)
< *#E  Y !
#E   *#E  ;E  E 16:1&!

))  #
# + H * CB ,- # # ,  # #,#
< 0 < ! Z 0 <:K6%:&6!  (!
E  *#E !
 
E  #E !
  

*;# E  *#E   
*;# E  #E   



   
n '" !.'"  #
n '" !4.'"  #
n '" !4'"  #
n '" !4 '"  #

Zwracaj obiekt wyliczenia umoliwiajcy przegldanie wszystkich wzw


drzewa w odpowiednim porzdku: wszerz, gdzie wzy podrzdne lece bliej
korzenia odwiedzane s wczeniej, w gb, gdzie wszystkie wzy podrzdne
danego wza s odwiedzane, zanim odwiedzone zostan jego wzy siostrzane.
Metoda 4 '"  stanowi synonim metody 4.'" .
Metoda 4'"  przeglda drzewo podobnie do niej, z t rnic,
e wzy nadrzdne przegldane s przed ich wzami podrzdnymi.

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

419


  
n "4 !) 
 "4  )!* ! *! 

 *! !/4*! ! *!! *! !. #


zwraca komponent, ktrego metoda 4 wywoywana jest w celu narysowania

komrki drzewa.
Parametry: 

drzewo, do ktrego naley rysowana komrka,

 

rysowany wze,

 

warto , jeli wze jest wybrany,

/4

warto , jeli wzy podrzdne danego wza


s widoczne,



warto , jeli wze jest liciem,

numer wiersza graficznej reprezentacji drzewa


zawierajcej wze,

. 

warto , jeli wze jest przegldany w danym


momencie przez uytkownika.


   
n  !$  $ ! #
n  !4$  $ ! #
n  ! $  $ ! #

Ustalaj ikon prezentujc odpowiednio: li, wze rozwinity, wze zwinity.

Nasuchiwanie zdarze w drzewach


Najczciej komponent drzewa wykorzystywany jest razem z innym komponentem interfejsu uytkownika. Gdy uytkownik wybiera wzy drzewa, to inny komponent pokazuje
pewn informacj o nich, tak jak na przykad program przedstawiony na rysunku 6.23.
Kiedy uytkownik wybiera wze drzewa reprezentujcy klas jzyka Java, to w polu tekstowym obok prezentowana jest informacja o jej zmiennych.
Rysunek 6.23.
Przegldarka klas

420

Java 2. Techniki zaawansowane


Aby uzyska takie dziaanie programu, konieczne jest zainstalowanie obiektu nasuchujcego wyboru w drzewie. Obiekt ten musi implementowa interfejs )  ,
ktry posiada tylko jedn metod:
;  ;#&# 6 4; ;!

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:
 .   6 0 123456%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 

  ,:

6"#  "#   "# !

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.

Zaawansowane moliwoci pakietu Swing

Listing 6.7. ClassBrowserTest.java


.*  ,#;##
@
.*  ,#;##
;@
.*  ,#;##<@
.*  ,#;#@
.*  ,#;#A
@
.*  ,#;#A
;@
.*  ,#;#A
@
)@@
" #. .  ,B
/
H+C# +
#
@)
* # &# K
6 

* # ;  .#  # !

E#. <#.  
&# K
6 E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!


)@@
%#.# +#
#,B# +
#  *   
 * #+,B
C#

#, #  #+ *   
 . 8
#,B
#
# 
 # +
#
@)
# &# K
6 E#. A E#.

* &# K
6 E#. !

6 &# K
6 !
+ I1F6J J413J6!
))
 + +
# +#, , H # # 7,
   
F<#0#62  ,#;##7,# !
.   
F<#60   !
  
6 . !
)) #, # H +
#
# &# &# !!
))  *   . 
# 6   

6   !



* ;  ;#&# 6 4; ;!

)) 8

#C 
H+C +
#
))  #8 +##+
#9 * # 
6"# *#   "# !
< *#  ! 
F<#0#62   2 
 F<#0#62 !
*## "#& .*  !

421

422

Java 2. Techniki zaawansowane


&#   &# !  2 L 7, !
  *   E F *  !
A:# 6A  * !

!
 .   6 0 123456%44544&6172
 0  !  0  . !
)) *   
 +#
#,B * # 
A:#  
6A:# !
)) #,  .*  +
#  * #  
 *#
"# *#  
"# !
*# #  
3 #  ' ?!!
*## 
 "# !!
*## 
 "# A:#!!
& "# !# *# K  # &4264%!
# 6AE !

)@@
F #, *   
  *+  : 
. 8
#,B # 
, #  +
#
@)
* ;  # 6AE !

"# *#  
"# !
:   #    

:   !



* ;  # "< . : 4; ;!

)) #, +
# # H /, #+
#
)) +#, , H
*   
.


 A  AE 6A !
# &# &# < 2#. A!!
)) # A <   # 
AE  6A !

# &# 2 E  4A*  !

7* "# 
0 #F#  
&#   <  !



)) *   

/.
*
# +# B #+
 
 #
AE  
6AE ?(!
AE # :   #  !
*## AE !

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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.#  !

 # 0 4. !!

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

Java 2. Techniki zaawansowane


.  2 1 
2  *#
*#& &  !!
)) *#
# 8
H+C , 
 +
6"# *#  
6"# . "#6 %  
2 !!
.#$  *#!
 
2 

)@@
W
## * C#
 # 
R*##. # #
R C#D +#/
+#
#,B #+
  * +.
@)
* #  E F *  &# !

))  + # + .#+. < ,
K<<   
K<< !
E  <  F# E !
<     (  = <  >>!

E <  < 
< <0 < ! Z 0 <6:61&! Y (!
#**  # !
#** <6* !2#. !!
#**  !
#** <2#. !!
#** \!

   !

*;# F<#0#62   
*;# F<#60  . 
*;# 6 
*;# 6AE AE 
*;# 6A:# A:#
*;# # <#  I1F6J  M((
*;# # <#  J413J6  N((



 
n ),!  , #
n ),!  , #

Zwracaj odpowiednio ciek do pierwszego wybranego wza lub tablic cieek


do wybranych wzw. Jeli aden wze nie jest wybrany, obie metody zwracaj  .


     
n  !   )  '!#!wywoywana,

wybrany lub przestaje by wybrany.

gdy wze zostaje

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

425


   "
n ),!, #
n ),!, #

Zwracaj odpowiednio ciek do pierwszego obiektu lub tablic cieek


obiektw, ktrych stan uleg zmianie na skutek danego zdarzenia wyboru.
Jeli interesuj nas wybrane elementy, a nie zmiana ich wyboru, to powinnimy
skorzysta z metody   , lub   , klasy ).

Wasne modele drzew


Ostatnim przykadem wykorzystania drzew bdzie program umoliwiajcy inspekcj wartoci zmiennych, podobnie jak czyni to narzdzia uruchomieniowe (patrz rysunek 6.24).
Rysunek 6.24.
Drzewo inspekcji
obiektw

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

Java 2. Techniki zaawansowane


7, %  !
 & &  7, *#!
7, & 7, *#   A!

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   :
 1 A7<& 7, *# 7,  !

Metoda ta moe zosta zaimplementowana za pomoc wymienionych wczeniej trzech


metod patrz kod programu w listingu 6.8.
Model drzewa informuje klas ) o tym, ktre wzy powinny zosta przedstawione jako licie:
 #  #< 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   !

Implementacj tych metod pokazuje take listing 6.8.


Gdy zawarto modelu ulega zmianie, to wywouje on jedn z czterech metod definiowanych przez interfejs ) :
;  2  &# 60 4; !
;  2  1  60 4; !
;  2  %. ; 60 4; !
;  &# 60 4; !

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.

Zaawansowane moliwoci pakietu Swing

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  .

Zamy, e inspekcji podda chcemy zmienn:


4.*  , 

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

Java 2. Techniki zaawansowane


Metoda    zwraca nowy obiekt klasy   opisujcy dane pole. Metody )24
oraz %" klasy .  udostpniaj typ i nazw pola. Korzystajc z mechanizmu refleksji, moemy odczyta warto pola za pomoc wywoania : 4 #. Metoda ta
moe wyrzuci wyjtek $  '/4 . Poniewa w konstruktorze udostpniamy
wszystkie pola, to wyjtek ten nie powinien si pojawi.
Poniej przedstawiamy kompletny kod metody   .
* 7, & 7, *#   A!

:#  <  $##!*#!E !
E <  E !<   A!
7, *#$#  $##!*#!$# !


 
$## <6* ! <2#. !
< *#$#!!

# 1#: 4A*  !

 



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.

Zaawansowane moliwoci pakietu Swing


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

Java 2. Techniki zaawansowane



  

*  & &  7, *#!

 $##!*#!E ! + !

* 7, & 7, *#   A!

:#  <  $##!*#!E !
E <  E !<   A!
7, *#$#  $##!*#!$# !


 
$## <6* ! <2#. !
< *#$#!!

# 1#: 4A*  !

 


*  1 A7<& 7, *# 7,  !

   & &  *#!
<     (  =  >>!
< & *# !#  !!
 
 P'

*  #  #< 7,  !

 & &   !  (

* ;  ;#E "#&# 6"# *#
7, 
$#!

* ;  # 60   60   !

  # 60  #  !

* ;  . ;60   60   !

  . ; 60  #  !

*  ;  <6&# 7,  % !

60 4; ;
 
60 4;   
7,   % !
4;        
60  # !

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

<     (  =    >>!


60  !  !&#
;!

*;# $##  
*;# 4;     
 
4;   !

)@@
X# # *+,B# +.B * # #,BB * #+
H 
# -9
@)
# $##

)@@
6
+  *+,B +.B
R*##. #6* * +.,
R*##. #2#. #+
# +.,
R*##. #$#
# -9 +.,
@)
* $## &# #6*  #2#. 7, #$#!

*  #6*
#.  #2#.
;#  #$#
<  
:#  !
)@
+#, ,
+  * # ,- +.# ,  * # 
  +
,#,B ,  C#D/
+#/

# - 
@)
< Y* ".; ! ZZ Y* :# ! ZZ
Y*# # ! ZZ ;# Y !

)) * # * # #   * #
+  ,, # #+

<  &#   ;#&# !  Y 
  *# !!

E  <  F# E !
: 7, :  < !
)) * #
+  * # /  B #+
<     (  = < >>!
< <0 < ! Z 0 <6:61&!  (!
< # <!



)@@
W
##
# -9 +.,
R
# -9
@)
* 7, $# !

 ;#


431

432

Java 2. Techniki zaawansowane


)@@
W
##
+  * # +., /  B #+
R ## +. * ,B * #
@)
* :#  E !

 < 

*    !

   * >   > #.
< * ".; !!
 >  > ;#
  < *# # !!
 >  > ;#
  < ;#  !
 > 
 

*;# &# *
*;#  #.
*;# 7, ;#
*;# :#  < 



 
n !
!zwraca

korze drzewa.

n !    !4#!zwraca liczb wzw


n !   !4*!!/#!zwraca

podrzdnych wza 4.

wze podrzdny wza

4 o danym indeksie.

n !$/   !4*!! #!zwraca

Wze ten musi by wzem podrzdnym wza 4.

n  ! ! #!zwraca

indeks wza  .

warto , jeli wze   jest

koncepcyjnym liciem.
n  !)   )  ! #
n  !" )   )  ! #

Dodaj i usuwaj obiekty nasuchujce powiadamiane w momencie zmiany


danych modelu.
n  ! . ,  ),!4*!!  #! metoda

wywoywana, gdy edytor komrki zmodyfikowa wze.


Parametry: 4
  

cieka do zmodyfikowanego wza,


nowa warto zwrcona przez edytor.

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

433


    
n  !%   )  '!#
n  !% $ )  '!#
n  !% 
"  )  '!#
n  !  )  '!#

Wywoywane przez model drzewa, gdy jego dane ulegy zmianie.


 "
n )  ' ! *!),! #!tworzy

Parametry:  


 

model zdarze drzewa.

model drzewa generujcy zdarzenia,


cieka do wza, ktry zosta zmodyfikowany.

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

Java 2. Techniki zaawansowane

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#    &  


Korzystajc z obu przedstawionych wyej tablic, tworzymy tabel. Umoliwiamy nastpnie


jej przewijanie, obudowujc j panelem klasy  ,.
6# #  
6#    .2#. !
 "# *#  
 "# #!

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.

Zaawansowane moliwoci pakietu Swing

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

Java 2. Techniki zaawansowane


6 "#6#!
+ I1F6J J413J6!
6# #  
6#    .2#. !
& "# !# 
 "# #!
K  # &4264%!

*;# 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 &  


2* 
F  ?M]OO! 
1 ^!
K #6%L4 &  


"  
F  ''N]! 
1 '!
K #E:4 &  #


*;#   .2#. 

"# %#   0   3#    &  

*;# # <#  I1F6J  M((
*;# # <#  J413J6  ?((


Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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

Metoda   wyznacza odpowiedni warto i formatuje j:


* 7, $#:    !

 #   > .%#! ) '(((
 *  

438

Java 2. Techniki zaawansowane


 <K##  12161:5K::2&4
@ 0#*
' > # * !

2.E .#&1 # !< .# <K##!


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 # !< .# #!


Kompletny kod rdowy programu zawiera listing 6.10.


Listing 6.10. InvestmentTable.java
.*  ,#;##
@
.*  ,#;##
;@
.*  ,#;#A@
.*  ,#;#A
@
.*  ,#;#A
#@
)@@
" #. 
+B #H
*#
C#  . 
@)
* # 1; .6#

* # ;  .#  # !

E#. <#.  
1; .6#E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!


)@@
%#.# +#
#,B# #H 
 ,
@)
# 1; .6#E#. A E#.

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing


* 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

Java 2. Techniki zaawansowane



 #   > .%#! ) '(((

2.E .#"1 # !< .# #!

*;#  # 
*;#  .%#
*;#  .#A%#
*;# #  12161:5K::2&4  '((((((


Prezentacja rekordw bazy danych


Prawdopodobnie najczciej reprezentowan przez komponent tabeli informacj jest zbir
rekordw pochodzcych z bazy danych. Korzystajc ze rodowiska tworzenia aplikacji,
dysponujemy prawie zawsze gotowymi komponentami JavaBeans dla wykorzystania bazy
danych. Warto jednak zobaczy, w jaki sposb sami prezentowa moemy za pomoc tabeli dane z bazy i temu zadaniu suy kolejny przykad. Rysunek 6.29 pokazuje efekt jego
dziaania wynik zapytania o wszystkie rekordy wybranej tabeli bazy danych.
Rysunek 6.29.
Prezentacja
wyniku zapytania
za pomoc tabeli

Przykadowy program definiuje wasny model danych za pomoc klasy


 )  
 , ktry pobiera dane bdce wynikiem zapytania do bazy danych. (Rozdzia 4. powicony jest dostpowi do baz danych w jzyku Java).
Liczb kolumn i ich nazwy uzyskujemy, korzystajc z obiektu " reprezentujcego metadane opisujce zbir rekordw:

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

441

*  & .2#.  !





  . & .2#.  > '!

# `4A*  !

  


*  & .&  !



  . & .&  !

# `4A*  !

  



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*  !

  



Wykorzystanie w tym przypadku wasnego modelu danych zamiast domylnego modelu


3 )   posiada szczeglny sens. Jeli utworzylibymy wasn tablic wartoci,
to niepotrzebnie duplikowalibymy zawarto bufora sterownika bazy danych.
Jeli baza danych nie dysponuje przewijalnymi kursorami lub korzystamy ze sterownika
zgodnego ze specyfikacj JDBC 1, to sami musimy buforowa wynik zapytania. Program
ukazany w przykadzie umoliwia zarzdzanie takim buforem. Klasa 
 )
   buforuje wynik zapytania, natomiast klasa  
 )   wykorzystuje przewijalny kursor. Funkcjonalno wspln dla obu klas wyodrbnilimy w klasie

 )   .
Listing 6.11. ResultSetTable.java
.*  ,#;##
@
.*  ,#;##
;@
.*  ,#;# @
.*  ,#;# @

442

Java 2. Techniki zaawansowane


.*  ,#;#@
.*  ,#;#A
@
.*  ,#;#A
#@
)@@
" #. *+,B
 +#*## #+ #
+# * . B  .*  #
@)
* # % 6#

* # ;  .#  # !

E#. <#.  
% E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!


)@@
%#.# +#
#,B#  H  +
,#B . 8
#,BB
/ #
#+ #  #H *+,BB ,,   
@)
# % E#. A E#.

* % E#. !

6 % !
+ I1F6J J413J6!
)@
+#, ,
+  # #+ #
 . ++# , # -  +
,#,
@)
& #  "#  & "# !
#2#.  
& . K A !
#2#. # :   

:   !



* ;  # "< . : 4; ;!



<  "# Y !
& "# !. ;  "#!
 #2#.
 !#2#.  1. !
<  Y !    !
   44&6 @ E%70  > #2#.
  #A` !
<  !
. 
 
 % 6#0   !
 
.   
&#% 6#0   !
6# #  
6# . !
 "#  
 "# #!

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

& "# !#  "#


K  # &4264%!
*# !
#  !

# `4A*  !

*#6# !


!
"# *  
"# !
*# #2#. !
 "## * K  # 27%6J!


   &   !
F### 0#F## .#   0#F## !
< .# **  % 6*
% 6a"45&%751242161$4!!

   
#   ##.
% 6a"45&%751242161$4
% &72&L%5%4:F572a!

 

#   ##. !
   <# 

%  #  .#6#   

  6:K4 !

 # A !!
#2#. # 1. #  N!!
#   !

# 174A*  !

*#6# !

# `4A*  !

*#6# !

# I
  

I
: #* !

* ; 

&  I
4; ;!



   !

# `4A*  !

443

444

Java 2. Techniki zaawansowane



*#6# !


!

)@@
6
+ * CB+ #+ #  + #,B
+
C#-
- +#* #
* ### * * 
R * CB+ #+ #
@)
* # &   &   !

`4A*  174A* 

" * * *  
" * !
E1*#. 
 
E1*#.  ### * * !
* *  # !
  !
 ;  * * " * ,  ; !
< ; Y !
 . " * ,  ;  ; !
   * * " * , !
  #.  * * " * ,  #.!
 *#
  * * " * , *#
 !

F;0##&     #. *#
 !

*;#  "#  "#
*;# % 6#0  . 
*;# & . K A #2#. 
*;# %   
*;# &    
*;# #. #
*;#  #  
*;# # <#  I1F6J  M((
*;# # <#  J413J6  N((

)@@
X# # #+
# .  #  + #,B + *+
,#
 /
 < ,B
 +#*##
"+
,
 +#*##  , .# #
@)
# # # % 6#0  A : #6#0 

)@@
6
+ .  #
R*##. #%  +/   /

@)
* % 6#0  %  #% !

  #% 


Rozdzia 6.

Zaawansowane moliwoci pakietu Swing


 .   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

Java 2. Techniki zaawansowane


*  % 6#0  %  #% !

* #% !

* 7, $#:    !



%    %  !
 #   > '!
  7,  > '!

# `4A*  !

*#6# !
 


*  %
&  !



%    %  !
 #  !
  %
!

# `4A*  !

*#6# !
 (



)@
X# # < ,B# +/   /
H B
. +#*##
L8
##     *+
,# B  H*
@)
# &#% 6#0  A % 6#0 

* &#% 6#0  %  #% !

* #% !


#  
:#  !
    & .&  !
%    %  !
)@
L. ++# #
# * ##  
/, .#. B # * 7,
2 . 8.
 + #9 # 7,
* 
#8  +#. +   /

@)

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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

Java 2. Techniki zaawansowane


Sortowanie tabeli nie powoduje jednak uporzdkowania danych modelu. Za posortowanie
danych odpowiedzialny jest bowiem model filtra.
Przechowuje on referencj do modelu tabeli. Gdy komponent tabeli pobiera wiersz do prezentacji, to model filtra wyznacza rzeczywisty wiersz tabeli i pobiera go z modelu tabeli.
Oto przykad
* 7, $#:    !

 . $#  

  !


Wywoania pozostaych metod przekazywane s po prostu do oryginalnego modelu tabeli.


*  & .2#.  !

 .  & .2#. !


Rysunek 6.31 pokazuje sposb, w jaki model filtra wspdziaa z obiektem klasy ) 
i rzeczywistym modelem tabeli.
Rysunek 6.31.
Model filtra tabeli

Z implementacj takiego filtra zwizane s dwa zagadnienia. Po pierwsze, gdy uytkownik


kliknie dwukrotnie jedn z kolumn, to model filtra musi otrzyma informacj o tym. Nie
bdziemy omawia zwizanych z tym szczegw implementacji. Odpowiedni kod odnajdziemy wewntrz metody   klasy  .   w tekcie listingu 6.12.
Dziaa on w nastpujcy sposb. Najpierw pobieramy komponent nagwka tabeli i dodajemy do niego obiekt nasuchujcy zdarze zwizanych z mysz. Kiedy wykryje on dwukrotne kliknicie, musi uzyska informacj o kolumnie, ktrej ono dotyczy. Nastpnie
przeoy kolumn komponentu tabeli na kolumn modelu, poniewa uytkownik mg je
poprzestawia. Znajc kolumn, moe rozpocz sortowanie danych.
Z sortowaniem danych zwizane jest kolejne zagadnienie. Poniewa nie chcemy sortowa
danych oryginalnego modelu tabeli, to musimy uzyska sekwencj indeksw wierszy, ktra
pozwoli na ich prezentacj przez komponent w uporzdkowanej kolejnoci. Jednak algorytmy sortowania dostpne w klasach 2 i   nie udostpni nam takiej informacji. Moemy oczywicie sami zaimplementowa algorytm sortowania, ktry pozwoli
ledzi sposb uporzdkowania obiektw. Istnieje jednak sprytne rozwizanie tego problemu. Polega ono na dostarczeniu wasnych obiektw i wasnej metody porwnania bibliotecznym algorytmom sortowania.
Sortowa bdziemy obiekty typu
. Obiekt taki zawiera indeks  wiersza w modelu. Dwa
takie obiekty porwnywa bdziemy nastpujco: odnajdziemy je w modelu i porwnamy.
Innymi sowy metoda  "4) dla obiektw klasy
zwraca bdzie wynik nastpujcego porwnania:
. $#: ' ! .*#6 .  $#: ? !!

gdzie 9 i = s indeksami obiektw klasy


, a  jest kolumn, wedug ktrej sortowana
jest tabela.

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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  . 
*;#  & .
*;# %
 



W konstruktorze tworzymy tablic  , ktr inicjujemy w taki sposb, e  <:


*  E0  6#0  .!

.   .

 
%
. %
&  !
<     (  = 
 >>!


  
%
!

 A  



Metoda   korzysta z algorytmu metody 2:  do sortowania obiektw klasy


.
Poniewa metoda porwnania korzysta z elementw odpowiedniej kolumny, to elementy te
s uporzdkowane w ten sposb, e  > zawiera indeks najmniejszego elementu w kolumnie,  9 nastpnego najmniejszego elementu itd.
Gdy tablica jest sortowana, to powiadamiamy wszystkie obiekty nasuchujce zmian w modelu (w szczeglnoci ) ), e zawarto tabeli ulega zmianie i musi zosta narysowana
od nowa.
* ;    !

& .  

450

Java 2. Techniki zaawansowane


:#   
!
<6#F##&# !


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.

Zaawansowane moliwoci pakietu Swing

& "# !# 


 "# #!
K  # &4264%!
)) #,  # C,B
  H9
)) . +
#C/
 #
#6#J#  !# 0    

0  : #* !

* ;  .  & 0  4; ;!

)) +
  HU
< ;&&  ! = ?! 
)) *#
+# # /,  .
 #& .
 # .:"  ;"  !!
)) +#.#    . #    .
. 
))  , ,B
 . & .
 # ;& .1 A6 0  #& .!
  . & .!

!

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

Java 2. Techniki zaawansowane



2* 
F  ?M]OO! 
1 ^!
K #6%L4 &  


"  
F  ''N]! 
1 '!
K #E:4 &  #


*;#   .2#. 

"# %#   0   3#    &  

*;# # <#  I1F6J  M((
*;# # <#  J413J6  ?((

)@@
0  #
 + ,B # .  #
 ,B
 + #
 C
#,  .
@)
#  E0  A : #6#0 

)@@
6
+ .  <# ,B 
R*##. .
,-
 .  #
@)
*  E0  6#0  .!

.   .

 
%
. %
&  !
<     (  = 
 >>!


  
%
!

 A  


)@@
 ,
 + #
R*##.   .#
 C /, 
# H 
#
@)
* ;    !

& .  
:#   
!
<6#F##&# !

)) F# * 8 + . .  #,*
+ #9
+#+ 
)) *
 
 +
* 7, $#:    !

 . $#: 
 A !


Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

*  #  &4 #    !



 .  &4 # 
 A !

* ;  $#: 7, #$#    !

.  $#: #$# 
 A !

)) * + #C

C## . 
# B . 
,-

*  %
&  !

 . %
&  !

*  & .&  !

 . & .&  !

*  & .2#.  !

 . & .2#. !

* &# & .&#  !

 . & .&# !

)@@
X# #

H+# *+
,B#  
 +#
. 
I + * /

# B +# * . B
# - .  #
 .

 C /, 
## ,  ##
@)
*;# # %
.*. & .*##

*   A
*   .*#6 7, !

%
%
 %
! 
7, #  . $#:  A & .!
7,   . $#: %
 A & .!
< #  # < & .*##!
 & .*##!#! .*#6 !
 
 #  ! .*#6   !!
))   A P %
 A


*;# 6#0  . 
*;#  & .
*;# %
 



453

454

Java 2. Techniki zaawansowane


 
n !
 #
n ! "  #

Zwracaj liczb wierszy i kolumn w modelu tabeli.


n !  ! *!! "#!zwraca

warto w danym wierszu

i kolumnie.
n  !  !  *!! *!! "#!nadaje

warto

obiektowi w danym wierszu i kolumnie.


n  !  '  ! *!! "#!zwraca

warto , jeli komrka

w danym wierszu i kolumnie moe by edytowana.


n ! "%" ! "#!zwraca

nazw (tytu) kolumny.


 #  
n  !) 3  #!zawiadamia

wszystkie obiekty nasuchujce danego

modelu tabeli o zmianie danych.


 
n ) 1!)  #!zwraca
n ! ",  , !4#!zwraca

komponent nagwka danej tabeli.

numer kolumny tabeli, ktra zawiera piksel 4.

n !  "$/)   !  "#!zwraca

indeks kolumny
w modelu dla danej kolumny w tabeli. Wartoci te s rne, jeli kolumny tabeli
zostay poprzestawiane lub ukryte.

Rysowanie i edytowanie zawartoci komrek


Kolejny przykad znowu bdzie prezentowa w tabeli dane o planetach, ale tym razem wyposaymy tabel w informacj o typie kolumn. Jeli zdefiniujemy metod
&# & .&#   .1 A!

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.

Zaawansowane moliwoci pakietu Swing

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

W przypadku innych typw dostarczy moemy wasnych obiektw rysujcych. Przypominaj


one w dziaaniu obiekty rysujce komrki drzewa, ktre przedstawilimy, omawiajc komponent drzewa. Implementuj one interfejs )  
 posiadajcy pojedyncz metod:
& .*  6#&% & .*  6# #
7, ;#  #     # # E  
 
   .!

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

Java 2. Techniki zaawansowane


# F<#%  &  # 

&  6#&%  !!

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

Klasa )   definiuje metod   ' , ktra zawsze zwraca


warto  . Klasa 3 )   zastpuje j z kolei implementacj, ktra
zawsze zwraca warto .

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.

Zaawansowane moliwoci pakietu Swing

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.
& . K A . & .  
& . K A !
<     (  = ?( >>!
. & . # 1. 
1 !!

458

Java 2. Techniki zaawansowane


Nastpnie utworzymy obiekt klasy 3   ' , przekazujc list jako parametr jego
konstruktora:
6#&4   . 4    
F<#&4   . & . !

Musimy jeszcze zainstalowa utworzony edytor. W przeciwiestwie do edytora kolorw


nie zwiemy go z okrelonym typem, poniewa nie chcemy, by uywany by przez tabel
dla wszystkich komrek typu $. Zamiast tego zainstalujemy go jedynie dla okrelonej kolumny tabeli.
Klasa )  przechowuje informacj o kolumnach tabeli, korzystajc z obiektw typu )
  ". Klasa )  "  zarzdza natomiast kolumnami. (Rysunek 6.34 przedstawia zalenoci midzy najwaniejszymi klasami zwizanymi z tabelami). Jeli nie planujemy dynamicznie umieszcza w tabeli nowych kolumn bd usuwa istniejcych, to nie
musimy korzysta z usug modelu kolumn tabeli z wyjtkiem sytuacji, w ktrej chcemy
uzyska obiekt )  " dla pewnej kolumny:
Rysunek 6.34.
Zalenoci midzy
klasami tabel

6#& .0   .0   #& .0  !


6#& . . & .
  .0 & . "#6#0 07725&7L02!

Dysponujc obiektem kolumny, moemy zainstalowa edytor jej komrek:


. & . &4   . 4  !

Jeli chcemy zmieni wysoko komrek tabeli, skorzystamy z poniszej metody.


# %
J !

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.

Zaawansowane moliwoci pakietu Swing

459

Tworzenie wasnych edytorw


Jeli uruchomimy przykadowy program i wybierzemy za pomoc myszy komrk zawierajc kolor, to otworzy si okno dialogowe wyboru koloru. Uytkownik moe wybra nowy kolor i zaakceptowa go przyciskiem OK, co spowoduje zmian koloru komrki tabeli
(patrz rysunek 6.35).
Rysunek 6.35.
Wybr koloru komrki

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

Java 2. Techniki zaawansowane


Klasa )  wywouje edytor dla danego zdarzenia (na przykad kliknicia mysz), aby
sprawdzi, czy spowoduje ono rozpoczcie procesu edycji. Klasa   '  definiuje metod akceptujc wszystkie zdarzenia.
*  #  &4 # 4;7, #4;!

 


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  $# !

   & &   !


Podsumowujc, edytor powinien:


1. rozszerza klas   '  i implementowa interfejs )   ' ,
2. definiowa metod )   '  "4 , ktra zwraca nieinteraktywny

komponent w przypadku gdy edytor otworzy wasne okno dialogowe


lub komponent umoliwiajcy edycj wewntrz komrki (na przykad
lista rozwijalna bd pole tekstowe),

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

461

3. definiowa metody      ,  4  ' i   '

obsugujce rozpoczcie, zakoczenie i przerwanie procesu edycji; metody


 4  ' i   ' wywoywa powinny te same metody
klasy bazowej, aby zapewni powiadomienie obiektw nasuchujcych,
4. definiowa metod   '   zwracajc now warto komrki

powsta w procesie edycji.


Na koniec musimy jeszcze wywoa metody  4  ' i   ', gdy
uytkownik zakoczy edycj. Tworzc okno dialogowe wyboru kolorw, opracujemy take
obiekty nasuchujce jego przyciskw, ktre wywoaj wspomniane metody.
  F#   &  & #F#  
"# &   <#    & 


:   ! ))  # C,B *+  7X



* ;  # "< . : 4; ;!

 *&4  !




:   ! ))  # C,B *+  &#



* ;  # "< . : 4; ;!

#&4  !

!

Proces edycji powinien zosta przerwany take na skutek zamknicia okna dialogowego.
Osigniemy to, instalujc obiekt nasuchujcy okna:
  F# # I
  

I
: #* !

* ; 

&  I
4; ;!

#&4  !

!

W ten sposb zakoczylimy implementacj wasnego edytora komrek.


Wiemy te, w jaki sposb umoliwi edycj komrek i zainstalowa edytor. Pozostaje jeszcze tylko powiadomienie modelu tabeli o zmianie wartoci edytowanej komrki. Po zakoczeniu edycji komrki klasa )  wywouje nastpujc metod modelu tabeli:
;  $#: 7, ;#    !

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

Java 2. Techniki zaawansowane


Jeli obiekt   nie posiada odpowiedniego typu, naley go w taki przeksztaci. Sytuacja
taka najczciej zdarza si, gdy liczba edytowana jest w polu tekstowym. W naszym przykadzie lista rozwijalna wypeniona zostaa obiektami klasy $, dlatego te nie ma
potrzeby konwersji typu.

Listing 6.13. TableCellRenderTest.java


.*  ,#;##
@
.*  ,#;##
;@
.*  ,#;#@
.*  ,#;#A
@
.*  ,#;#A
;@
.*  ,#;#A
#@
)@@
" #. .  ,B
 + # /
 ,B  ./
   /
 ./ #
@)
* # 6#&% 6 

* # ;  .#  # !

E#. <#.  
6#&% E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!


)@@
%#.# +#
#,B# #H # *##
@)
# 6#&% E#. A E#.

* 6#&% E#. !

6 6#&% 6 !
+ I1F6J J413J6!
6#0  .   
"#6#0  !
6# #  
6# . !
))  #,   ,B    
# F<#%  &  # 

&  6#&%  !!
# F<#4   &  # 

&  6#&4   !!
& . K A . & .  
& . K A !
<     (  = ?( >>!
. & . # 1. 
1 !!
6#& .0   .0   #& .0  !
6#& . . & .
  .0 & . "#6#0 07725&7L02!
. & . &4   
F<#&4   . & . !!

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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

Java 2. Techniki zaawansowane


* # <#  3:47L5&7L02  N
* # <#  &77%5&7L02  M
*;# 7,  


0 
F  ?MM(! 
1 (!
K #E:4 &  


1.#1  0<!


$  
F  O(Q?! 
1 (!
K #E:4 &  


1.#1  $ <!


4# 
F  ON]^! 
1 '!
K #E:4 &  

1.#1  4#<!


0#  
F  NN_]! 
1 ?!
K #E:4 &   

1.#1  0# <!


* 
F  ]'M_?! 
1 'O!
K #6%L4 &   #

1.#1  *<!


# 
F  O(?O^! 
1 '^!
K #6%L4 &   #

1.#1  #<!


L#  
F  ?QQQ_! 
1 ']!
K #6%L4 &  

1.#1  L# <!


2* 
F  ?M]OO! 
1 ^!
K #6%L4 &  

1.#1  2*<!


"  
F  ''N]! 
1 '!
K #E:4 &  #

1.#1  " <!


*;#   .2#. 

"# %#   0   3#    &   1.#



Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

)@@
X# #   ,B   
 *#

B+  ./
@)
# &  6#&%  .*. 6#&% 

* & .*  6#&% & .*  6# #
7, ;#  #     # # E  
 
   .!

*# K#  &  !;#!
 *#

)) +
## ,  *# /    C#
)) -  ,  *++  &    ./
*;# "# *#  
"# !

)@@
4   
#,B  # 

    
@)
# &  6#&4   A : #&4  
.*. 6#&4  

&  6#&4   !

*#  
"# !
)) *+ 
,  # 

  &   
&  &  !
  F#   &  & #F#  
"# &   <#    & 


:   ! ))  # C,# *+  7X



* ;  # "< . : 4; ;!

 *&4  !




:   ! ))  # C,B *+  &#



* ;  # "< . : 4; ;!

#&4  !

!
  F# # I
  

I
: #* !

* ; 

&  I
4; ;!

#&4  !

!


465

466

Java 2. Techniki zaawansowane


* & .*  6#&4  & .*  6# #
7, ;#  #     
   .!

)) #, + ,. 8BB
# -9 &  
)) "+
,. ,B
 #
  &  &   &  !;#!
 *#

*  #   & 4;7, #4;!

))  +* +H  ,
  F#  $  !
)) < ., . H

C,BB  +* +H  ,
 

* ;  #&4  !

))  ,# *+
## P +#.#  # 

  F#  $  <# !
*#&4  !

*  #  *&4  !

))  ,# +# D+ # P +#.#  # 

  F#  $  <# !
*  *&4  !
)) < ., . H 8
# -9    ,  +
 #
 

* 7, &4  $# !

   & &   !

*;# &     
*;# &  &    & 
*;# F#    F# 
*;# "# *#



 
n  !
1 !#!nadaje

wszystkim wierszom tabeli wysoko

 pikseli.

n  !
1 ! *!!#!nadaje

danemu wierszowi tabeli

wysoko  pikseli.

n  !
 !"#!okrela

wierszami.

woln przestrze midzy ssiednimi

Rozdzia 6.
n !
1 #!pobiera

Zaawansowane moliwoci pakietu Swing

467

domyln wysoko wszystkich wierszy w tabeli.

n !
1 ! #!pobiera wysoko
n !
 #!pobiera wielko

danego wiersza tabeli.

wolnej przestrzeni midzy ssiednimi

wierszami.
n
 ! 
 ! *!! "*! ! 4#!zwraca

obszar komrki tabeli.


Parametry:  ,  "

wiersz i kolumna tabeli,

 4

warto , jeli obszar uwzgldnia


ma marginesy.

n !  67  #


n !  .   #

Zwracaj kolory uywane dla prezentacji komrki wybranej przez uytkownika.


 
n ! "  ! "$/#!zwraca

klas obiektw danej kolumny.


Informacja ta wykorzystywana jest przez obiekty rysujce i komrki.


  
n "4 !)  
 "4  ) ! *!! *

 ! *! !. *!! *!! "#!zwraca komponent,


ktrego metoda 4 wywoywana jest w celu narysowania komrki tabeli.

Parametry:  

tabela zawierajca rysowan komrk,

 

obiekt rysowanej komrki,

 

warto , jeli komrka jest wybrana,

. 

warto , jeli komrka jest przegldana,

 ,  "

wiersz i kolumna komrki.


  
n )  "! " !/#!zwraca obiekt

kolumny tabeli o danym indeksie.


 
n  !  '  )   ' ! #
n  ! 
 )  
!#

Instaluj edytor i obiekt rysujcy dla wszystkich komrek danej kolumny.

468

Java 2. Techniki zaawansowane


 " 
n 3   '   " 6 /! " 6 /#!tworzy

edytor komrek wykorzystujcy

list rozwijaln do wyboru wartoci.


" 
n  !  '  '!#!zwraca

warto , jeli zdarzenie

rozpocznie proces edycji komrki.


n  !     '!'#!rozpoczyna

proces edycji.
Zwraca warto , jeli edytowana komrka powinna zosta wybrana.
Warto   powinna by zwrcona, jeli nie chcemy, by proces edycji
zmienia wybr komrek.

n  !  ' #!przerywa

proces edycji. Warto powstaa na skutek

edycji moe by porzucona.


n  ! 4  ' #!koczy

proces edycji. Warto powstaa na skutek


edycji moe by wykorzystana. Zwraca warto , jeli warto powstaa
na skutek edycji jest dozwolona i moe by pobrana.

n !  '   #!zwraca

edytowan warto.

n  !  '   ' ! #


n  !"   '   ' ! #

Dodaj i usuwaj obowizkowy obiekt nasuchujcy edytora.


 " 
n "4 !)   '  "4  ) ! *!! *! 

 *!! *!! "#!zwraca komponent, ktrego metoda 4

wywoywana jest w celu narysowania komrki tabeli.


Parametry:  

tabela zawierajca rysowan komrk,

 

obiekt rysowanej komrki,

 

warto , jeli komrka jest wybrana,

 ,  "

wiersz i kolumna komrki.


 !
n     #!tworzy

obiekt wyboru koloru. Pocztkowo wybrany jest kolor

biay.
n !  #
n  !  !#

Pobieraj i ustawiaj kolor wybrany przez obiekt wyboru.

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

469

n !3 !3  "4 !4*!*! *! 

"  *!   ! *! ! 7*! 


 #!tworzy okno dialogowe wyboru koloru.

Parametry: 4

komponent, nad ktrym pojawi ma si okno dialogowe,

 

tytu okna dialogowego,

" 

warto , jeli okno blokowa ma wykonanie


aplikacji do momentu jego zamknicia,

 

obiekt wyboru koloru,

7,
obiekty nasuchujce przyciskw OK i Cancel.
 
n ! ! 3  "4 ! "4 *!! *! ! #

tworzy i wywietla modalne okno dialogowe wyboru koloru.


Parametry:  "4 

komponent, nad ktrym pojawi ma si okno dialogowe,

 

tytu okna dialogowego,

 

pocztkowo wybrany kolor.

Operacje na wierszach i kolumnach


W podrozdziale tym pokaemy, w jaki sposb wykonywa operacje na wierszach i kolumnach tabeli. Podczas lektury tego materiau musimy pamita przede wszystkim, e tabele
biblioteki Swing s asymetryczne, czyli na wierszach mona wykonywa inne operacje ni
na kolumnach. Komponent tabeli zaprojektowano z myl o prezentacji informacji w postaci wierszy o tej samej strukturze, takich jak na przykad rekordy bdce wynikiem zapytania do bazy danych, a nie dla prezentacji dowolnej dwuwymiarowej siatki obiektw.

Zmiana szerokoci kolumn


Klasa )  " udostpnia metody umoliwiajce nadzr nad zmianami szerokoci kolumny wykonywanymi przez uytkownika. Programista moe okreli preferowan, najmniejsz i najwiksz szeroko kolumny, korzystajc z poniszych metod.
;  "< I  
 !
;  0I  
 !
;  0#AI  
 !

Informacja ta wykorzystywana jest przez komponent tabeli podczas jej wywietlania.


Metoda
;  % +#  #  +#!

zezwala lub zabrania uytkownikowi zmienia szeroko kolumny.


Szeroko kolumny mona take zmienia programowo, korzystajc z poniszej metody.
;  I  
 !

470

Java 2. Techniki zaawansowane


Gdy zmieniana jest szeroko kolumny, to domylnie cakowita szeroko tabeli nie ulega
zmianie. Oznacza to, e zmiana szerokoci kolumny spowoduje take zmian szerokoci
kolumn tabeli, lecych od niej na prawo. Zachowanie takie jest o tyle rozsdne, e pozwala uytkownikowi dostosowa szeroko kolejnych kolumn, poruszajc si od lewej
strony tabeli ku prawej.
Zachowanie to moemy zmieni na jedno z wymienionych w tabeli 6.2 za pomoc metody
;  : % +0   . !

udostpnianej przez klas ) .


Tabela 6.2. Tryby zmiany szerokoci kolumn
Tryb

Zachowanie

:L675%41W457EE

Nie zmienia szerokoci innych kolumn, ale szeroko caej tabeli.

:L675%41W4524G65&7L02

Zmienia jedynie szeroko nastpnej kolumny.

:L675%41W45LK4`L4265&7L02

Zmienia rwno szeroko wszystkich nastpnych kolumn.


Zachowanie domylne.

:L675%41W45:65&7L02

Zmienia jedynie szeroko ostatniej kolumny.

:L675%41W45:5&7L02

Zmienia szeroko wszystkich kolumn tabeli. Zachowanie


to najczciej nie jest waciwe, poniewa uniemoliwia
uytkownikowi okrelenie szerokoci wicej ni jednej kolumny.

Wybr wierszy, kolumn i komrek


W zalenoci od trybu wyboru uytkownik wybiera moe wiersze, kolumny bd komrki
tabeli. Domylnym trybem wyboru jest tryb zezwalajcy na wybr wierszy tabeli. Wybranie komrki powoduje automatycznie wybranie caego wiersza (patrz rysunek 6.36). Wywoanie
# %
 :
 <# !

wycza moliwo wyboru wierszy.


Rysunek 6.36.
Wybr wiersza tabeli

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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  . !

Parametr "  przyjmowa moe jedn z trzech wartoci:


  0 1234544&6172
  0 123451264%$:544&6172
  0 0L61"451264%$:544&6172

Wybr kolumn jest domylnie zabroniony. Moemy go umoliwi, wywoujc


# & . :
 !

Zezwolenie na rwnoczesny wybr wierszy i kolumn oznacza moliwo wyboru komrek


tabeli. Uytkownik moe wtedy wybiera zakresy komrek, jak pokazano na rysunku 6.37.
Wybr komrek umoliwi moemy take, korzystajc z metody
# & 4# !

Rysunek 6.37.
Wybr zakresu
komrek tabeli

We wczesnych wersjach biblioteki Swing dopuszczenie rwnoczesnego wyboru wierszy


i kolumn powodowao, e wybranie komrki powodowao automatycznie wybranie zawierajcego j wiersza i kolumny.

Informacj o wybranych wierszach i kolumnach moemy uzyska, wywoujc metody 


 
 i   ". Metody te zwracaj tablice  zawierajce indeksy
wybranych wierszy bd kolumn.
Program, ktrego kod rdowy zawiera listing 6.14, umoliwia obserwacj sposobu wyboru elementw tabeli. Jego menu umoliwia wczanie lub wyczanie moliwoci wyboru
wierszy, kolumn i 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

Java 2. Techniki zaawansowane


"  " jest obiekt klasy )  " . Jeli dysponujemy numerem kolumny (na
przykad zwrconym przez metod   "), to musimy najpierw pobra od

modelu kolumn tabeli odpowiedni obiekt reprezentujcy kolumn:


6#& .0   .0   #& .0  !
6#& .  .   .0 & . !
#. ;& .  .!

Jeli zapamitamy obiekt kolumny, to moemy pniej wstawi go z powrotem do tabeli:


## & .  .!

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#& . . & .1 A!!

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.

Dodawanie i usuwanie wierszy w domylnym modelu tabeli


Klasa 3 )   jest klas konkretn implementujc interfejs )   . Przechowuje ona dwuwymiarow siatk obiektw. Jeli posiadamy ju dane zorganizowane
w postaci tabelarycznej, to oczywicie nie ma sensu kopiowa ich do domylnego modelu
tabeli. Jego zastosowanie jest jednak bardzo wygodne, jeli musimy szybko utworzy tabel reprezentujc niewielki zbir danych. Klasa 3 )   dysponuje przy tym
metodami umoliwiajcymi dodawanie wierszy oraz kolumn, a take usuwanie wierszy.
Metody 
i  " dodaj odpowiednio nowy wiersz lub kolumn. Przekazujemy
im tablic  lub wektor zawierajcy nowe dane. Metodzie  " musimy przekaza take nazw nowej kolumny. Obie metody umieszczaj nowe elementy tabeli na
kocu siatki. Aby wstawi wiersz pomidzy wiersze ju istniejce w tabeli, moemy skorzysta z metody 
. Niestety dla kolumn nie jest dostpna analogiczna metoda.
Metoda " 
usuwa wiersz z modelu tabeli. Rwnie w tym przypadku nie istnieje taka metoda dla kolumn.
Poniewa obiekt klasy )  rejestruje si jako obiekt nasuchujcy modelu tabeli, to widok tabeli jest powiadamiany za kadym razem, gdy wstawiane s lub usuwane dane z modelu. Umoliwia to aktualizacj widoku tabeli.

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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

ukrycie wszystkich wybranych kolumn,

przywrcenie wszystkich kolumn, ktre zostay kiedykolwiek ukryte,

usunicie wybranych wierszy z tabeli,

dodanie wiersza danych na kocu danych modelu.

Przykad ten koczy omwienie komponentu tabel. Zrozumienie sposobw wykorzystania


tabel jest nieco atwiejsze ni w przypadku drzew, poniewa prezentowany za pomoc tabeli
model danych jest prostszy koncepcyjnie. Jednak sama implementacja komponentu tabeli
jest w rzeczywistoci bardziej skomplikowana ni w przypadku komponentu drzewa. Przyczyniaj si do tego moliwoci zmiany szerokoci kolumn, dodawania wasnych obiektw
rysujcych i edytorw. W rozdziale tym skoncentrowalimy si na zagadnieniach, ktre posiadaj najwiksz przydatno w praktyce programisty, a wic prezentacji tabel bazy danych za pomoc komponentu tabeli, sortowaniu tabel oraz wykorzystaniu wasnych obiektw rysujcych i edytorw. Jeli potrzebowa bdziemy informacji dotyczcych bardziej
zaawansowanych lub nietypowych zastosowa tabeli, to po raz kolejny wrcimy do ksiek
Core Java Foundation Classes autorstwa Kim Topley oraz Graphic Java 2 napisanej przez
Davida Gearyego.
Listing 6.14. TableSelectionTest.java
.*  ,#;##
@
.*  ,#;##
;@
.*  ,#;#@
.*  ,#;#A@
.*  ,#;#A
@
.*  ,#;#A
#@
)@@
" #. .  ,B
/ #
#   
#

 + #+  . #
@)
* # 6# 6 

* # ;  .#  # !

E#. <#.  
6# E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!


)@@
%#.# +#
#,B# #+H . 8#
 * # #,B# . . 8
#,B - 
 

 +) .) ./! #+ #
#   
#

 +   .
@)
# 6# E#. A E#.


474

Java 2. Techniki zaawansowane


* 6# E#. !

6 6# 6 !
+ I1F6J J413J6!
)) 
+ #+H . 8#
.   
F<#6#0  '( '(!
<     (  = . %
&  ! >>!
<   ,  ( , = . & .&  ! ,>>!
.  $#:

1  > '! @ , > '!!  ,!
#  
6# . !
& #  "#  & "# !
 "## 
 "# #! &!
. ; & .  
:#  !
)) 
+ .
0K# .K#  
0K# !
0K# .K#!
0  0  
0  !
.K##  0!
<# &K A01. 
1.
 
&K A01. %
!
<# &K A01.  . 1.
 
&K A01. & . !
<# &K A01.  1.
 
&K A01. & !

1.  #%
 :
 !!
 . 1.  #& . :
 !!
 1.  #& 4# !!

1.# :   

:   !



* ;  # "< . : 4; ;!

##  !
# %
 :


1.  !!
 1. 
#& 4# !!

!
 0# 
1.!
 . 1.# :   

:   !



* ;  # "< . : 4; ;!

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing


##  !
# & . :

 . 1.  !!
 1. 
#& 4# !!

!
 0#  . 1.!
 1.# :   

:   !



* ;  # "< . : 4; ;!

##  !
# & 4#
 1.  !!

1. 
#%
 :
 !!
 . 1. 
#& . :
 !!

!
 0#  1.!
0 #0  
0 4 !
.K## #0!
01.  & . 1.  
01. J  & . !
 & . 1.# :   

:   !



* ;  # "< . : 4; ;!

   # & . !
6#& .0   .0 
 #& .0  !
))  
#  . +
  # * +B
+
)) #,
8 +    #  +.#9 ./
 .
<       P '  b ( PP!

6#& .  .
  .0 & .  !
#. ;& .  .!
)) *+
,   . * 
, *+#,
. ; & . #  .!


!
#0#  & . 1.!

475

476

Java 2. Techniki zaawansowane


01. 
& . 1.  
01. 
& . !

& . 1.# :   

:   !



* ;  # "< . : 4; ;!

)) *+
##
+   H B  .
<     (  = . ; & .  + ! >>!
## & .
6#& .!. ; & .  !!
. ; & . # !

!
#0# 
& . 1.!
01. # %
1.  
01. : %
!
# %
1.# :   

:   !



* ;  # "< . : 4; ;!

)) #, 

 + #+ . 8# . 
1 
&
 
1. & .&  !
<     (  = 
&  >>!

&   
1  > '!
@ . %
&  ! > '!!
. # %

& !

!
#0# # %
1.!
01. . ;%
1.  
01. %. ; %
!
. ;%
1.# :   

:   !



* ;  # "< . : 4; ;!

   # %
!
))  
#
 + + .   +* +#,B #,
8 +   
)) #  +.#9 ./

 +
<       P '  b ( PP!
. . ;%
 !

!
#0# . ;%
1.!
01. #& 1.  
01. &# & !
#& 1.# :   

:   !



* ;  # "< . : 4; ;!


Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

477

)) # #,
#.  ./ .
# -9 (
<     (  = #%
&  ! >>!
<   ,  ( , = #& .&  ! ,>>!
< # &  ,!!
# $#: 
1 (!  ,!

!
#0# #& 1.!

*;# F<#6#0  . 
*;# 6# #
*;# :#  . ; & . 
*;# # <#  I1F6J  M((
*;# # <#  J413J6  N((



 
n  !
-  !" #!okrela

Parametry: " 

tryb zmiany szerokoci kolumn.

jedna z wartoci +)(


'$?'(.., +)(
'$?'(
%'@)( +%, +)(
'$?'(+6'A+'%)( +%,
+)(
'$?'()( +%, +)(
'$?'(( +%.

n     !    #!zwraca

model wyboru, ktry umoliwia

nastpnie okrelenie trybu wyboru.


n  !
     !#,!jeli 

posiada warto ,


to kliknicie komrki tabeli powoduje wybranie caego wiersza.

n  ! "     !#,!jeli 

posiada warto ,


to kliknicie komrki tabeli powoduje wybranie caej kolumny.

n  !
  '   !#,!jeli 

posiada warto ,


to moliwy jest wybr poszczeglnych komrek tabeli. Taki sam rezultat
daje wywoanie kolejno metod 
    #
i  "    #.

n  !
    #!zwraca

warto , jeli dozwolony jest

wybr wierszy tabeli.


n  ! "    #!zwraca

warto , jeli dozwolony jest

wybr kolumn tabeli.


n  !    '  #!zwraca

warto , jeli dozwolony wybr

wierszy i kolumn tabeli.


n  ! " )  "! "#!dodaje

kolumn do widoku tabeli.

n  !"  " ! "*!! #!przesuwa

kolumn o indeksie  " w taki


sposb, e jej indeksem staje si  . Operacja ta dotyczy jedynie widoku tabeli.

n  !"  " )  "! "#!usuwa

kolumn z widoku tabeli.

478

Java 2. Techniki zaawansowane


 
n )  " !"  "$/#!tworzy

obiekt reprezentujcy kolumn tabeli

o danym indeksie.
n  !,0 ! #
n  !0 ! #
n  !/0 ! #

Okrelaj preferowan, najmniejsz i najwiksz szeroko danej kolumny.


n  !0 ! #!ustawia

biec szeroko danej kolumny.

n  !
-   !#,!jeli 

posiada warto , to uytkownik moe

zmienia szeroko kolumny.


    
n  !    !" #!okrela

Parametry: " 

tryb wyboru.

jedna z wartoci $%&'('' )$%, $%&'($%)'


(
'' )$% i +)$,'($%)'
('' )$%.


  
n  !
! 3#
n  ! " ! "%"*!! "3#

Dodaje wiersz lub kolumn na kocu modelu danych.


n  !
! *!! 3#!dodaje

wiersz danych na pozycji

o indeksie  .

n  !" 
! #!usuwa

wiersz z modelu.

n  !" 
!*!!*!! #!przesuwa wszystkie wiersze o indeksach

z przedziau od  do  na nowe pozycje zaczynajce si od indeksu  .

Komponenty formatujce tekst


W ksice Java 2. Podstawy omwilimy podstawowe komponenty zwizane z edycj tekstu, takie jak )/.  i )/. Klasy te s przydatne do pobierania tekstu wprowadzanego przez uytkownika. Istnieje take klasa ' ,, ktra wywietla i umoliwia
edycj tekstu zapisanego w formatach RTF i HTML. (Format RTF uywany jest przez szereg aplikacji firmy Microsoft do wymiany dokumentw. Jest sabo udokumentowany
i nawet aplikacje firmy Microsoft maj problemy z jego prawidowym wykorzystaniem.
W ksice tej nie bdziemy zajmowa si wykorzystaniem tego formatu. Sama firma Sun
twierdzi, e obsuga tego formatu w bibliotekach Java jest jedynie fragmentaryczna. Nie
zdziwimy si wic, jeli w kolejnych wersjach zostanie w ogle usunita. Zwaszcza e poprawa wsparcia formatu HTML bdzie kosztowa jeszcze sporo wysiku).

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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

Java 2. Techniki zaawansowane


Jeli zaznaczymy pole wyboru Editable, to panel edytora umoliwi nam edycj zaadowanej strony. Moemy wpisywa w nim tekst lub usuwa go, korzystajc z klawisza Backspace. Panel edytora obsuguje take kombinacje klawiszy Ctrl+X, Ctrl+C, Ctrl+V umoliwiajce wycinanie, kopiowanie i wklejanie tekstu. Jednak umoliwienie formatowania
tekstu wymagaoby jeszcze sporo pracy.
Gdy panel edytora umoliwia edycj strony, to umieszczone na niej hipercza nie s aktywne. Dla niektrych stron edytor pokazuje take teksty etykiet HTML, komentarze i polecenia
jzyka Javascript (patrz rysunek 6.39). Jest to przydatne do sprawdzenia moliwoci komponentu klasy ' ,, ale nie powinno by udostpniane w zwykych programach.

Rysunek 6.39.
Panel edytora
w trybie edycji

Domylnie komponent klasy ' , znajduje si w stanie edycji. Moemy to


zmieni, wywoujc metod  ,:'   #.

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.

Zaawansowane moliwoci pakietu Swing

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

Java 2. Techniki zaawansowane


@)
* # 4  "#6 

* # ;  .#  # !

E#. <#.  
4  "#E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!


)@@
%#.# +#
#,B# *#   # *   
  *+   #
. 8
#,B
*
# + #   L%  +#C#
#  
# #8 *+  K# . 8
#,B *
/ * *+ ,  
@)
# 4  "#E#. A E#.

* 4  "#E#. !

6 4  "#6 !
+ I1F6J J413J6!
<# # #  
# !
<# 4  "#   "#  
4  "# !
<# 6AE   
6AE N(!
))  #,  # C,B *CB+#
  "# 4 # <# !
  "## J*  

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+   ,
<# &K A  #  
&K A !
 ## :   

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

:   !



* ;  # "< . : 4; ;!

  "# 4 #  #  !!

!
)) 
+  # C,B *+   #
:      

:   !



* ;  # "< . : 4; ;!



)) +#*#.H, #  L% # * + *+  K#
#*  6A !!
  "# "# 6A !!

# 174A*  !

  "# 6A 4A* V  > !



K   # K   
K   # !
 # K # :    !
# :    !
)) 
+  # C,B *+  K#
K  #K   
K  K#!
#K # :   

:   !



* ;  # "< . : 4; ;!

< # + ! = '! 


)) * # #  L%
#* * !
)) *+, #  L%
*   
.
   !#* !
 6A !
  "# "# !

# 174A*  !

  "# 6A 4A* V  > !


!

483

484

Java 2. Techniki zaawansowane


& #  "#  & "# !
 "## 
 "#   "#!
K  # &4264%!
)) . ++#
+   .*  # C/
. *# #
"# *#  
"# !
*## 
# L%!!
*## !
*##  # K !
*## #K !
*## 
# 4 #!!
*##  #!
 "## *# K  # 7L6J!

*;# # <#  I1F6J  O((
*;# # <#  J413J6  M((



 "   
n  !, +
! #!aduje

stron o adresie  do panelu edytora.

n  !124 7 124 7! #!instaluje

obiekt

nasuchujcy panelu edytora.


 $% &   
n  !24 7+4 124 7'!#!wywoywana,

gdy hipercze

zostanie wybrane.


$% &"
n +
!+
 #!zwraca

adres URL dla wybranego hipercza.

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.

Zaawansowane moliwoci pakietu Swing

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.
"# 76 4A*# # !

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:
"# &   #  !

W naszym przykadowym programie dolna linia podziau posiada domylne waciwoci


(brak cigego odrysowywania). Jej przeciganie powoduje jedynie przesuwanie si ciemnej linii. Dopiero jej docelowe ustawienie powoduje odrysowanie komponentw.
Dziaanie programu z listingu 6.16 jest bardzo proste. Wypenia on komponent listy nazwami planet. Wybr jednej z nich sprawia, e w prawej czci panelu wywietlany jest obrazek planety, a w dolnej jej opis. Polecamy wyprbowanie i porwnanie dziaania obu
linii podziau.

486

Java 2. Techniki zaawansowane

Listing 6.16. SplitPaneTest.java


.*  ,#;##
@
.*  ,#;##
;@
.*  ,#;#@
.*  ,#;#A
@
.*  ,#;#A
;@
)@@
" #. .  ,B
 + #  .*  *# +  
@)
* # *"#6 

* # ;  .#  # !

E#. <#.  
*"#E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!


)@@
%#.# +#
#,B#
# *# + 
-
#,B * *#
@)
# *"#E#. A E#.

* *"#E#. !

6 *"#6 !
+ I1F6J J413J6!
)) 
+  .*  # *+#, #+
 *  *#
)) #+  #+/

<#   *#   


  *# !
<# # *#1.#  
# !
<# 6A:#  *   
6A:# !
*# #     

    !



* ;  ;#&#   4; ;!

"# ;#
 "#!*#  $# !
)) ##+, #+  *
*#1.# 1  ;#1.# !!
 *  6A ;#F *  !!

!
)) 
+ *# + 
*"# "#
 
*"# *"#J7%1W726:5"16
*#  *#1.#!

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

"# &   #  !


"# 76 4A*# # !
*"# "#
 
*"# *"#$4%61&:5"16
"#  * !
& "# !# "# K  # &4264%!

*;# "# *# 


"# 0 ?MM( (!

"# $  O(Q? (!

"# 4# ON]^ '!

"# 0#  NN_] ?!

"# * ]'M_? 'O!

"# # O(?O^ '^!

"# L#  ?QQQ_ ']!

"# 2* ?M]OO ^!

"# "  ''N] '!

*;# # <#  I1F6J  N((
*;# # <#  J413J6  ?((

)@@
X# # *+,B# *#
@)
# "#

)@@
6
+  *+,B *#H
R*##.  #+
# *#
R*##.  * .D *#
R*##. . +#  H8/

@)
* "#      .!
 #.  
#   
.   .
.#  
1.#1  #. > <!

*    !

 #.

)@@
" # * *#
R *
@)
*  F *  !

 %#  V  > #  > \0  V  > .  > \

)@@

487

488

Java 2. Techniki zaawansowane


" # #+ *#
R #+
@)
* 1.#1  1.# !

 .#

*;#  #.
*;#  #  
*;#  .  
*;# 1.#1  .#



   
n 4 , #
n 4 , ! #
n 4 , ! *! !  2 #
n 4 , ! *! "4 !*! "4 ! #
n 4 , ! *! !  2 *! "4 !*

"4 ! #

Tworz nowy panel dzielony.


Parametry:  !

jedna z wartoci 4 ,:1


$?%)(,$)
lub 4 ,:'
)$ (,$),

  2  warto , jeli komponenty maj by

odrysowywane podczas przesuwania linii podziau,


,  

komponenty, ktre maj by umieszczone


w czciach panelu.

n  !) '/4  #
n  !) '/4   !#

Umoliwiaj sprawdzenie oraz wczenie waciwoci linii podziau polegajcej


na moliwoci maksymalizacji czci panelu.
n  !  2  #
n  !  2   !#

Umoliwiaj sprawdzenie oraz wczenie waciwoci linii podziau polegajcej


na odrysowywaniu zawartoci komponentw panelu podczas przesuwania linii
podziau.
n  ! "4  "4 !#
n  !) 4 "4  "4 !#

Obie metody daj ten sam efekt umieszczaj komponent  w pierwszej czci panelu.

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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

Tworzc panel z zakadkami, konstruujemy najpierw obiekt klasy ),, a nastpnie


dodajemy do niego zakadki.
6# "# # "#  
6# "# !
# "## 6#     .* !

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 

):

# "# 6#     .*   A!

Natomiast ponisze wywoanie spowoduje usunicie zakadki:


# "#. ;6#:  A!

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:
# "#  1 A # "#6#&  ! P '!

490

Java 2. Techniki zaawansowane


Jeli panel zawiera wiksz liczb zakadek, to mog one zajmowa zbyt duo miejsca.
Dlatego te w SDK 1.4 wprowadzono moliwo przewijania pojedynczego wiersza zakadek (patrz rysunek 6.42).

Rysunek 6.42.
Panel z przewijaniem
zakadek

Moemy wybra uoenie wszystkich zakadek w kilku wierszach bd przewijanie ich


w jednym wierszu, wywoujc odpowiednio:
# "# 6## "  6# "#I%:"56:K5:a7L6!

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:
* ;  #&# &#4; ;!

   # "# 1 A !
  


W programie z listingu 6.17 wszystkie komponenty zakadek maj na pocztku warto


 . Kiedy zakadka jest wybierana, to sprawdzamy, czy jej komponent nadal jest wartoci  . Jeli tak, to adujemy obrazek. (Dzieje si to, zanim wybrana zakadka zostanie
pokazana i wobec tego uytkownik nie zobaczy pustej zakadki). Zmieniamy take ikon
zakadki z tej na czerwon, aby zaznaczy, ktre zakadki byy ju przegldane.

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

Listing 6.17. TabbedPaneTest.java


.*  ,#;##
@
.*  ,#;##
;@
.*  ,#;#@
.*  ,#;#A
@
.*  ,#;#A
;@
)@@
" #. .  ,B +# 
# *# + +#C# #.
@)
* # 6# "#6 

* # ;  .#  # !

E#. <#.  
6# "#E#. !
<#. F<#& 7*#  E#.4G165725&74!
<#. 
!


)@@
%#.# +#
#,B# *# + +#C# #. #+ *+ 
. 8
#,B *+CB+# *  *+#, +#C# 
@)
# 6# "#E#. A E#.

* 6# "#E#. !

6 6# "#6 !
+ I1F6J J413J6!
<# 6# "# # "#  
6# "# !
)) +#C#
#  .* /
+#C#  C# #.
)) . .  *
+, *+#,
1.#1     
1.#1  
P#<!
# "## 6#
# "## 6#
# "## 6#
# "## 6#
# "## 6#
# "## 6#
# "## 6#
# "## 6#
# "## 6#

0   !
$    !
4#   !
0#    !
*   !
#   !
L#    !
2*   !
"    !

& "# !# # "# &!


# "## &#  

&#  !

* ;  #&# &#4; ;!


491

492

Java 2. Techniki zaawansowane


)) *#
+# + # +#C#  . ++  ,  ,8  .* 
< # "# & .*  !  !

)) C# , #+
   # "# 1 A !
   # "#6: !
1.#1  *#1 
 
1.#1   > <!
# "# & .* : 

# *#1 !!
)) +#+#+# 8 +#C# # C# ,8 *+B ##
# "# 1 : 

1.#1   P#<!!


!
"#  "#  
"# !
K 3 *  3 *  
K 3 * !
%#  K 
#*K   
%#  K  I#* # !

#*K # :   

:   !



* ;  # "< . : 4; ;!

# "# 6## " 
6# "#I%:"56:K5:a7L6!

!
 "##
#*K !
 3 *#
#*K !

#*K   !
%#  K   K 
 
%#  K    # !
 K # :   

:   !



* ;  # "< . : 4; ;!

# "# 6## " 
6# "#&%756:K5:a7L6!

!
 "##  K !
 3 *#  K !
& "# !#  "# K  # 7L6J!

*;# # <#  I1F6J  M((
*;# # <#  J413J6  N((


Rozdzia 6.

Zaawansowane moliwoci pakietu Swing


   
n ), #
n ), !4 "#

Tworz panel z zakadkami.


Parametry: 4 "

jedna z wartoci   :),,


  :'.),   :
$&1)
lub   :6)).

n  !) ! *! "4 ! "4 #


n  !) ! *!$ ! *! "4 !#
n  !) ! *!$ ! *! "4 !*!! )4#

Dodaj zakadk do panelu.


n  !) ! *!$ ! *! "4 !*!! )4*!

/#!umieszcza now zakadk na pozycji o podanym indeksie.

n  !" ) !/#!usuwa

zakadk o podanym indeksie.

n  ! $/ !/#!wybiera


n ! $/ #!zwraca

zakadk o podanym indeksie.

indeks wybranej zakadki.

n "4 !  "4  #!zwraca

komponent wybranej zakadki.

n !)  !/#


n  !)  !/*!! #
n $ !$  !/#
n  !$  !/*!$ ! #
n "4 ! "4  !/#
n  ! "4  !/*! "4 !#

Pobieraj lub ustawiaj tytu, ikon lub komponent zakadki o danym indeksie.
n !/) $ ! #
n !/) ! #
n !/) "4 !#

Zwracaj indeks zakadki o danym tytule, ikonie bd komponencie.


n !)  #!zwraca

liczb zakadek panelu.

n  !)2 , 2 !4 2#!ustala

sposb prezentacji zakadek


w wielu wierszach lub jednym przewijanym.
Parametry: 4 2

jedna z wartoci ),:0


,()6(C+)
lub ),:
()6(C+).

n  !  ! #!instaluje

obiekt nasuchujcy
powiadamiany w momencie wybrania przez uytkownika zakadki.

493

494

Java 2. Techniki zaawansowane

Panele pulpitu i ramki wewntrzne


Aplikacje czsto prezentuj informacje, korzystajc z wielu okien umieszczonych we wsplnej ramce. Zwinicie takiej ramki do ikony rwnoznaczne jest z ukryciem zawartoci wszystkich jej okien. W rodowisku Windows ten sposb dziaania interfejsu uytkownika nazwany
zosta MDI (Multiple Document Interface). Rysunek 6.43 pokazuje typow aplikacj korzystajc z interfejsu MDI.
Rysunek 6.43.
Aplikacja
korzystajca z MDI

Do niedawna by to jeden z popularniejszych sposobw tworzenia interfejsu aplikacji, ale


ostatnio wykorzystywany jest rzadziej. Wikszo przegldarek internetowych otwiera
strony internetowe, uywajc ramek tego samego poziomu co gwna ramka programu.
(Wyjtkiem jest tutaj przegldarka Opera pokazana na rysunku 6.43). Ktry ze sposobw
organizacji interfejsu uytkownika jest lepszy? Oba posiadaj zalety i wady. Wykorzystanie
MDI pozwala ograniczy natok okien otwieranych przez rne programy. Natomiast uycie wielu okien programu umoliwia posuenie si przyciskami i kombinacjami klawiszy
udostpnianymi przez system okienkowy do przeczania si pomidzy oknami.
W przypadku aplikacji w jzyku Java, z natury niezalenych od platformy, nie moemy
polega na usugach systemu okienkowego, a wic zarzdzanie wasnymi oknami przez
sam aplikacj ma wikszy sens.
Rysunek 6.44 pokazuje aplikacj Java, ktrej okno zawiera trzy wewntrzne ramki. Dwie
z nich posiadaj ikony umoliwiajce ich maksymalizacj bd zwinicie do ikony. Trzecia
zostaa zwinita do ikony.
W przypadku wygldu komponentw Metal ramki wewntrzne posiadaj wyrniony obszar, ktry umoliwia ich uchwycenie i przesuwanie. Uchwycenie naronika ramki
umoliwia natomiast zmian jej rozmiarw.

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

495

Rysunek 6.44.
Aplikacja
w jzyku Java
posiadajca trzy
wewntrzne ramki

Aby skorzysta z moliwoci zarzdzania wewntrznymi ramkami naley kolejno wykona


nastpujce kroki.
1. Tworzymy dla aplikacji zwyk ramk klasy .".
2. Umieszczamy w niej panel klasy 37 4,.
  *  
F  *"# !
& "#   *!

3. Tworzymy obiekty klasy $ ." reprezentujce 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  

4. Umieszczamy komponenty w ramkach wewntrznych.


<#.& "# !# !

5. Przypisujemy ramkom wewntrznym ikon, ktra pokazywana bdzie w lewym

grnym rogu ramki.


<#. E#.1   !

W obecnej wersji implementacji wygldu Metal ikona ramki nie jest wywietlana, gdy
ramka jest zwinita.

496

Java 2. Techniki zaawansowane


6. Okrelamy rozmiary wewntrznych ramek. Podobnie jak w przypadku zwykych

ramek, ich pocztkowy rozmiar wynosi 0 na 0 pikseli. Poniewa nie chcemy, by


ramki wewntrzne przykryway si wzajemnie, to powinnimy wybra dla nich
take rne pozycje pocztkowe. Metoda 4 umoliwia okrelenie
pocztkowej pozycji i rozmiarw ramki:
<#. #* AE#.G AE#.a
  !

7. Podobnie jak w przypadku zwykych ramek, musimy jeszcze je pokaza.


<#. $  !

We wczesnych wersjach biblioteki Swing ramki wewntrzne byy pokazywane automatycznie i wywoanie metody   nie byo konieczne.
8. Dodajemy ramki do panelu 37 4,:
  *# <#.!

9. Wybieramy jedn z dodanych ramek. W przypadku ramek wewntrznych tylko

wybrana ramka otrzymuje informacje o stanie klawiatury. Wygld Metal wyrnia


wybran ramk za pomoc niebieskiego paska tytuu, podczas gdy w pozostaych
ramkach ma on kolor szary. Metoda  ." umoliwia wybranie ramki.
Jednak wywoanie tej metody moe zosta zawetowane przez aktualnie wybran
ramk. Spowoduje to wyrzucenie przez metod  ." wyjtku
, 42 '/4 , ktry musimy obsuy.


<#.  !

# " *$ 4A*  !

)) */#
  + #C# +#

##


10. Umieszczamy kolejn ramk poniej, tak by nie zasaniaa istniejcej ramki.

Waciw odlegoci bdzie zwykle wysoko paska tytuowego ramki, ktr


moemy uzyska w poniszy sposb:
 <#.F # 
<#.J ! c <#.& "# !J !

11. Wykorzystujemy wyliczon odlego w celu ustalenia pozycji kolejnej ramki.


AE#.G > <#.F #
AE#.a > <#.F #
< AE#.G >
  b   *I  !!
AE#.G  (
< AE#.a >  b   *J !!
AE#.a  (

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

497

Rozmieszczenie kaskadowe i ssiadujce


W systemie Windows istniej standardowe komendy umoliwiajce uzyskanie rozmieszczenia kaskadowego lub ssiadujcego okien (patrz rysunki 6.45 i 6.46). Klasy 37 4
, i $ ." biblioteki Swing nie udostpniaj niestety odpowiednich metod.
Program, ktrego tekst rdowy umiecilimy w listingu 6.18, pokazuje sposb samodzielnej
implementacji takich metod.
Rysunek 6.45.
Rozmieszczenie
kaskadowe
ramek wewntrznych

Rysunek 6.46.
Rozmieszczenie
ssiadujce
ramek wewntrznych

Rozmieszczenie kaskadowe charakteryzuje si jednakowym rozmiarem okien i przesuniciem ich pozycji. Metoda  ." klasy 37 4, zwraca tablic wszystkich wewntrznych ramek.
1#E#. <#.    *:E#. !

498

Java 2. Techniki zaawansowane


Musimy jednak zwrci uwag na stan, w jakim one si znajduj. Ramka wewntrzna moe
znajdowa si w jednym z trzech stanw. Oto one:
n

ikona,

poredni, umoliwiajcy zmian rozmiarw ramki,

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#  <#.& !

oraz liczb wierszy jako


 
 <#.&  )   

z tym wyjtkiem, e ostatnia kolumna


A#  <#.&  S   

posiada bdzie  !D!9 wierszy.


Ponisza ptla rozmieszcza ssiadujco wszystkie wewntrzne ramki panelu pulpitu:

     *I  ! )   
     *J ! ) 

   (

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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 37 4, 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  !

Take i to wywoanie moe wyrzuci wyjtek , 42 '/4 . W takim przypadku


musimy kontynuowa poszukiwanie kolejnej ramki. Jeli wrcimy w ten sposb do ramki
wyjciowej, oznacza to, e adna inna ramka nie moga by wybrana. Poniej kompletna
ptla realizujca opisane dziaanie:
<     (  = <#.  >>!

< <#.   !!

)) +#, , #.H /#  ,  +
H#  
))  . 8 + #9
##


 A   > '! S <#. 

 A Y  ZZ <#. A 1  !!
A  A > '! S <#. 
< A  ! 
)) * + #C #. B +
H    +C C

 
<#. A  !
<#. A E  !


500

Java 2. Techniki zaawansowane



# " *$ 4A*  !




Zgaszanie weta do zmiany waciwoci


Po lekturze poprzednich przykadw moemy zastanawia si, w jaki sposb ramka zgasza
weto. Klasa $ ." wykorzystuje oglny mechanizm JavaBeans w celu monitorowania
zmian waciwoci. Mechanizm ten omawiamy szczegowo w rozdziale 8. Teraz bdziemy
chcieli jedynie pokaza, w jaki sposb ramki mog zgasza weto do zmian ich waciwoci.
Zwykle ramki nie zgaszaj weta, aby oprotestowa zwinicie ich do ikony bd utrat wyboru. Typow sytuacj dla takiego zachowania bdzie natomiast zamknicie ramki. Ramk zamykamy, korzystajc z metody   klasy $ .". Poniewa moe ona zosta
zawetowana, to wywouje najpierw wszystkie obiekty nasuchujce weta zmiany. Umoliwia
to tym obiektom wyrzucenie wyjtku , 42 '/4  i tym samym zakoczenie wykonywania metody, zanim podejmie ona dziaania zmierzajce do zamknicia ramki.
W przykadowym programie prba zamknicia ramki powoduje pojawienie si okna dialogowego w celu potwierdzenia zamknicia ramki przez uytkownika (patrz rysunek 6.47).
Jeli uytkownik nie zgodzi si, to ramka pozostanie otwarta.
Rysunek 6.47.
Uytkownik
moe zawetowa
zamknicie ramki

A oto sposb uzyskania takiego powiadomienia.


1. Do kadej ramki dodajemy obiekt nasuchujcy. Obiekt ten musi nalee do klasy
implementujcej interfejs    . Najlepiej doda go zaraz po

utworzeniu ramki. W przykadowym programie tworzymy go i dodajemy w klasie


ramki. Inn moliwoci jest wykorzystanie anonimowej klasy wewntrznej.
<#.# $ #&#   !

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

501

2. Implementujemy metod    , ktra jest jedyn metod definiowan


przez interfejs    . Jej parametrem jest obiekt klasy
, 42 '. Korzystajc z jego metody , 42%", uzyskujemy
nazw waciwoci, ktra ma zosta zmieniona na przykad ; ;, jeli
wetowane jest wywoanie metody   #. Jak pokaemy w rozdziale 8.,
nazwa waciwoci uzyskiwana jest przez usunicie prefiksu ;; z nazwy metody

i zmian wielkoci nastpnej litery nazwy.


Metod %   wykorzystujemy w celu uzyskania proponowanej wartoci
waciwoci.
 #.  ;" *2#. !
7, ;#  ;2
$# !
< #.#   ! ZZ ;## K #6%L4!!


 

  
   
 


3. Wyrzucamy wyjtek , 42 '/4 , aby uniemoliwi zmian

waciwoci lub w przeciwnym razie oddajemy sterowanie.


# F  *E#. A E#.
.*. $ #&# 

  
* ;  ; #&# " *&#4; ;!

" *$ 4A* 

  
< 
!


" *$ 4A*  #  ;!
)) #, 
# ,- 



Okna dialogowe ramek wewntrznych


W przypadku ramek wewntrznych nie powinnimy korzysta z klasy 3  w celu tworzenia okien dialogowych, poniewa:
n

ich otwarcie wie si ze znacznym nakadem i utworzeniem nowej ramki systemu


okienkowego,

system okienkowy nie potrafi okreli waciwej pozycji okna dialogowego


w stosunku do ramki, ktra je otworzya.

Dlatego te dla prostych okien dialogowych wykorzystywa bdziemy metod  $


 :ZZ3  klasy 4 ,. Dziaa ona dokadnie tak jak metoda  :ZZ3 , ale
tworzy proste okno dialogowe nad waciw ramk wewntrzn.
W przypadku bardziej zoonych okien dialogowych moemy skorzysta z klasy $

 .", ktra nie umoliwia jednak tworzenia okien modalnych.

502

Java 2. Techniki zaawansowane


W naszym programie korzystamy z okna dialogowego w celu potwierdzenia przez uytkownika zamknicia ramki.
  
 7* "#   
<#. 7X   U!

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.

Przeciganie zarysu ramki


Czsto krytykowan cech wewntrznych ramek jest niska efektywno odrysowywania ich
zawartoci. Ujawnia si ona zwaszcza podczas przecigania ramek o zoonej zawartoci.
Podobny efekt uzyskamy take dla zwykych okien w przypadku kiepsko zaimplementowanego sterownika ekranu. Z reguy jednak przeciganie zwykych okien nawet z bardzo
skomplikowan zawartoci jest efektywne, poniewa obsugiwane jest sprztowo.
Aby poprawi dziaanie przecigania ramek wewntrznych, moemy skorzysta z ich waciwoci umoliwiajcej przeciganie jedynie zarysu ramki. Zawarto ramki jest w takim
przypadku odrysowywana dopiero po jej umieszczeniu na pulpicie. Podczas przecigania
odrysowywany jest jedynie zarys ramki.
Aby wczy moliwo przecigania zarysu, wywoujemy ponisz metod.
  * F#0  F  *"#7L61245F%:3507F4!

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   !

Nasz przykadowy program umoliwia zarzdzanie odrysowywaniem zawartoci ramek za


pomoc pozycji menu Window/Drag Outline.
Ramki wewntrzne pulpitu zarzdzane s przez klas 37 4. Instalujc innego menedera pulpitu, moemy zaimplementowa odmienne zachowanie pulpitu. Moliwoci tej nie bdziemy jednak omawia w naszej ksice.

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

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.# :   

:   !



* ;  # "< . : 4; ;!

*E !

504

Java 2. Techniki zaawansowane



!
<0# *1.!
01. A1.  
01. 4A!
A1.# :   

:   !



* ;  # "< . : 4; ;!

 .A (!

!
<0# A1.!
0

0  
0 I
!
.K##

0!
01. A1.  
01. 2A!
A1.# :   

:   !



* ;  # "< . : 4; ;!

2AI
!

!


0# A1.!
01. # # 1.  
01. &# # !
# # 1.# :   

:   !



* ;  # "< . : 4; ;!

# # I
!

!


0# # # 1.!
01. 1.  
01. 6!
1.# :   

:   !



* ;  # "< . : 4; ;!

I
!

!


0# 1.!
<# &K A01. #71.
 
&K A01. F# 7!
#71.# :   

:   !



* ;  # "< . : 4; ;!

  * F#0  #71.  !
U F  *"#7L61245F%:3507F4
V F  *"#1$45F%:3507F4!

!


0# #71.!


Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

)@@
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 #.
<#.# $ #&#  

$ #&#  !



* ;  ; #&# " *&#4; ;!

" *$ 4A* 

 #.  ;" *2#. !
7, ;#  ;2
$# !
)) *#
+#  */ +#.H# #.
< #.#   !
ZZ ;## K #6%L4!!

)) *  8
# * 
 + +#.H# #.
  
 7* "# 
1#& <.F# 
<#. 7X   U!
)) ,- 8
 H  + +  +C# +#

<   Y 7* "#a457"6172!


" *$ 4A* 
L  #   ;!


!
))  ## * +, #.

     *I  ! ) ?
     *J ! ) ?
<#. #* AE#.G AE#.a
  !
<#. 
!
))
/ #. P . 8 + #9 +#

#


<#.  !

# " *$ 4A*  !

505

506

Java 2. Techniki zaawansowane



)@ ,- *
+ #+  +# C -9 * .H + #.#.
 +. ++ . # #

@)
< <#.F #  (!
<#.F #  <#.J !
P <#.& "# !J !
))
+#+# * +,H  ,, #.
AE#.G > <#.F #
AE#.a > <#.F #
< AE#.G >
  b   *I  !!
AE#.G  (
< AE#.a >  b   *J !!
AE#.a  (

)@@
% +. ++# # #
 #. ** /  B +
H  
@)
* ;  # # I
!

1#E#. <#.    *:E#. !
 A  (
   (

     *I  ! ) ?
     *J ! ) ?
<     (  = <#.  >>!

< Y<#.  1  !!



)) */, *+*
# +9 #. # * - 
))  . 8 + #9 +#

#
<#.  0#A.. <# !
<#.  #* A 
  !
A > <#.F #
 > <#.F #
)) +#
,#  C# + **
< A >
  b   *I  !! A  (
<  >  b   *J !!   (

# " *$ 4A*  !




)@@
% +. ++# B # ,B  #. ** /  B +
  
@)
* ;  I
!


Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

1#E#. <#.    *:E#. !


)) ++# #. /  B +
H  
 <#.&   (
<     (  = <#.  >>!

< Y<#.  1  !!
<#.& >>

 
 !0#  <#.& !
    <#.&  ) 

 A#  <#.&  S 

)) +#  . + #
.
 +.

     *I  ! )   
     *J ! ) 

   (
   (
<     (  = <#.  >>!

< Y<#.  1  !!



<#.  0#A.. <# !
<#.  #*  @
 
 @ 
  !
>>
<   
!

  (
>>
<     P A#!

))  +* +# #

 +

>>
    *J ! ) 




# " *$ 4A*  !




)@@
I# #.H
@)
* ;  2AI
!

1#E#. <#.    *:E#. !
<     (  = <#.  >>!

< <#.   !!


507

508

Java 2. Techniki zaawansowane


)) +#, , #.H /#  ,  +
H#  
))  . 8 + #9
##


 A   > '! S <#. 

 A Y  ZZ <#. A 1  !!
A  A > '! S <#. 
< A  ! 
)) * + #C #. B +
H    +C C

 
<#. A  !
<#. A E  !


# " *$ 4A*  !




)@@
"  8
# 
# * J60
@)
* ;  *E !

)) * +
## 8


#9 *
E&     
E&  !
  &F  
E !!
  EE 

,#;#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.

Zaawansowane moliwoci pakietu Swing




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

wszystkie ramki wewntrzne panelu

pulpitu.
n  !3  !" #!okrela

sposb zachowania ramek wewntrznych


panelu podczas przecigania (tylko zarys bd take zawarto ramki).
Parametry: " 

jedna z wartoci 37 4,:$'(3


&(3'
lub 37 4,:+)$%'(3
&(3'.

509

510

Java 2. Techniki zaawansowane


 '  (
n $ ." #
n $ ." ! #
n $ ." ! *! !- #
n $ ." ! *! !- *! !  #
n $ ." ! *! !- *! !  *! 

"/"- #

n $ ." ! *! !- *! !  *! 

"/"- *! !  #

Tworz now ramk wewntrzn.


Parametry:  

tytu ramki,

- 

warto , jeli rozmiary ramki mog by zmieniane,

  

warto , jeli ramka moe by zamykana,

"/"- 

warto , jeli ramka moe by maksymalizowana,

  

warto , jeli ramka moe by zwijana do ikony,

n  !
-  #
n  !   #
n  !/"-  #
n  !$   #

Sprawdzaj odpowiednie waciwoci ramki. Jeli waciwo posiada warto


, oznacza to take obecno odpowiedniej ikony w pasku tytuu ramki.
n  !$  #
n  !$   !#
n  !/"" #
n  !/""  !#
n  !  #
n  !   !#

Sprawdzaj lub ustawiaj waciwoci ramki. Jeli waciwo posiada warto


, oznacza to, e ramka jest zwinita do ikony, zmaksymalizowana bd
zamknita.
n  !  #
n  !   !#

Sprawdza lub ustawia waciwo wyboru ramki. Jeli waciwo posiada


warto , oznacza to, e ramka jest wybran ramk pulpitu.
n  !" ) .  #

Rozdzia 6.

Zaawansowane moliwoci pakietu Swing

n  !" ) 67 #

Umieszcza ramk na wierzchu lub spodzie pulpitu.


n  !4 !/*!!2*!! *!!#!przesuwa

ramk i zmienia

jej rozmiar.
Parametry: /, 2

nowe wsprzdne lewego grnego naronika ramki,

,  szeroko i wysoko ramki.


n ! , #
n  ! , !#

Pobieraj i zwracaj panel ramki wewntrznej.


n 37 4,!37 4, #!pobiera

pulpit dla danej ramki wewntrznej.

n $ !."$  #
n  !."$  $ ! #

Pobieraj i nadaj ikon ramki umieszczon w jej pasku tytuowym.


n  !  #
n  !   !#

Sprawdzaj i ustawiaj waciwo widocznoci ramki.


n  ! #!sprawia,

e ramka staje si widoczna i pojawia si na wierzchu pulpitu.


  
n  !       ! #!instaluje

obiekt nasuchujcy zmiany, ktra moe zosta zawetowana. Jest on zawiadamiany,


gdy ma miejsce prba zmiany ograniczonej waciwoci.

 ) !


   
n  !    , 42 '!#! metoda

wywoywana, gdy
metoda !ograniczonej waciwoci zawiadamia obiekt nasuchujcy zmiany,
ktra moe by zawetowana.

   %!


"
n !, 42%" #!zwraca
n !%   #!zwraca

nazw zmienianej waciwoci.

proponowan now warto waciwoci.

   %) " 


n , 42 '/4  ! *!, 42 '!#!tworzy

wyjtek weta zmiany waciwoci.


Parametry:  


powd weta,
wetowane zdarzenie.

511

You might also like