Wydawnictwo Helion
ul. Koœciuszki 1c
44-100 Gliwice
tel. 032 230 98 63
Java. Podstawy.
Wydanie VIII
Autor: Cay S. Horstmann, Gary Cornell
T³umaczenie: £ukasz Piwko
ISBN: 978-83-246-1478-3
Volume I--Fundamentals (8th Edition)
Format: 172x245, stron: 888
Zacznij tworzyæ niezale¿ne od platformy aplikacje jeszcze dziœ!
•
Jakie nowoœci kryj¹ siê w Java Standard Edition 6?
•
Jak rozpocz¹æ przygodê z jêzykiem Java?
•
Jak wykorzystaæ wielow¹tkowoœæ?
Jêzyk programowania Java zosta³ stworzony i jest rozwijany przez firmê Sun
Microsystems. Mo¿liwoœæ zastosowania go na ró¿nych platformach zosta³a doceniona
przez wielu programistów na œwiecie. Jednak nie jest to jedyna mocna strona Javy.
Warto tu wskazaæ równie¿ jej silne ukierunkowanie na obiektowoœæ, obs³ugê
programowania rozproszonego, mechanizm automatycznego oczyszczania pamiêci
(ang. garbage collection). Dziêki swoim atutom, dobrej dokumentacji i licznych
publikacjom Java jest dziœ wiod¹cym rozwi¹zaniem na rynku jêzyków programowania.
Ksi¹¿ka „Java. Podstawy. Wydanie VIII” zosta³a zaktualizowana o wszystkie
te elementy, które pojawi³y siê w wersji szóstej platformy Java Standard Edition.
Tom pierwszy — „Podstawy” — zawiera wprowadzenie do jêzyka programowania Java.
Autorzy ksi¹¿ki przedstawi¹ tu za³o¿enia przyjête przez firmê Sun przy tworzeniu
tej platformy. Dowiesz siê, jakie prawa rz¹dz¹ programowaniem obiektowym
oraz jak wykorzystaæ interfejsy i obs³ugê wyj¹tków. Dodatkowo bêdziesz mieæ
mo¿liwoœæ zapoznania siê z elementami projektowania i tworzenia interfejsu
u¿ytkownika. W ostatnim rozdziale autorzy omówi¹ wielow¹tkowoœæ oraz sposób
zastosowania tego typu rozwi¹zañ w codziennej pracy programisty jêzyka Java.
•
Podstawy jêzyka Java
— Programowanie obiektowe — Interfejsy — Sposób u¿ycia klas proxy oraz klas
wewnêtrznych — Projektowanie interfejsu u¿ytkownika z wykorzystaniem
biblioteki Swing — Obs³uga wyj¹tków — Wykrywanie i rozwi¹zywanie problemów
w kodzie — Wielow¹tkowoœæ
Wykorzystaj si³ê obiektów.
Programowanie obiektowe w jêzyku Java ma przysz³oœæ!
Spis treci
Podzikowania ......................................................................................................................................... 13
Wstp ........................................................................................................................................................ 15
Rozdzia 1. Wstp do Javy ........................................................................................................................ 21
Java jako platforma programistyczna .............................................................................. 21
Sowa klucze biaej ksigi Javy ...................................................................................... 22
Prosty .................................................................................................................... 23
Zorientowany obiektowo .......................................................................................... 23
Sieciowy ................................................................................................................. 24
Niezawodny ............................................................................................................ 24
Bezpieczny ............................................................................................................. 25
Niezaleny od architektury ....................................................................................... 26
Przenony .............................................................................................................. 26
Interpretowany ........................................................................................................ 27
Wysokowydajny ....................................................................................................... 27
Wielowtkowy ......................................................................................................... 27
Dynamiczny ............................................................................................................ 28
Aplety Javy i internet ..................................................................................................... 28
Krótka historia Javy ...................................................................................................... 30
Gówne nieporozumienia dotyczce Javy ......................................................................... 32
Rozdzia 2. rodowisko programistyczne Javy ................................................................................... 37
Instalacja oprogramowania Java Development Kit ........................................................... 38
Pobieranie pakietu JDK ........................................................................................... 38
Ustawianie cieki dostpu ...................................................................................... 40
Instalacja bibliotek i dokumentacji ............................................................................ 41
Instalacja przykadowych programów ......................................................................... 42
Drzewo katalogów Javy ............................................................................................ 43
Wybór rodowiska programistycznego ............................................................................ 44
Uywanie narzdzi wiersza polece ................................................................................ 44
Rozwizywanie problemów ....................................................................................... 46
4 Java.
Podstawy
Praca w zintegrowanym rodowisku programistycznym .................................................... 47
Znajdowanie bdów kompilacji ................................................................................ 50
Uruchamianie aplikacji graficznej ................................................................................... 51
Tworzenie i uruchamianie apletów ................................................................................. 53
Rozdzia 3. Podstawowe elementy jzyka Java .................................................................................... 59
Prosty program w Javie ................................................................................................. 60
Komentarze ................................................................................................................. 63
Typy danych ................................................................................................................. 64
Typy cakowite ........................................................................................................ 64
Typy zmiennoprzecinkowe ........................................................................................ 65
Typ char ................................................................................................................. 66
Typ boolean ............................................................................................................ 68
Zmienne ...................................................................................................................... 69
Inicjacja zmiennych ................................................................................................. 70
Stae ...................................................................................................................... 70
Operatory .................................................................................................................... 71
Operatory inkrementacji i dekrementacji ................................................................... 72
Operatory relacyjne i logiczne ................................................................................... 73
Operatory bitowe ..................................................................................................... 74
Funkcje i stae matematyczne .................................................................................. 75
Konwersja typów numerycznych ................................................................................ 76
Rzutowanie ............................................................................................................. 77
Nawiasy i priorytety operatorów ................................................................................ 78
Typ wyliczeniowy ..................................................................................................... 79
acuchy ..................................................................................................................... 79
Podacuchy ........................................................................................................... 79
Konkatenacja ......................................................................................................... 80
acuchów nie mona modyfikowa .......................................................................... 80
Porównywanie acuchów ......................................................................................... 82
Wspórzdne kodowe znaków i jednostki kodowe ....................................................... 83
API String ............................................................................................................... 84
Dokumentacja API w internecie ................................................................................ 86
Skadanie acuchów ............................................................................................... 87
Wejcie i wyjcie .......................................................................................................... 90
Odbieranie danych wejciowych ................................................................................ 90
Formatowanie danych wyjciowych ........................................................................... 93
Zapis do pliku i odczyt ............................................................................................. 97
Przepyw sterowania ..................................................................................................... 99
Zasig blokowy ....................................................................................................... 99
Instrukcje warunkowe ............................................................................................ 100
Ptle .................................................................................................................... 102
Ptle o okrelonej liczbie powtórze ....................................................................... 107
Wybór wielokierunkowy — instrukcja switch ............................................................ 110
Instrukcje przerywajce przepyw sterowania ........................................................... 112
Wielkie liczby ............................................................................................................. 115
Tablice ...................................................................................................................... 118
Ptla typu for each ................................................................................................ 119
Inicjowanie tablic i tworzenie tablic anonimowych .................................................... 120
Kopiowanie tablicy ................................................................................................ 120
Parametry wiersza polece .................................................................................... 122
Spis
treci
5
Sortowanie tablicy ................................................................................................. 123
Tablice wielowymiarowe ......................................................................................... 127
Tablice postrzpione ............................................................................................. 130
Rozdzia 4. Obiekty i klasy .....................................................................................................................133
Wstp do programowania zorientowanego obiektowo .................................................... 134
Klasy ................................................................................................................... 134
Obiekty ................................................................................................................ 136
Identyfikacja klas .................................................................................................. 136
Relacje midzy klasami ......................................................................................... 137
Uywanie klas predefiniowanych .................................................................................. 139
Obiekty i zmienne obiektów .................................................................................... 139
Klasa GregorianCalendar ....................................................................................... 142
Metody udostpniajce i zmieniajce warto elementu ........................................... 144
Definiowanie wasnych klas ......................................................................................... 150
Klasa Employee .................................................................................................... 151
Stosowanie kilku plików
ródowych ........................................................................ 154
Analiza klasy Employee ......................................................................................... 154
Pierwsze kroki w tworzeniu konstruktorów ............................................................... 155
Parametry jawne i niejawne .................................................................................... 156
Korzyci z hermetyzacji .......................................................................................... 157
Przywileje klasowe ................................................................................................ 159
Metody prywatne ................................................................................................... 160
Stae jako pola klasy ............................................................................................. 161
Pola i metody statyczne .............................................................................................. 161
Pola statyczne ...................................................................................................... 161
Stae statyczne ..................................................................................................... 162
Metody statyczne .................................................................................................. 163
Metody fabrykujce ............................................................................................... 164
Metoda main ........................................................................................................ 165
Parametry metod ........................................................................................................ 167
Konstruowanie obiektów ............................................................................................. 173
Przecianie ......................................................................................................... 173
Inicjacja pól wartociami domylnymi ...................................................................... 174
Konstruktor domylny ............................................................................................ 175
Jawna inicjacja pól ................................................................................................ 175
Nazywanie parametrów .......................................................................................... 176
Wywoywanie innego konstruktora .......................................................................... 177
Bloki inicjujce ...................................................................................................... 178
Niszczenie obiektów i metoda finalize ..................................................................... 182
Pakiety ...................................................................................................................... 182
Importowanie klas ................................................................................................. 183
Importy statyczne .................................................................................................. 185
Dodawanie klasy do pakietu .................................................................................. 185
Zasig pakietów .................................................................................................... 188
cieka klas .............................................................................................................. 190
Ustawianie cieki klas ......................................................................................... 192
Komentarze dokumentacyjne ...................................................................................... 193
Wstawianie komentarzy ......................................................................................... 193
Komentarze do klas .............................................................................................. 194
Komentarze do metod ........................................................................................... 194
6 Java.
Podstawy
Komentarze do pól ................................................................................................ 195
Komentarze ogólne ............................................................................................... 195
Komentarze do pakietów i ogólne ........................................................................... 197
Generowanie dokumentacji .................................................................................... 197
Porady dotyczce projektowania klas ........................................................................... 198
Rozdzia 5. Dziedziczenie .......................................................................................................................201
Klasy, nadklasy i podklasy .......................................................................................... 202
Hierarchia dziedziczenia ........................................................................................ 208
Polimorfizm .......................................................................................................... 208
Wizanie dynamiczne ............................................................................................ 210
Wyczanie dziedziczenia — klasy i metody finalne .................................................. 213
Rzutowanie ........................................................................................................... 214
Klasy abstrakcyjne ................................................................................................ 216
Dostp chroniony .................................................................................................. 221
Klasa bazowa Object .................................................................................................. 222
Metoda equals ..................................................................................................... 223
Porównywanie a dziedziczenie ................................................................................ 224
Metoda hashCode ................................................................................................. 227
Metoda toString .................................................................................................... 229
Generyczne listy tablicowe .......................................................................................... 234
Dostp do elementów listy tablicowej ..................................................................... 237
Zgodno pomidzy typowanymi a surowymi listami tablicowymi ............................... 241
Osony obiektów i autoboxing ...................................................................................... 242
Metody ze zmienn liczb parametrów ......................................................................... 245
Klasy wyliczeniowe ..................................................................................................... 246
Refleksja ................................................................................................................... 248
Klasa Class .......................................................................................................... 249
Podstawy przechwytywania wyjtków ....................................................................... 251
Zastosowanie refleksji w analizie funkcjonalnoci klasy ............................................ 253
Refleksja w analizie obiektów w czasie dziaania programu ....................................... 258
Zastosowanie refleksji w generycznym kodzie tablicowym ......................................... 263
Wska
niki do metod .............................................................................................. 267
Porady projektowe dotyczce dziedziczenia ................................................................... 270
Rozdzia 6. Interfejsy i klasy wewntrzne .......................................................................................... 273
Interfejsy ................................................................................................................... 274
Wasnoci interfejsów ............................................................................................ 279
Interfejsy a klasy abstrakcyjne ............................................................................... 280
Klonowanie obiektów .................................................................................................. 281
Interfejsy a sprzenie zwrotne .................................................................................... 287
Klasy wewntrzne ....................................................................................................... 290
Dostp do stanu obiektu w klasie wewntrznej ........................................................ 292
Specjalne reguy skadniowe dotyczce klas wewntrznych ....................................... 295
Czy klasy wewntrzne s potrzebne i bezpieczne? .................................................... 296
Lokalne klasy wewntrzne ..................................................................................... 298
Dostp do zmiennych finalnych z metod zewntrznych .............................................. 299
Anonimowe klasy wewntrzne ................................................................................ 301
Statyczne klasy wewntrzne ................................................................................... 304
Klasy proxy ................................................................................................................ 307
Wasnoci klas proxy ............................................................................................. 311
Spis
treci
7
Rozdzia 7. Grafika .................................................................................................................................313
Wprowadzenie do pakietu Swing .................................................................................. 314
Tworzenie ramki ......................................................................................................... 317
Pozycjonowanie ramki ................................................................................................. 320
Wasnoci ramek .................................................................................................. 322
Okrelanie rozmiaru ramki ..................................................................................... 323
Wywietlanie informacji w komponencie ....................................................................... 327
Figury 2W .................................................................................................................. 331
Kolory ....................................................................................................................... 339
Czcionki .................................................................................................................... 343
Wywietlanie obrazów ................................................................................................. 351
Rozdzia 8. Obsuga zdarze ................................................................................................................. 355
Podstawy obsugi zdarze ........................................................................................... 355
Przykad — obsuga kliknicia przycisku .................................................................. 357
Nabywanie biegoci w posugiwaniu si klasami wewntrznymi ................................ 362
Tworzenie suchaczy zawierajcych jedno wywoanie metody ..................................... 365
Przykad — zmiana stylu ........................................................................................ 366
Klasy adaptacyjne ................................................................................................. 370
Akcje ......................................................................................................................... 374
Zdarzenia generowane przez mysz ............................................................................... 381
Hierarchia zdarze w bibliotece AWT ............................................................................ 388
Zdarzenia semantyczne i niskiego poziomu ............................................................. 390
Rozdzia 9. Komponenty Swing interfejsu uytkownika ..................................................................... 393
Swing a wzorzec projektowy Model-View-Controller ........................................................ 394
Wzorce projektowe ................................................................................................ 394
Wzorzec Model-View-Controller ............................................................................... 395
Analiza MVC przycisków Swing ............................................................................... 399
Wprowadzenie do zarzdzania rozkadem ..................................................................... 400
Rozkad brzegowy .................................................................................................. 403
Rozkad siatkowy .................................................................................................. 405
Wprowadzanie tekstu ................................................................................................. 409
Pola tekstowe ....................................................................................................... 409
Etykiety komponentów ........................................................................................... 411
Pola hase ............................................................................................................ 413
Obszary tekstowe .................................................................................................. 413
Panele przewijane ................................................................................................. 414
Komponenty umoliwiajce wybór opcji ........................................................................ 417
Pola wyboru .......................................................................................................... 417
Przeczniki .......................................................................................................... 420
Obramowanie ....................................................................................................... 424
Listy rozwijalne ..................................................................................................... 428
Suwaki ................................................................................................................. 432
Menu ........................................................................................................................ 438
Tworzenie menu .................................................................................................... 439
Ikony w elementach menu ..................................................................................... 441
Pola wyboru i przeczniki jako elementy menu ........................................................ 442
Menu podrczne ................................................................................................... 444
Mnemoniki i akceleratory ....................................................................................... 445
8 Java.
Podstawy
Aktywowanie i dezaktywowanie elementów menu ..................................................... 448
Paski narzdzi ...................................................................................................... 451
Dymki .................................................................................................................. 453
Zaawansowane techniki zarzdzania rozkadem ............................................................ 456
Rozkad GridBagLayout .......................................................................................... 458
Rozkad grupowy ................................................................................................... 468
Nieuywanie adnego zarzdcy rozkadu .................................................................. 478
Niestandardowi zarzdcy rozkadu .......................................................................... 479
Kolejka dostpu .................................................................................................... 483
Okna dialogowe ......................................................................................................... 485
Okna dialogowe opcji ............................................................................................ 485
Tworzenie okien dialogowych .................................................................................. 495
Wymiana danych ................................................................................................... 500
Okna dialogowe wyboru plików ............................................................................... 506
Okna dialogowe wyboru kolorów ............................................................................. 517
Rozdzia 10. Przygotowywanie apletów i aplikacji do uytku ............................................................ 525
Pliki JAR .................................................................................................................... 526
Manifest .............................................................................................................. 526
Wykonywalne pliki JAR ........................................................................................... 528
Zasoby ................................................................................................................. 529
Piecztowanie pakietów ......................................................................................... 532
Java Web Start ........................................................................................................... 533
Sandbox ............................................................................................................... 537
Podpisywanie kodu ............................................................................................... 538
API JNLP .............................................................................................................. 539
Aplety ........................................................................................................................ 548
Prosty aplet .......................................................................................................... 549
Znacznik applet i jego atrybuty ............................................................................... 553
Znacznik object ..................................................................................................... 557
Parametry przekazujce informacje do apletów ........................................................ 557
Dostp do obrazów i plików audio .......................................................................... 562
rodowisko dziaania apletu ................................................................................... 563
Zapisywanie preferencji uytkownika ............................................................................ 572
Mapy wasnoci .................................................................................................... 572
API Preferences .................................................................................................... 577
Rozdzia 11. Wyjtki, dzienniki, asercje i debugowanie ....................................................................... 585
Obsuga bdów ......................................................................................................... 586
Klasyfikacja wyjtków ............................................................................................ 587
Deklarowanie wyjtków kontrolowanych .................................................................. 589
Zgaszanie wyjtków .............................................................................................. 591
Tworzenie klas wyjtków ........................................................................................ 593
Przechwytywanie wyjtków ........................................................................................... 594
Przechwytywanie wielu typów wyjtków .................................................................... 596
Powtórne generowanie wyjtków i budowanie acuchów wyjtków ............................ 596
Klauzula finally ..................................................................................................... 597
Analiza danych ze ledzenia stosu .......................................................................... 601
Wskazówki dotyczce stosowania wyjtków .................................................................. 604
Spis
treci
9
Asercje ...................................................................................................................... 607
Wczanie i wyczanie asercji ................................................................................ 608
Zastosowanie asercji w sprawdzaniu parametrów .................................................... 608
Zastosowanie asercji w dokumentacji zaoe ......................................................... 610
Dzienniki ................................................................................................................... 611
Podstawy zapisu do dziennika ................................................................................ 611
Zaawansowane techniki zapisu do dziennika ........................................................... 612
Zmiana konfiguracji menedera dzienników ............................................................. 614
Lokalizacja ........................................................................................................... 615
Obiekty typu Handler ............................................................................................. 616
Filtry .................................................................................................................... 620
Formatery ............................................................................................................. 620
Przepis na dziennik ............................................................................................... 620
Wskazówki dotyczce debugowania ............................................................................. 629
Uywanie okna konsoli .......................................................................................... 635
ledzenie zdarze AWT .......................................................................................... 636
Zaprzganie robota AWT do pracy ........................................................................... 640
Praca z debugerem ..................................................................................................... 645
Rozdzia 12. Programowanie uogólnione ............................................................................................. 649
Dlaczego programowanie uogólnione ........................................................................... 650
Dla kogo programowanie uogólnione ...................................................................... 651
Definicja prostej klasy uogólnionej ............................................................................... 652
Metody uogólnione ..................................................................................................... 654
Ograniczenia zmiennych typowych ................................................................................ 655
Kod uogólniony a maszyna wirtualna ............................................................................ 657
Translacja wyrae generycznych ............................................................................ 659
Translacja metod uogólnionych .............................................................................. 660
Uywanie starego kodu .......................................................................................... 662
Ograniczenia i braki .................................................................................................... 663
Nie mona podawa typów prostych jako parametrów typowych ................................ 663
Sprawdzanie typów w czasie dziaania programu jest moliwe tylko
dla typów surowych ............................................................................................ 663
Obiektów klasy uogólnionej nie mona generowa ani przechwytywa ........................ 664
Nie mona tworzy tablic typów uogólnionych .......................................................... 665
Nie wolno tworzy egzemplarzy zmiennych typowych ................................................. 665
Zmiennych typowych nie mona uywa w statycznych kontekstach klas uogólnionych ... 667
Uwaaj na konflikty, które mog powsta po wymazaniu typów .................................. 667
Zasady dziedziczenia dla typów uogólnionych ................................................................ 668
Typy wieloznaczne ...................................................................................................... 671
Ograniczenia nadtypów typów wieloznacznych .......................................................... 672
Typy wieloznaczne bez ogranicze .......................................................................... 674
Chwytanie typu wieloznacznego .............................................................................. 675
Refleksja a typy uogólnione ......................................................................................... 679
Zastosowanie parametrów Class<T> do dopasowywania typów ................................. 680
Informacje o typach generycznych w maszynie wirtualnej .......................................... 680
10 Java.
Podstawy
Rozdzia 13. Kolekcje ............................................................................................................................. 687
Interfejsy kolekcyjne ................................................................................................... 687
Oddzielenie warstwy interfejsów od warstwy klas konkretnych ................................... 688
Interfejsy Collection i Iterator ................................................................................. 690
Konkretne klasy kolekcyjne ......................................................................................... 696
Listy powizane .................................................................................................... 696
Listy tablicowe ...................................................................................................... 706
Zbiór HashSet ...................................................................................................... 706
Zbiór TreeSet ........................................................................................................ 710
Porównywanie obiektów ......................................................................................... 711
Kolejki Queue i Deque ........................................................................................... 717
Kolejki priorytetowe ............................................................................................... 718
Mapy ................................................................................................................... 719
Specjalne klasy Set i Map ..................................................................................... 724
Architektura kolekcji ................................................................................................... 729
Widoki i obiekty opakowujce ................................................................................. 733
Operacje zbiorcze .................................................................................................. 739
Konwersja pomidzy kolekcjami a tablicami ............................................................ 740
Algorytmy ................................................................................................................... 741
Sortowanie i tasowanie ......................................................................................... 742
Wyszukiwanie binarne ........................................................................................... 745
Proste algorytmy ................................................................................................... 746
Pisanie wasnych algorytmów ................................................................................. 748
Stare kolekcje ............................................................................................................ 749
Klasa Hashtable ................................................................................................... 749
Wyliczenia ............................................................................................................ 750
Mapy wasnoci .................................................................................................... 751
Stosy ................................................................................................................... 751
Zbiory bitów .......................................................................................................... 752
Rozdzia 14. Wielowtkowo ............................................................................................................... 757
Czym s wtki ............................................................................................................ 758
Wykonywanie zada w osobnych wtkach ................................................................ 763
Przerywanie wtków .................................................................................................... 769
Stany wtków ............................................................................................................. 771
Wtki NEW ........................................................................................................... 772
Wtki RUNNABLE .................................................................................................. 772
Wtki BLOCKED i WAITING ..................................................................................... 773
Zamykanie wtków ................................................................................................ 773
Wasnoci wtków ...................................................................................................... 775
Priorytety wtków .................................................................................................. 775
Wtki demony ....................................................................................................... 776
Procedury obsugi nieprzechwyconych wyjtków ....................................................... 777
Synchronizacja ........................................................................................................... 778
Przykad sytuacji powodujcej wycig ...................................................................... 778
Wycigi ................................................................................................................ 783
Obiekty klasy Lock ................................................................................................ 784
Warunki ............................................................................................................... 787
Sowo kluczowe synchronized ................................................................................. 792
Bloki synchronizowane .......................................................................................... 796
Monitor ................................................................................................................ 797
Spis
treci
11
Pola ulotne ........................................................................................................... 798
Zakleszczenia ....................................................................................................... 800
Testowanie blokad i odmierzanie czasu .................................................................. 803
Blokady odczytu-zapisu .......................................................................................... 804
Dlaczego metody stop i suspend s odradzane ....................................................... 805
Kolejki blokujce ........................................................................................................ 808
Kolekcje bezpieczne wtkowo ...................................................................................... 815
Szybkie mapy, zbiory i kolejki ................................................................................. 815
Tablice kopiowane przy zapisie ............................................................................... 817
Starsze kolekcje bezpieczne wtkowo ..................................................................... 817
Interfejsy Callable i Future ........................................................................................... 819
Klasa Executors ......................................................................................................... 823
Pule wtków ......................................................................................................... 824
Planowanie wykonywania ....................................................................................... 828
Kontrolowanie grup zada ...................................................................................... 829
Synchronizatory .......................................................................................................... 830
Semafory ............................................................................................................. 830
Klasa CountDownLatch .......................................................................................... 831
Bariery ................................................................................................................. 832
Klasa Exchanger ................................................................................................... 833
Kolejki synchroniczne ............................................................................................ 833
Przykad — wstrzymywanie i ponowne uruchamianie animacji ................................... 833
Wtki a biblioteka Swing ............................................................................................. 839
Uruchamianie czasochonnych zada ...................................................................... 840
Klasa SwingWorker ............................................................................................... 845
Zasada jednego wtku .......................................................................................... 851
Dodatek A Sowa kluczowe Javy .......................................................................................................... 853
Skorowidz ............................................................................................................................................. 855
8
Obsuga zdarze
W tym rozdziale:
Q
Podstawy obsugi zdarze
Q
Akcje
Q
Zdarzenia generowane przez mysz
Q
Hierarchia zdarze
AWT
Obsuga zdarze ma fundamentalne znaczenie w programach z graficznym interfejsem uyt-
kownika. Kady, kto chce tworzy
interfejsy graficzne w Javie, musi opanowa
obsug zda-
rze . Niniejszy rozdzia opisuje model obsugi zdarze biblioteki
AWT
. Do opisywanych
zagadnie nale przechwytywanie zdarze w komponentach interfejsu uytkownika i urz-
dzeniach wejciowych, a take akcje (ang. actions), czyli bardziej strukturalna metoda
przetwarzania zdarze .
Podstawy obsugi zdarze
Kady system operacyjny posiadajcy graficzny interfejs uytkownika stale monitoruje za-
chodzce w nim zdarzenia, jak naciskanie klawiszy na klawiaturze czy kliknicia przyciskiem
myszy. Informacje o tych zdarzeniach s przesyane do uruchomionych programów. Nastp-
nie kady program podejmuje samodzieln decyzj, w jaki sposób, jeli w ogóle, zareagowa
na te zdarzenia. W takich jzykach jak Visual Basic relacje pomidzy zdarzeniami a kodem
s oczywiste. Programista pisze kod obsugi kadego interesujcego go zdarzenia i umieszcza
go w tzw. procedurze obsugi zdarze (ang. event procedure). Na przykad z przyciskiem
o nazwie
HelpButton
w jzyku Visual Basic moe by skojarzona procedura obsugi zdarze
o nazwie
HelpButton_Click
. Kod niniejszej procedury jest wykonywany w odpowiedzi na
kade kliknicie niniejszego przycisku. Kady komponent GUI w jzyku Visual Basic reaguje
na ustalony zestaw zdarze — nie mona zmieni
zdarze , na które reaguje dany komponent.
356
Java. Podstawy
Natomiast programici czystego jzyka C zajmujcy si zdarzeniami musz pisa
procedury
nieprzerwanie monitorujce kolejk zdarze w celu sprawdzenia, jakie powiadomienia prze-
sya system operacyjny (z reguy do tego celu stosuje si ptl zawierajc bardzo rozbudowan
instrukcj
switch
!). Technika ta jest oczywicie bardzo mao elegancka i sprawia wiele pro-
blemów podczas pisania kodu. Jej zalet jest natomiast to, e nie ma adnych ogranicze
dotyczcych zdarze , na które mona reagowa
, w przeciwie stwie do innych jzyków, np.
Visual Basica, które wkadaj bardzo duo wysiku w ukrywanie kolejki zdarze przed
programist.
W rodowisku programistycznym Javy przyjto podejcie porednie pomidzy jzykami Visual
Basic a C, jeli chodzi o oferowane moliwoci, a co za tym idzie — take zoono
. Poru-
szajc si w zakresie zdarze , które obsuguje biblioteka
AWT
, programista ma pen kontrol
nad sposobem przesyania zdarze ze róde zdarze (ang. event sources), np. przycisków lub
pasków przewijania, do suchaczy zdarze (ang. event listener). Na suchacza zdarze mona
desygnowa
kady obiekt — w praktyce wybiera si ten obiekt, który z atwoci moe wy-
kona
odpowiednie dziaania w odpowiedzi na zdarzenie. Ten delegacyjny model zdarze daje
znacznie wiksze moliwoci ni jzyk Visual Basic, w którym suchacz jest ustalony z góry.
róda zdarze dysponuj metodami, w których mona rejestrowa
suchaczy zdarze . Kiedy
ma miejsce okrelone zdarzenie, ródo wysya powiadomienie o nim do wszystkich obiektów
nasuchujcych, które zostay dla niego zarejestrowane.
Jak mona si spodziewa
, informacje o zdarzeniu w jzyku obiektowym, takim jak Java, s
pakowane w obiekcie zdarze (ang. event object). W Javie wszystkie obiekty zdarze nale
do klasy
java.util.EventObject
. Oczywicie istniej te podklasy reprezentujce kady typ
zdarzenia, takie jak
ActionEvent
czy
WindowEvent
.
Róne róda zdarze mog dostarcza
rónego rodzaju zdarze . Na przykad przycisk moe
wysya
obiekty
ActionEvent
, podczas gdy okno wysya obiekty
WindowEvent
.
Podsumujmy, co ju wiemy na temat obsugi zdarze w bibliotece
AWT
:
Q
Obiekt nasuchujcy jest egzemplarzem klasy implementujcej specjalny interfejs
nasuchu (ang. listener interface).
Q
ródo zdarze to obiekt, który moe rejestrowa
obiekty nasuchujce i wysya
do nich obiekty zdarze .
Q
ródo zdarze wysya obiekty zdarze do wszystkich zarejestrowanych suchaczy
w chwili wystpienia zdarzenia.
Q
Informacje zawarte w obiekcie zdarze s wykorzystywane przez obiekty nasuchujce
przy podejmowaniu decyzji dotyczcej reakcji na zdarzenie.
Rysunek 8.1 przedstawia relacje pomidzy klasami obsugi zdarze a interfejsami
Poniej znajduje si przykadowa definicja suchacza:
ActionListener listener = . . .;
JButton button = new JButton("Ok");
button.addActionListener(listener);
Rozdzia 8.
Q
Obsuga zdarze
357
Rysunek 8.1.
Relacje pomidzy
ródami zdarze
a suchaczami
Od tej pory obiekt
listener
bdzie powiadamiany o kadym zdarzeniu akcji w przycisku.
Jak si mona domyli , zdarzenie akcji w przypadku przycisku to jego kliknicie.
Klasa implementujca interfejs
ActionListener
musi definiowa metod o nazwie
action-
Performed
, która jako parametr przyjmuje obiekt typu
ActionEvent
:
class MyListener implements ActionListener
{
. . .
public void actionPerformed(ActionEvent event)
{
// Instrukcje wykonywane w odpowiedzi na kliknicie przycisku.
. . .
}
}
Kiedy uytkownik kliknie przycisk, obiekt typu
JButton
tworzy obiekt typu
ActionEvent
i wywouje metod
listener.actionPerformed(event)
, przekazujc do niej niniejszy obiekt
zdarzenia. ródo zdarze , takie jak przycisk, moe mie
kilku suchaczy. W takim przy-
padku kliknicie przycisku przez uytkownika powoduje wywoanie metod
actionPerformed
wszystkich suchaczy.
Rysunek 8.2 przedstawia relacje pomidzy ródem zdarze , suchaczem zdarze a obiek-
tem zdarze .
Przykad — obsuga kliknicia przycisku
Aby nabra
biegoci w posugiwaniu si modelem delegacji zdarze , przeanalizujemy szcze-
góowo prosty program reagujcy na kliknicie przycisku. Utworzymy panel zawierajcy trzy
przyciski, których zdarze bd nasuchiwa
trzy obiekty nasuchujce.
W tym przypadku za kadym razem, gdy uytkownik kliknie jeden z przycisków na panelu,
skojarzony z tym przyciskiem obiekt odbierze obiekt typu
ActionEvent
oznaczajcy kliknicie
przycisku. W odpowiedzi obiekt nasuchujcy zmieni kolor ta panelu.
Przed przejciem do programu, który nasuchuje klikni
przycisków, musimy najpierw za-
pozna
si z technik tworzenia i dodawania przycisków do panelu (wicej informacji na
temat elementów GUI znajduje si w rozdziale 9.).
358
Java. Podstawy
Rysunek 8.2.
Powiadamianie
o zdarzeniach
Tworzenie przycisku polega na podaniu jego konstruktorowi a cucha okrelajcego etykiet
przycisku, ikony lub jednego i drugiego. Poniej znajduj si przykady tworzenia dwóch
przycisków:
JButton yellowButton = new JButton("óty");
JButton blueButton = new JButton(new ImageIcon("blue-ball.gif"));
Przyciski do panelu dodaje si za pomoc metody
add
:
JButton yellowButton = new JButton("óty");
JButton blueButton = new JButton("Niebieski");
JButton redButton = new JButton("Czerwony");
buttonPanel.add(yellowButton);
buttonPanel.add(blueButton);
buttonPanel.add(redButton);
Wynik powyszych dziaa przedstawia rysunek 8.3.
Nastpnie konieczne jest dodanie procedur nasuchujcych tych przycisków. Do tego po-
trzebne s klasy implementujce interfejs
ActionListener
, który, jak ju wspominalimy,
zawiera tylko jedn metod:
actionPerformed
. Sygnatura niniejszej metody jest nastpujca:
public void actionPerformed(ActionEvent event)
Rozdzia 8.
Q
Obsuga zdarze
359
Rysunek 8.3.
Panel
z przyciskami
Interfejs
ActionListener nie ogranicza si tylko do klikni przycisków. Znajduje
on zastosowanie w wielu innych sytuacjach, takich jak:
Q
wybór elementu z pola listy za pomoc dwukrotnego kliknicia,
Q
wybór elementu menu,
Q
kliknicie klawisza Enter w polu tekstowym,
Q
upyw okrelonej iloci czasu dla komponentu
Timer.
Wicej szczegóów na ten temat znajduje si w niniejszym i kolejnym rozdziale.
Sposób uycia interfejsu
ActionListener jest taki sam we wszystkich sytuacjach:
metoda
actionPerformed (jedyna w interfejsie ActionListener) przyjmuje obiekt typu
ActionEvent jako parametr. Ten obiekt zdarzenia dostarcza informacji o zdarzeniu,
które miao miejsce.
Reakcj na kliknicie przycisku ma by
zmiana koloru ta panelu. dany kolor bdziemy
przechowywa
w klasie nasuchujcej:
class ColorAction implements ActionListener
{
public ColorAction(Color c)
{
backgroundColor = c;
}
public void actionPerformed(ActionEvent event)
{
// Ustawienie koloru ta panelu.
. . .
}
private Color backgroundColor;
}
Nastpnie dla kadego koloru tworzymy osobny obiekt i kady z nich rejestrujemy jako
suchacza przycisku.
ColorAction yellowAction = new ColorAction(Color.YELLOW);
ColorAction blueAction = new ColorAction(Color.BLUE);
ColorAction redAction = new ColorAction(Color.RED);
yellowButton.addActionListener(yellowAction);
blueButton.addActionListener(blueAction);
redButton.addActionListener(redAction);
360
Java. Podstawy
Jeli uytkownik kliknie na przykad przycisk z napisem
óty
, zostanie wywoana metoda
actionPerformed
obiektu
yellowAction
. Pole
backgroundColor
niniejszego obiektu ma warto
color.YELLOW
.
Zosta jeszcze tylko jeden problem do rozwizania. Obiekt typu
ColorAction
nie ma dost-
pu do zmiennej
buttonPanel
. Mona to rozwiza na jeden z dwóch sposobów. Mona za-
pisa panel w obiekcie
ColorAction
i skonstruowa go w konstruktorze
ColorAction
. Wygod-
niej jednak byoby, gdyby
ColorAction
bya klas wewntrzn klasy
ButtonFrame
. Dziki
temu jej metody miayby automatycznie dostp do zewntrznego panelu (wicej informacji
na temat klas wewntrznych znajduje si w rozdziale 6.).
Zastosujemy drug z opisanych metod. Poniej przedstawiamy klas
ColorAction
wewntrz
klasy
ButtonFrame
:
class ButtonPanel extends JFrame
{
. . .
private class ColorAction implements ActionListener
{
. . .
public void actionPerformed(ActionEvent event)
{
buttonPanel.setBackground(backgroundColor);
}
private Color backgroundColor;
}
private JPanel buttonPanel;
}
Przypatrzmy si uwaniej metodzie
actionPerformed
. Klasa
ColorAction
nie posiada pola
buttonPanel
. Ma go natomiast zewntrzna klasa
ButtonFrame
.
Jest to bardzo czsto spotykana sytuacja. Obiekty nasuchu zdarze czsto musz wykony-
wa
dziaania, które maj wpyw na inne obiekty. Klas nasuchujc czsto mona umieci
w strategicznym miejscu wewntrz klasy, której obiekt ma mie
zmieniony stan.
Listing 8.1 przedstawia kompletny program. Kliknicie jednego z przycisków powoduje
zmian koloru ta panelu przez odpowiedniego suchacza akcji.
Listing 8.1. ButtonTest.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* @version 1.33 2007-06-12
* @author Cay Horstmann
*/
public class ButtonTest
{
Rozdzia 8.
Q
Obsuga zdarze
361
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
ButtonFrame frame = new ButtonFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
/**
* Ramka z panelem zawierajcym przyciski.
*/
class ButtonFrame extends JFrame
{
public ButtonFrame()
{
setTitle("ButtonTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
// Tworzenie przycisków.
JButton yellowButton = new JButton("óty");
JButton blueButton = new JButton("Niebieski");
JButton redButton = new JButton("Czerwony");
buttonPanel = new JPanel();
// Dodanie przycisków do panelu.
buttonPanel.add(yellowButton);
buttonPanel.add(blueButton);
buttonPanel.add(redButton);
// Dodanie panelu do ramki.
add(buttonPanel);
// Utworzenie akcji przycisków.
ColorAction yellowAction = new ColorAction(Color.YELLOW);
ColorAction blueAction = new ColorAction(Color.BLUE);
ColorAction redAction = new ColorAction(Color.RED);
// Powizanie akcji z przyciskami.
yellowButton.addActionListener(yellowAction);
blueButton.addActionListener(blueAction);
redButton.addActionListener(redAction);
}
/**
* Suchacz akcji ustawiajcy kolor ta panelu.
*/
private class ColorAction implements ActionListener
{
362
Java. Podstawy
public ColorAction(Color c)
{
backgroundColor = c;
}
public void actionPerformed(ActionEvent event)
{
buttonPanel.setBackground(backgroundColor);
}
private Color backgroundColor;
}
private JPanel buttonPanel;
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}
javax.swing.JButton
1.2
Q
JButton(String label)
Q
JButton(Icon icon)
Q
JButton(String label, Icon icon)
Tworzy przycisk. a cuch etykiety moe zawiera
sam tekst lub (od Java SE 1.3)
kod HTML, np.
"<html><b>Ok</b></html>"
.
java.awt.Container
1.0
Q
Component add(Component c)
Dodaje komponent
c
do kontenera.
javax.swing.ImageIcon
1.2
Q
ImageIcon(String filename)
Tworzy ikon, której obraz jest zapisany w pliku.
Nabywanie biegoci w posugiwaniu si klasami wewntrznymi
Niektórzy programici nie przepadaj za klasami wewntrznymi, poniewa uwaaj, e klasy
i obiekty o duych rozmiarach spowalniaj dziaanie programu. Przyjrzyjmy si temu twier-
dzeniu. Nie potrzebujemy nowej klasy dla kadego elementu interfejsu uytkownika. W na-
szym programie wszystkie trzy przyciski wspódziel jedn klas nasuchujc. Oczywicie
kady z nich posiada osobny obiekt nasuchujcy. Ale obiekty te nie s due. Kady z nich
zawiera warto
okrelajc kolor i referencj do panelu. A tradycyjne rozwizanie, z zasto-
sowaniem instrukcji
if-else
, równie odwouje si do tych samych obiektów kolorów prze-
chowywanych przez suchaczy akcji, tylko e jako zmienne lokalne, a nie pola obiektów.
Rozdzia 8.
Q
Obsuga zdarze
363
Poniej przedstawiamy dobry przykad tego, jak anonimowe klasy wewntrzne mog upro-
ci
kod programu. W programie na listingu 8.1 z kadym przyciskiem zwizane s takie
same dziaania:
1.
Utworzenie przycisku z etykiet.
2.
Dodanie przycisku do panelu.
3.
Utworzenie suchacza akcji z odpowiednim kolorem.
4.
Dodanie suchacza akcji.
Napiszemy metod pomocnicz, która bdzie upraszczaa niniejsze czynnoci:
public void makeButton(String name, Color backgroundColor)
{
JButton button = new JButton(name);
buttonPanel.add(button);
ColorAction action = new ColorAction(backgroundColor);
button.addActionListener(action);
}
Teraz wystarcz tylko nastpujce wywoania:
makeButton("óty", Color.YELLOW);
makeButton("niebieski", Color.BLUE);
makeButton("czerwony", Color.RED);
Moliwe s dalsze uproszczenia. Zauwamy, e klasa
ColorAction
jest potrzebna tylko jeden
raz — w metodzie
makeButton
. A zatem mona j przerobi na klas anonimow:
public void makeButton(String name, final Color backgroundColor)
{
JButton button = new JButton(name);
buttonPanel.add(button);
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
buttonPanel.setBackground(backgroundColor);
}
});
}
Kod suchacza akcji sta si znacznie prostszy. Metoda
actionPerformed
odwouje si do
zmiennej parametrycznej
backgroundColor
(podobnie jak w przypadku wszystkich zmiennych
lokalnych wykorzystywanych w klasie wewntrznej, parametr ten musi by finalny).
Nie jest potrzebny aden jawny konstruktor. Jak widzielimy w rozdziale 6., mechanizm klas
wewntrznych automatycznie generuje konstruktor zapisujcy wszystkie finalne zmienne
lokalne, które s uywane w jednej z metod klasy wewntrznej.
364
Java. Podstawy
Anonimowe klasy wewntrzne potrafi zmyli niejednego programist. Mona jed-
nak przyzwyczai si do ich rozszyfrowywania, wyrabiajc sobie umiejtno po-
mijania wzrokiem kodu procedury:
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
buttonPanel.setBackground(backgroundColor);
}
});
Akcja przycisku ustawia kolor ta. Dopóki procedura obsugi zdarze skada si z tylko
kilku instrukcji, wydaje si, e z odczytem nie powinno by problemów, zwaszcza jeli
w sferze naszych zainteresowa nie le mechanizmy klas wewntrznych.
Suchaczem przycisku moe by obiekt kadej klasy, która implementuje interfejs
ActionListener. My wolimy uywa obiektów nowej klasy, która zostaa utworzona
specjalnie z myl o wykonywaniu akcji przycisku. Jednak niektórzy programici nie czuj
si pewnie w stosowaniu klas wewntrznych i wybieraj inne podejcie. Implementuj
interfejs
ActionListener w kontenerze róde zdarze. Nastpnie kontener ten ustawia
sam siebie jako suchacza w nastpujcy sposób:
yellowButton.addActionListener(this);
blueButton.addActionListener(this);
redButton.addActionListener(this);
W tej sytuacji aden z trzech przycisków nie ma osobnego suchacza. Dysponuj one
wspólnym obiektem, którym jest ramka przycisku. W zwizku z tym metoda
action-
Performed musi sprawdzi , który przycisk zosta kliknity.
class ButtonFrame extends JFrame
implements ActionListener
{
. . .
public void actionPerformed(ActionEvent event)
{
Object source = event.getSource();
if (source == yellowButton) . . .
else if (source == blueButton) . . .
else if (source == redButton ) . . .
else . . .
}
}
Jak wida , metoda ta jest nieco zagmatwana, przez co nie zalecamy jej stosowania.
java.util.EventObject
1.1
Q
Object setSource()
Zwraca referencj do obiektu, w którym wystpio zdarzenie.
Rozdzia 8.
Q
Obsuga zdarze
365
java.awt.event.ActionEvent
1.1
Q
String getActionCommand()
Zwraca a cuch polecenia skojarzonego z danym zdarzeniem akcji. Jeli zdarzenie
pochodzi od przycisku, a cuch polecenia jest taki sam jak etykieta przycisku,
chyba e zosta zmieniony za pomoc metody
setActionCommand
.
java.beans.EventHandler
1.4
Q
static Object create(Class listenerInterface, Object target, String action)
Q
static Object create(Class listenerInterface, Object target, String action,
String eventProperty)
Q
static Object create(Class listenerInterface, Object target, String action,
String eventProperty, String listenerMethod)
Tworzy obiekt klasy poredniczcej implementujcej dany interfejs. Albo podana
metoda, albo wszystkie metody interfejsu wykonuj dane akcje na rzecz obiektu
docelowego.
Akcj moe by
metoda lub wasno
obiektu docelowego. Jeli jest to wasno
,
wykonywana jest jej metoda ustawiajca. Na przykad akcja
text
jest zamieniana
na wywoanie metody
setText
.
Wasno
zdarzenia skada si z jednej lub wikszej liczby nazw wasnoci
oddzielonych kropkami. Pierwsza wasno
jest wczytywana z parametru metody
nasuchujcej. Druga wasno
pochodzi od powstaego obiektu itd. Wynik ko cowy
staje si parametrem akcji. Na przykad wasno
source.text
jest zamieniana
na wywoania metod
getSource
i
getText
.
Tworzenie suchaczy zawierajcych jedno wywoanie metody
W Java SE 1.4 wprowadzono mechanizm umoliwiajcy okrelanie prostych suchaczy zda-
rze bez tworzenia klas wewntrznych. Wyobramy sobie na przykad, e mamy przycisk
z etykiet Load, którego procedura obsugi zdarze zawiera tylko jedn metod:
frame.loadData();
Oczywicie mona uy anonimowej klasy wewntrznej:
loadButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
frame.loadData();
}
});
Ale klasa
EventHandler
moe utworzy takiego suchacza automatycznie, za pomoc nast-
pujcego wywoania:
EventHandler.create(ActionListener.class, frame, "loadData")
366
Java. Podstawy
Oczywicie nadal konieczne jest zainstalowanie procedury obsugi:
loadButton.addActionListener(
EventHandler.create(ActionListener.class, frame, "loadData"));
Jeli suchacz wywouje metod z jednym parametrem, który mona uzyska
z parametru
zdarzenia, mona uy
innego rodzaju metody
create
. Na przykad wywoanie:
EventHandler.create(ActionListener.class, frame, "loadData", "source.text")
jest równoznaczne z:
new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
frame.loadData(((JTextField) event.getSource()).getText());
}
}
Nazwy wasnoci
source
i
text
zamieniaj si w wywoania metod
getSource
i
getText
.
Przykad — zmiana stylu
Domylnym stylem programów pisanych przy uyciu Swinga jest Metal. Istniej dwa spo-
soby na zmian stylu. Pierwszy z nich polega na utworzeniu pliku swing.properties w katalogu
jre/lib w miejscu instalacji Javy. W pliku tym naley ustawi
wasno
swing.defaultlaf
na nazw klasy stylu, który chcemy zastosowa
. Na przykad:
swing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel
Zauwamy, e styl Metal jest zlokalizowany w pakiecie
javax.swing
. Pozostae style znaj-
duj si w pakiecie
com.sun.java
i nie musz by obecne w kadej implementacji Javy. Obec-
nie ze wzgldu na prawa autorskie pakiety stylów systemów Windows i Macintosh s dostpne
wycznie z wersjami rodowiska uruchomieniowego Javy przeznaczonymi dla tych systemów.
Poniewa w plikach wasnoci linie zaczynajce si od znaku
# s ignorowane,
mona w takim pliku umieci kilka stylów i wybiera je wedle upodobania, odpo-
wiednio zmieniajc pooenie znaku
#:
#swing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel
swing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel
#swing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel
Aby zmieni styl w ten sposób, konieczne jest ponowne uruchomienie programu. Pro-
gramy Swing wczytuj plik swing.properties tylko jeden raz — przy uruchamianiu.
Drugi sposób polega na dynamicznej zmianie stylu. Naley wywoa statyczn metod
UIManager.setLookAndFeel
oraz przekaza do niej nazw klasy wybranego stylu. Nastpnie
wywoujemy statyczn metod
SwingUtilities.updateComponentTreeUI
w celu odwieenia
caego zbioru komponentów. Metodzie tej wystarczy przekaza
tylko jeden komponent, a po-
zostae znajdzie ona samodzielnie. Metoda
UIManager.setLookAndFeel
moe spowodowa
Rozdzia 8.
Q
Obsuga zdarze
367
kilka wyjtków, jeli nie znajdzie danego stylu lub jeli wystpi bd podczas adowania
stylu. Jak zwykle nie zgbiamy kodu obsugujcego wyjtki, poniewa szczegóowo zajmie-
my si tym w rozdziale 11.
Poniszy przykadowy fragment programu przedstawia sposób przeczenia na styl Motif:
String plaf = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
try
{
UIManager.setLookAndFeel(plaf);
SwingUtilities.updateComponentTreeUI(panel);
}
catch(Exception e) { e.printStackTrace(); }
Aby odnale wszystkie zainstalowane style, naley uy wywoania:
UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();
W takiej sytuacji nazw kadego stylu i jego klasy mona uzyska nastpujco:
String name = infos[i].getName();
String className = infos[i].getClassName();
Listing 8.2 przedstawia peny kod programu demonstrujcego przeczanie stylów (zobacz
rysunek 8.4). Program ten jest podobny do programu z listingu 8.1. Idc za rad z poprzed-
niej sekcji, akcj przycisku, polegajc na zmianie stylu, okrelilimy za pomoc metody
pomocniczej
makeButton
i anonimowej klasy wewntrznej.
Listing 8.2. PlafTest.java
import java.awt.EventQueue;
import java.awt.event.*;
import javax.swing.*;
/**
* @version 1.32 2007-06-12
* @author Cay Horstmann
*/
public class PlafTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
PlafFrame frame = new PlafFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
368
Java. Podstawy
/**
* Ramka z panelem zawierajcym przyciski zmieniajce styl.
*/
class PlafFrame extends JFrame
{
public PlafFrame()
{
setTitle("PlafTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
buttonPanel = new JPanel();
UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();
for (UIManager.LookAndFeelInfo info : infos)
makeButton(info.getName(), info.getClassName());
add(buttonPanel);
}
/**
* Tworzy przycisk zmieniajcy styl.
* @param name nazwa przycisku
* @param plafName nazwa klasy stylu
*/
void makeButton(String name, final String plafName)
{
// Dodanie przycisku do panelu.
JButton button = new JButton(name);
buttonPanel.add(button);
// Ustawienie akcji przycisku.
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
// Akcja przycisku — przeczenie na nowy styl.
try
{
UIManager.setLookAndFeel(plafName);
SwingUtilities.updateComponentTreeUI(PlafFrame.this);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
}
private JPanel buttonPanel;
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}
Rozdzia 8.
Q
Obsuga zdarze
369
Rysunek 8.4.
Zmienianie stylu
Jedna rzecz w niniejszym programie jest godna szczególnej uwagi. Metoda
actionPerformed
wewntrznej klasy nasuchujcej akcji musi przekaza referencj
this
klasy zewntrznej
PlafFrame
do metody
updateComponentTreeUI
. Przypomnijmy sobie z rozdziau 6., e przed
wskanikiem
this
obiektu klasy zewntrznej musi znajdowa si przedrostek w postaci na-
zwy klasy zewntrznej:
SwingUtilities.updateComponentTreeUI(PlafPanel.this);
javax.swing.UIManager
1.2
Q
static UIManager.LookAndFeelInfo[] getInstalledLookAndFeels()
Tworzy tablic obiektów reprezentujcych zainstalowane style.
Q
static setLookAndFeel(String className)
Ustawia aktualny styl, wykorzystujc do tego podan nazw klasy
(np.
javax.swing.plaf.metal.MetalLookAndFeel
).
javax.swing.UIManager.LookAndFeelInfo
1.2
Q
String getName()
Zwraca nazw stylu.
Q
String getClassName()
Zwraca nazw klasy implementujcej dany styl.
370
Java. Podstawy
Klasy adaptacyjne
Nie wszystkie zdarzenia s tak atwe w obsudze jak kliknicie przycisku. W profesjonalnym
programie naley stale sprawdza
, czy uytkownik nie zamyka gównej ramki, aby zapo-
biec ewentualnej utracie jego danych. Gdy uytkownik zamyka ramk, powinno wywietla
si okno dialogowe monitujce o potwierdzenie niniejszego zamiaru.
Kiedy uytkownik zamyka okno, obiekt klasy
JFrame
jest ródem zdarzenia
WindowEvent
.
Aby przechwyci
to zdarzenie, konieczny jest odpowiedni obiekt nasuchujcy, który naley
doda
do listy suchaczy okna ramki.
WindowListener listener = . . .;
frame.addWindowListener(listener);
Obiekt nasuchujcy okna musi nalee do klasy implementujcej interfejs
WindowListener
.
Interfejs ten zawiera siedem metod. Ramka wywouje jedn z nich w odpowiedzi na jedno
z siedmiu zdarze , które mog mie
miejsce w przypadku okna. Nazwy tych metod mówi
same za siebie. Naley tylko wyjani
, e
iconfied
w systemie Windows oznacza to samo
co
minimized
. Poniej wida cay interfejs
WindowListener
:
public interface WindowListener
{
void windowOpened(WindowEvent e);
void windowClosing(WindowEvent e);
void windowClosed(WindowEvent e);
void windowIconified(WindowEvent e);
void windowDeiconified(WindowEvent e);
void windowActivated(WindowEvent e);
void windowDeactivated(WindowEvent e);
}
Aby sprawdzi , czy okno zostao zmaksymalizowane, naley zainstalowa obiekt
WindowStateListener. Zobacz wycig z API na stronie 373.
W Javie klasa, która implementuje dany interfejs, musi definiowa
wszystkie jego metody.
W tym przypadku oznacza to implementacj siedmiu metod. Przypomnijmy jednak, e inte-
resuje nas tylko jedna z nich, o nazwie
windowClosing
.
Oczywicie nic nie stoi na przeszkodzie, aby zaimplementowa
niniejszy interfejs, wstawi
wywoanie
System.exit(0)
do metody
windowClosing
i napisa sze nicnierobicych funkcji
dla pozostaych metod:
class Terminator implements WindowListener
{
public void windowClosing(WindowEvent e)
{
if (uytkownik potwierdza)
System.exit(0);
}
public void windowOpened(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
Rozdzia 8.
Q
Obsuga zdarze
371
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
}
Pisanie szeciu metod, które nic nie robi, jest tym rodzajem pracy, której nikt nie lubi. Za-
danie to uatwiaj klasy adaptacyjne (ang. adapter class) dostpne z kadym interfejsem
nasuchujcym w bibliotece
AWT
, który ma wicej ni jedn metod. Klasy te implementuj
wszystkie metody interfejsów, którym odpowiadaj, ale metody te nic nie robi. Na przykad
klasa
WindowAdapter
zawiera definicje siedmiu nicnierobicych metod. Oznacza to, e klasa
adaptacyjna automatycznie spenia wymagania techniczne stawiane przez Jav, a dotyczce
implementacji odpowiadajcego jej interfejsu nasuchujcego. Klas adaptacyjn mona roz-
szerzy
, definiujc w podklasie metody odpowiadajce niektórym, ale nie wszystkim typom
zdarze interfejsu (interfejsy, które maj tylko jedn metod, np.
ActionListener
, nie po-
trzebuj metod adaptacyjnych).
Rozszerzymy klas
WindowAdapter
. Odziedziczymy po niej sze nicnierobicych metod,
a metod
windowClossing
przesonimy:
class Terminator extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
if (uytkownik potwierdza)
System.exit(0);
}
}
Teraz moemy zarejestrowa obiekt typu
Terminator
jako suchacza zdarze :
WindowListener listener = new Terminator();
frame.addWindowListener(listener);
Kade zdarzenie okna wygenerowane przez ramk jest przekazywane do obiektu
listener
za pomoc wywoania jednej z jego siedmiu metod (zobacz rysunek 8.5). Sze
z nich nie
robi nic, a metoda
windowClosing
wywouje metod
System.exit(0)
, zamykajc tym samym
aplikacj.
Jeli w nazwie metody rozszerzanej klasy adaptacyjnej znajdzie si bd, kompi-
lator go nie wykryje. Jeli na przykad w klasie rozszerzajcej
WindowAdapter zo-
stanie zdefiniowana metoda
windowIsClosing, nowa klasa bdzie zawieraa osiem me-
tod, a metoda
windowClosing nic nie bdzie robia.
Utworzenie klasy rozszerzajcej klas adaptacyjn
WindowAdapter
jest krokiem naprzód, ale
mona posun si jeszcze dalej. Nie ma potrzeby nadawa obiektowi
listener
nazwy.
Wystarczy napisa :
frame.addWindowListener(new Terminator());
Ale czemu poprzestawa
na tym? Klasa nasuchujca moe by
anonimow klas we-
wntrzn ramki.
372
Java. Podstawy
Rysunek 8.5.
Obiekt
nasuchujcy
zdarze
dotyczcych okna
frame.addWindowListener(new
WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if (uytkownik potwierdza)
System.exit(0);
}
});
Powyszy fragment programu ma nastpujce dziaanie:
Q
Definiuje klas bez nazwy, rozszerzajc klas
WindowAdapter
.
Q
Do utworzonej anonimowej klasy dodaje metod
windowClosing
(podobnie jak
wczeniej, metoda ta zamyka program).
Q
Dziedziczy sze pozostaych nicnierobicych metod po klasie
WindowAdapter
.
Q
Tworzy obiekt tej nowej klasy — obiekt równie nie ma nazwy.
Q
Przekazuje niniejszy obiekt do metody
addWindowListener
.
Powtarzamy jeszcze raz, e do skadni wewntrznych klas anonimowych trzeba si przy-
zwyczai
. Dziki nim mona pisa
tak zwizy kod, jak to tylko moliwe.
Rozdzia 8.
Q
Obsuga zdarze
373
java.awt.event.WindowListener
1.1
Q
void windowOpened(WindowEvent e)
Jest wywoywana po otwarciu okna.
Q
void windowClosing(WindowEvent e)
Jest wywoywana, kiedy uytkownik wyda polecenie menedera okien,
aby zamkn
okno. Okno zostanie zamknite tylko wtedy, gdy zostanie wywoana
jego metoda
hide
lub
dispose
.
Q
void windowClosed(WindowEvent e)
Jest wywoywana po zamkniciu okna.
Q
void windowIconified(WindowEvent e)
Jest wywoywana po zminimalizowaniu okna.
Q
void windowDeiconified(WindowEvent e)
Jest wywoywana po przywróceniu okna.
Q
void windowActivated(WindowEvent e)
Jest wywoywana po uaktywnieniu okna. Aktywna moe by
tylko ramka lub okno
dialogowe. Z reguy meneder okien zaznacza w jaki sposób aktywne okno
— np. podwietlajc pasek tytuu.
Q
void WindowDeactivated(WindowEvent e)
Jest wywoywana po dezaktywowaniu okna.
java.awt.event.WindowStateListener
1.4
Q
void windowStateChanged(WindowEvent event)
Jest wywoywana po zmaksymalizowaniu, zminimalizowaniu lub przywróceniu
do normalnego rozmiaru okna.
java.awt.event.WindowEvent
1.1
Q
int getNewState() 1.4
Q
int getOldState() 1.4
Zwraca nowy i stary stan okna w zdarzeniu zmiany stanu okna. Zwracana liczba
cakowita jest jedn z nastpujcych wartoci:
Frame.NORMAL
Frame.ICONIFIED
Frame.MAXIMIZED_HORIZ
Frame.MAXIMIZED_VERT
Frame.MAXIMIZED_BOTH
374
Java. Podstawy
Akcje
Czsto jedn opcj mona wybra
na kilka rónych sposobów. Uytkownik moe wybra
odpowiedni funkcj w menu, nacisn
okrelony klawisz lub przycisk na pasku narzdzi.
Zaprogramowanie takiej funkcjonalnoci w modelu zdarze
AWT
jest proste — naley
wszystkie zdarzenia zwiza z tym samym obiektem nasuchujcym. Wyobramy sobie, e
blueAction
jest obiektem nasuchujcym akcji, którego metoda
actionPerformed
zmienia ko-
lor ta na niebieski. Jeden obiekt mona zwiza jako suchacza z kilkoma ródami zdarze :
Q
przyciskiem paska narzdzi z etykiet Niebieski;
Q
elementem menu z etykiet Niebieski;
Q
skrótem klawiszowym Ctrl+N.
Dziki temu zmiana koloru bdzie wykonywana zawsze w taki sam sposób, bez znaczenia,
czy wywoa j kliknicie przycisku, wybór elementu menu, czy nacinicie klawisza.
W pakiecie Swing dostpna jest niezwykle przydatna struktura opakowujca polecenia i wi-
ca je z rónymi ródami zdarze — interfejs
Action
. Akcja to obiekt, który opakowuje:
Q
opis polecenia (a cuch tekstowy i opcjonalna ikona),
Q
parametry niezbdne do wykonania polecenia (w naszym przypadku
wymagany kolor).
Interfejs
Action
zawiera nastpujce metody:
void actionPerformed(ActionEvent event)
void setEnabled(boolean b)
boolean isEnabled()
void putValue(String key, Object value)
Object getValue(String key)
void addPropertyChangeListener(PropertyChangeListener listener)
void removePropertyChangeListener(PropertyChangeListener listener)
Pierwsza z tych metod jest ju nam znana z interfejsu
ActionListener
. Naley doda , e inter-
fejs
Action
rozszerza interfejs
ActionListener
. W zwizku z tym wszdzie, gdzie powinien
znale si obiekt
ActionListener
, mona uy obiektu
Action
.
Dwie kolejne metody wczaj i wyczaj akcj oraz sprawdzaj, czy akcja jest aktualnie
wczona. Kiedy akcja jest zwizana z menu lub paskiem narzdzi i jest wyczona, odpo-
wiadajca jej opcja ma kolor szary.
Metody
putValue
i
getValue
zapisuj i pobieraj pary nazwa – warto z obiektu akcji. Nazwy
akcji i ikony s zapisywane w obiektach akcji za pomoc dwóch predefiniowanych a cu-
chów:
Action.NAME
i
Action.SMALL_ICON
:
action.putValue(Action.NAME, "Niebieski");
action.putValue(Action.SMALL_ICON, new ImageIcon("blue-ball.gif"));
Tabela 8.1 przedstawia zestawienie wszystkich predefiniowanych nazw tablicowych akcji.
Rozdzia 8.
Q
Obsuga zdarze
375
Tabela 8.1. Predefiniowane stae interfejsu Action
Nazwa
Warto
NAME
Nazwa akcji — wywietlana na przyciskach i elementach menu.
SMALL_ICON
Maa ikona — moe by
wywietlana na przyciskach, pasku narzdzi
lub elementach menu.
SHORT_DESCRIPTION
Krótki opis ikony — wywietlany w etykiecie narzdzia.
LONG_DESCRIPTION
Dugi opis ikony — do uytku w pomocy internetowej. aden komponent
Swinga nie uywa tej wartoci.
MNEMONIC_KEY
Skrót akcji — wywietlany na elementach menu (zobacz rozdzia 9.).
ACCELERATOR_KEY
Skrót klawiaturowy. aden komponent Swinga nie uywa tej wartoci.
ACTION_COMMAND_KEY
Uywana w przestarzaej ju metodzie
registerKeyboardAction
.
DEFAULT
Wasno
pasujca do wszystkiego. aden komponent Swinga nie uywa
tej wartoci.
Jeli obiekt akcji jest dodawany do menu lub paska narzdzi, jego nazwa i ikona s auto-
matycznie pobierane i wywietlane w menu lub na pasku narzdzi. Warto
wasnoci
SHORT_DESCRIPTION
zamienia si w dymek opisujcy narzdzie.
Pozostae dwie metody interfejsu
Action
umoliwiaj powiadamianie innych obiektów, zwasz-
cza menu i pasków narzdzi, które s ródem akcji, o zmianach wasnoci obiektu akcji.
Jeli na przykad menu jest dodawane jako obiekt nasuchujcy zmian wasnoci obiektu akcji
i obiekt ten zostanie nastpnie wyczony, menu zostanie wywoane, a nazwa akcji bdzie
szara. Obiekty nasuchu zmian wasnoci s ogóln konstrukcj stanowic cz
modelu
komponentów JavaBean. Wicej informacji na temat Beanów i ich wasnoci znajduje si
w drugim tomie.
Nie naley zapomina , e
Action
to interfejs, a nie klasa. Kada klasa implementujca go
musi definiowa
wszystkie siedem metod, które opisalimy. Na szczcie jaki dobry czowiek
napisa klas o nazwie
AbstractAction
, która implementuje wszystkie niniejsze metody
z wyjtkiem
actionPerformed
. Klasa ta zajmuje si zapisywaniem par nazwa – warto
i zarzdzaniem obiektami nasuchujcymi zmian wasnoci. Wystarczy rozszerzy klas
AbstractAction
i zdefiniowa metod
actionPerformed
.
Utworzymy obiekt wykonujcy polecenia zmiany koloru. Zapiszemy nazw polecenia, iko-
n i dany kolor. Kolor zapiszemy w tablicy par nazwa – warto
dostarczanej przez klas
AbstractAction
. Poniej znajduje si kod ródowy klasy
ColorAction
. Konstruktor ustawia
pary nazwa – warto , a metoda
actionPerformed
wykonuje akcj zmiany koloru.
public class ColorAction extends AbstractAction
{
public ColorAction(String name, Icon icon, Color c)
{
putValue(Action.NAME, name);
putValue(Action.SMALL_ICON, icon);
putValue("color", c);
putValue(Action.SHORT_DESCRIPTION, "Ustaw kolor panelu na " + name.toLowerCase());
}
376
Java. Podstawy
public void actionPerformed(ActionEvent event)
{
Color c = (Color) getValue("color");
buttonPanel.setBackground(c);
}
}
Nasz przykadowy program tworzy trzy obiekty niniejszej klasy, np.:
Action blueAction = new ColorAction("Niebieski", new ImageIcon("blue-ball.gif"),
´Color.BLUE);
Teraz konieczne jest zwizanie akcji z przyciskiem. Jest to atwe, poniewa moemy uy
konstruktora
JButton
, który przyjmuje obiekt typu
Action
.
JButton blueButton = new JButton(blueAction);
Konstruktor odczytuje nazw i ikon z akcji, ustawia krótki opis jako etykiet oraz ustawia
akcj jako suchacza. Ikony i etykiet przedstawia rysunek 8.6.
Rysunek 8.6.
Przyciski
zawieraj ikony
z obiektów akcji
W kolejnym rozdziale wykaemy, e tak samo atwe jest dodawanie tej samej akcji do menu.
Na koniec przypiszemy obiekty akcji do klawiszy, dziki czemu akcje te bd wykonywane,
kiedy uytkownik wpisze polecenia z klawiatury. Kojarzenie akcji z klawiszami naley za-
cz
od wygenerowania obiektu klasy
KeyStroke
. Klasa ta opakowuje opis klawisza.
Do utworzenia obiektu typu
KeyStroke
nie uywa si konstruktora, ale statycznej metody
getKeyStroke
klasy
KeyStroke
.
KeyStroke ctrlBKey = KeyStroke.getKeyStroke("ctrl N");
Do zrozumienia nastpnego etapu potrzebna jest znajomo
pojcia aktywnoci komponentu
(ang. keyboard focus). Interfejs uytkownika moe skada
si z wielu przycisków, menu,
pasków przewijania i innych komponentów. Kiedy zostanie nacinity klawisz, zdarzenie to
zostaje wysane do aktywnego komponentu. Komponent ten jest z reguy (cho
nie zawsze)
w jaki sposób wizualnie wyróniony. Na przykad w stylu Javy tekst na aktywnym przycisku
ma cienk obwódk. Fokus (aktywno
komponentu) mona przenosi
na róne kompo-
nenty za pomoc klawisza Tab. Nacinicie klawisza spacji powoduje kliknicie aktywnego
przycisku. Inne klawisze wywouj inne dziaania. Na przykad klawisze strzaek mog ste-
rowa
paskiem przewijania.
Jednak my nie chcemy wysya
zdarzenia nacinicia klawisza do aktywnego komponentu.
W przeciwnym razie kady przycisk musiaby zna
procedur obsugi kombinacji klawiszy
Ctrl+Y, Ctrl+B i Ctrl+R.
Rozdzia 8.
Q
Obsuga zdarze
377
Jest to bardzo powszechny problem. Jednak projektanci biblioteki Swing znaleli dla niego
proste rozwizanie. Kady
JComponent
posiada trzy mapy wejcia (ang. input maps), z których
kada odwzorowuje obiekty
KeyStroke
na zwizane z nimi akcje. Mapy te odpowiadaj trzem
rónym sytuacjom (zobacz tabela 8.2).
Tabela 8.2. Mapy klawiaturowe
Znacznik
Wywouje dziaanie, gdy
WHEN_FOCUSED
komponent jest aktywny;
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
komponent zawiera komponent aktywny;
WHEN_IN_FOCUSED_WINDOW
komponent znajduje si w tym samym oknie co komponent
aktywny.
Niniejsze mapy s sprawdzane w nastpujcej kolejnoci w wyniku nacinicia klawisza:
1.
Sprawdzenie mapy
WHEN_FOCUSED
aktywnego komponentu. Jeli dany skrót
klawiaturowy istnieje, nastpuje wykonanie powizanego z nim dziaania.
Jeli dziaanie zostaje wykonane, nastpuje zatrzymanie sprawdzania warunków.
2.
Nastpuje sprawdzenie map
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
aktywnego
komponentu, a nastpnie jego komponentów nadrzdnych. Gdy zostanie znaleziona
mapa z danym skrótem klawiaturowym, nastpuje wykonanie dziaania.
Jeli dziaanie zostaje wykonane, nastpuje zatrzymanie sprawdzania warunków.
3.
Odszukanie wszystkich widocznych i wczonych komponentów w aktywnym oknie,
w których mapie
WHEN_IN_FOCUSED_WINDOW
znajduje si dany skrót klawiaturowy.
Umoliwienie tym komponentom (w kolejnoci zgodnej z rejestracj zdarze
nacinicia klawisza) wykonania odpowiednich dziaa . Po wykonaniu pierwszego
dziaania nastpuje zatrzymanie przetwarzania. Ta cz
procesu moe by
ródem
problemów, jeli dany skrót klawiaturowy pojawia si w wicej ni jednej mapie
WHEN_IN_FOCUSED_WINDOW
.
Map wejcia komponentu tworzy si za pomoc metody
getInputMap
. Na przykad:
InputMap imap = panel.getInputMap(JComponent.WHEN_FOCUSED);
Warunek
WHEN_FOCUSED
powoduje, e ta mapa bdzie sprawdzana, gdy komponent jest ak-
tywny. Nam potrzebna jest inna mapa. Aktywny jest jeden z przycisków, nie panel. Do wsta-
wienia skrótów klawiszy zmieniajcych kolor nadaje si jedna z pozostaych dwóch map.
W naszym przykadowym programie uyjemy mapy
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
.
Klasa
InputMap
nie odwzorowuje bezporednio obiektów
KeyStroke
w postaci obiektów
Action
. W zamian odwzorowuje w postaci dowolnych obiektów, a druga mapa, zaimple-
mentowana w klasie
ActionMap
, mapuje obiekty na akcje. Dziki temu atwiej jest wspódzie-
li te same akcje przez skróty klawiaturowe pochodzce z rónych map wejcia.
A zatem kady komponent posiada trzy mapy wejcia i jedn map akcji (ang. action map).
Aby je powiza
, trzeba wymyli
nazwy dla akcji. Klawisz mona powiza
z akcj w na-
stpujcy sposób:
378
Java. Podstawy
imap.put(KeyStroke.getKeyStroke("ctrl Z"), "panel.yellow");
ActionMap amap = panel.getActionMap();
amap.put("panel.yellow", yellowAction);
W przypadku akcji niewykonujcej adnych dziaa zwyczajowo stosuje si a cuch
none
.
W ten sposób mona atwo dezaktywowa klawisz:
imap.put(KeyStroke.getKeyStroke("ctrl C"), "none");
Dokumentacja JDK zaleca stosowanie jako klucza akcji jej nazwy. Naszym zdaniem
nie jest to dobre rozwizanie. Nazwa akcji jest wywietlana na przyciskach i ele-
mentach menu, w zwizku z czym moe si zmienia w zalenoci od kaprysu projek-
tanta interfejsu oraz moe by przetumaczona na wiele jzyków. Takie niestae acu-
chy nie s dobrym wyborem w przypadku klawiszy wyszukiwania. Zalecamy wymylenie
nazw akcji niezalenych od wywietlanych nazw.
Poniej znajduje si zestawienie dziaa , które trzeba wykona
, aby wywoa
to samo dziaa-
nie w odpowiedzi na zdarzenie nacinicia przycisku, wyboru elementu z menu lub nacini-
cia klawisza:
1.
Utwórz podklas klasy
AbstractAction
. Mona uy tej samej klasy dla wielu
spokrewnionych akcji.
2.
Utwórz obiekt powyszej klasy akcji.
3.
Utwórz przycisk lub element menu z obiektu powyszej klasy akcji. Konstruktor
odczyta etykiet i ikon z tego obiektu.
4.
W przypadku akcji uruchamianych przez nacinicie klawisza konieczne jest
wykonanie dodatkowych czynnoci. Najpierw naley zlokalizowa
komponent
najwyszego poziomu w oknie, np. panel zawierajcy wszystkie pozostae elementy.
5.
Pobierz map
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
komponentu najwyszego
poziomu. Utwórz obiekt klasy
KeyStroke
reprezentujcy odpowiedni skrót
klawiaturowy. Utwórz obiekt bdcy kluczem dziaania, np. a cuch opisujcy
akcj. Wstaw niniejsz par danych (klawisz, klucz dziaania) do mapy wejcia.
6.
Pobierz map akcji komponentu najwyszego poziomu. Dodaj par klucz akcji
– obiekt akcji do tej mapy.
Listing 8.3 przedstawia kompletny kod programu mapujcego przyciski i klawisze na obiekty
akcji. Mona go wypróbowa
— kliknicie jednego z przycisków lub nacinicie kombinacji
klawiszy Ctrl+Z, Ctrl+N lub Ctrl+C spowoduje zmian koloru panelu.
Listing 8.3. ActionTest.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* @version 1.33 2007-06-12
* @author Cay Horstmann
*/
Rozdzia 8.
Q
Obsuga zdarze
379
public class ActionTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
ActionFrame frame = new ActionFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
/**
* Ramka z panelem, który demonstruje akcje zmiany koloru.
*/
class ActionFrame extends JFrame
{
public ActionFrame()
{
setTitle("ActionTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
buttonPanel = new JPanel();
// Definicje akcji.
Action yellowAction = new ColorAction("óty", new ImageIcon("yellow-ball.gif"),
Color.YELLOW);
Action blueAction = new ColorAction("Niebieski", new ImageIcon("blue-ball.gif"),
´Color.BLUE);
Action redAction = new ColorAction("Czerwony", new ImageIcon("red-ball.gif"),
´Color.RED);
// Dodanie przycisków dla akcji.
buttonPanel.add(new JButton(yellowAction));
buttonPanel.add(new JButton(blueAction));
buttonPanel.add(new JButton(redAction));
// Dodanie panelu do ramki.
add(buttonPanel);
// Powizanie klawiszy Z, N i C z nazwami.
InputMap imap = buttonPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_
´COMPONENT);
imap.put(KeyStroke.getKeyStroke("ctrl Z"), "panel.yellow");
imap.put(KeyStroke.getKeyStroke("ctrl N"), "panel.blue");
imap.put(KeyStroke.getKeyStroke("ctrl C"), "panel.red");
// Powizanie nazw z akcjami.
ActionMap amap = buttonPanel.getActionMap();
amap.put("panel.yellow", yellowAction);
amap.put("panel.blue", blueAction);
amap.put("panel.red", redAction);
}
380
Java. Podstawy
public class ColorAction extends AbstractAction
{
/**
* Tworzy akcj zmiany koloru.
* @param name nazwa, która pojawi si na przycisku
* @param icon ikona, która pojawi si na przycisku
* @param c kolor ta
*/
public ColorAction(String name, Icon icon, Color c)
{
putValue(Action.NAME, name);
putValue(Action.SMALL_ICON, icon);
putValue(Action.SHORT_DESCRIPTION, "Ustaw kolor panelu na " + name.
´toLowerCase());
putValue("color", c);
}
public void actionPerformed(ActionEvent event)
{
Color c = (Color) getValue("color");
buttonPanel.setBackground(c);
}
}
private JPanel buttonPanel;
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}
javax.swing.Action
1.2
Q
boolean isEnabled()
Q
void setEnabled(boolean b)
Pobiera lub ustawia wasno
enabled
akcji.
Q
void putValue(String key, Object value)
Wstawia par nazwa – warto do obiektu akcji.
Parametry:
key
Nazwa wasnoci, która ma zosta
zapisana z obiektem
akcji. Moe to by
dowolny a cuch, ale jest kilka nazw
o z góry zdefiniowanym znaczeniu — zobacz tabel 8.1
na stronie 375.
value
Obiekt powizany z nazw.
Q
Object getValue(String key)
Zwraca warto z zapisanej pary nazwa – warto .
Rozdzia 8.
Q
Obsuga zdarze
381
javax.swing.KeyStroke
1.2
Q
static KeyStroke getKeyStroke(String description)
Tworzy skrót klawiaturowy z czytelnego dla czowieka opisu (cigu a cuchów
rozdzielonych spacjami). Opis zaczyna si od zera lub wikszej liczby
modyfikatorów
shift control ctrl meta alt altGraph
, a ko czy si a cuchem
typed
i a cuchem skadajcym si z jednego znaku (na przykad
typed a
)
lub opcjonalnym specyfikatorem zdarzenia (
pressed
— domylny lub
released
)
i kodem klawisza. Kod klawisza, jeli ma przedrostek
VK_
, powinien odpowiada
staej
KeyEvent
, na przykad
INSERT
odpowiada
KeyEvent.VK_INSERT
.
javax.swing.JComponent
1.2
Q
ActionMap getActionMap()
1.3
Zwraca map wic klucze mapy akcji (które mog by
dowolnymi obiektami)
z obiektami klasy
Action
.
Q
InputMap getInputMap(int flag)
1.3
Pobiera map wejcia, która odwzorowuje klawisze w postaci kluczy mapy akcji.
Parametry:
flag
Warunek okrelajcy, kiedy element aktywny ma wywoa
akcj — jedna z wartoci z tabeli 8.2 na stronie 377.
Zdarzenia generowane przez mysz
Takie zdarzenia jak kliknicie przycisku lub elementu w menu za pomoc myszy nie wyma-
gaj pisania procedur obsugi. Niniejsze zdarzenia s obsugiwane automatycznie przez
róne elementy interfejsu uytkownika. Aby jednak umoliwi
rysowanie za pomoc myszy,
konieczne jest przechwycenie zdarze ruchu, kliknicia i przecigania myszy.
W niniejszym podrozdziale prezentujemy prosty edytor grafiki pozwalajcy umieszcza
, prze-
suwa
i usuwa
kwadraty z obszaru roboczego (zobacz rysunek 8.7).
Rysunek 8.7.
Program
obsugujcy
zdarzenia myszy
382
Java. Podstawy
Kiedy uytkownik nacinie przycisk myszy, wywoywane s trzy metody nasuchujce:
mousePressed
po naciniciu przycisku,
mouseReleased
po zwolnieniu przycisku myszy
i
mouseClicked
. Jeli w sferze zainteresowa le wycznie pene kliknicia, pierwsze dwie
z wymienionych metod mona pomin . Wywoujc metody
getX
i
getY
na rzecz obiektu
klasy
MouseEvent
, mona sprawdzi wspórzdne
x
i
y
wskanika myszy w chwili klik-
nicia. Do rozrónienia pojedynczych, podwójnych i potrójnych (!) klikni suy metoda
getClickCount
.
Niektórzy projektanci interfejsów tworz kombinacje klawiszy poczone z klikniciami
myszk, np. Ctrl+Shift+kliknicie. Naszym zdaniem jest to postpowanie niegodne nala-
dowania. Osoby, które nie zgadzaj si z nasz opini, moe przekona
fakt, e sprawdzanie
przycisków myszy i klawiszy specjalnych jest niezwykle zagmatwanym zadaniem — nieba-
wem si o tym przekonamy.
Aby sprawdzi
, które modyfikatory zostay ustawione, naley uy
maski bitowej. W ory-
ginalnym API dwie maski przycisków s równowane z maskami klawiszy specjalnych,
mianowicie:
BUTTON2_MASK == ALT_MASK
BUTTON3_MASK == META_MASK
Zrobiono tak, aby uytkownicy posiadajcy myszk z jednym przyciskiem mogli nalado-
wa
pozostae przyciski za pomoc klawiszy specjalnych (ang. modifier keys). Od Java SE 1.4
zaproponowano jednak inn metod. Od tej pory istniej nastpujce maski:
BUTTON1_DOWN_MASK
BUTTON2_DOWN_MASK
BUTTON3_DOWN_MASK
SHIFT_DOWN_MASK
CTRL_DOWN_MASK
ALT_DOWN_MASK
ALT_GRAPH_DOWN_MASK
META_DOWN_MASK
Metoda
getModifiersEx
zwraca dokadne informacje o przyciskach myszy i klawiszach spe-
cjalnych uytych w zdarzeniu myszy.
Pamitajmy, e maska
BUTTON3_DOWN_MASK
w systemie Windows sprawdza prawy (nie gówny)
przycisk myszy. Na przykad poniszy fragment programu sprawdza, czy prawy przycisk
myszy jest wcinity:
if ((event.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) != 0)
. . . // procedury obsugi zdarzenia kliknicia prawym przyciskiem myszy
W przykadowym programie definiujemy zarówno metod
mousePressed
, jak i
mouseClicked
.
Jeli uytkownik kliknie piksel nieznajdujcy si w obrbie adnego z narysowanych kwa-
dratów, zostanie dodany nowy kwadrat. Dziaanie to zostao zaimplementowane w metodzie
mousePressed
, a wic kwadrat pojawia si natychmiast po klikniciu, przed zwolnieniem
przycisku myszy. Dwukrotne kliknicie przyciskiem myszy w obrbie narysowanego kwa-
dratu powoduje jego usunicie. Implementacja tej funkcji zostaa umieszczona w metodzie
mouseClicked
, poniewa konieczne jest sprawdzenie liczby klikni :
Rozdzia 8.
Q
Obsuga zdarze
383
public void mousePressed(MouseEvent event)
{
current = find(event.getPoint());
if (current == null) // nie w obrbie adnego kwadratu
add(event.getPoint());
}
public void mouseClicked(MouseEvent event)
{
current = find(event.getPoint());
if (current != null && event.getClickCount() >= 2)
remove(current);
}
Kiedy kursor myszy przesuwa si nad oknem, odbiera ono stay strumie zdarze ruchu
myszy. Zauwamy, e s osobne interfejsy
MouseListener
i
MouseMotionListener
. Wyrónio-
no je z chci zwikszenia efektywnoci. Kiedy uytkownik przesuwa mysz, powstaje caa
masa zdarze dotyczcych tej czynnoci. Obiekt nasuchujcy, który oczekuje na kliknicia,
nie jest zajmowany przez nieinteresujce go zdarzenia ruchu.
Nasz testowy program przechwytuje zdarzenia ruchu i w odpowiedzi na nie zmienia wygld
kursora (na krzyyk). Odpowiedzialna jest za to metoda
getPredefinedCursor
z klasy
Cursor
.
Tabela 8.3 przedstawia stae podawane jako argument wspomnianej funkcji oraz reprezento-
wane przez nie kursory w systemie Windows.
Tabela 8.3. Przykadowe kursory
Ikona
Staa
Ikona
Staa
DEFAULT_CURSOR
NE_RESIZE_CURSOR
CROSSHAIR_CURSOR
E_RESIZE_CURSOR
HAND_CURSOR
SE_RESIZE_CURSOR
MOVE_CURSOR
S_RESIZE_CURSOR
TEXT_CURSOR
SW_RESIZE_CURSOR
WAIT_CURSOR
W_RESIZE_CURSOR
N_RESIZE_CURSOR
NW_RESIZE_CURSOR
Poniej znajduje si kod ródowy metody
mouseMoved
z klasy
MouseMotionListener
zdefi-
niowanej w naszym przykadowym programie:
public void mouseMoved(MouseEvent event)
{
if (find(event.getPoint()) == null)
setCursor(Cursor.getDefaultCursor());
else
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
384
Java. Podstawy
Mona zdefiniowa wasne typy kursorów. Suy do tego metoda
createCustom-
´Cursor z klasy Toolkit:
Toolkit tk = Toolkit.getDefaultToolkit();
Image img = tk.getImage("dynamite.gif");
Cursor dynamiteCursor = tk.createCustomCursor(img, new Point(10, 10), "dynamite
´stick");
Pierwszy argument niniejszej metody okrela plik graficzny przedstawiajcy kursor. Drugi
wyznacza przesunicie punktu aktywnego kursora. Trzeci jest acuchem opisujcym
kursor. acuch ten moe suy zwikszeniu dostpnoci. Na przykad program czytajcy
z ekranu uywany przez osob niedowidzc moe przeczyta opis takiego kursora.
Jeli w czasie przesuwania myszy uytkownik kliknie jej przycisk, generowane s wywoania
metody
mouseDragged
zamiast
mouseMoved
. Nasz przykadowy program zezwala na przeciga-
nie kwadratów pod kursorem. Efekt ten uzyskalimy, aktualizujc pooenie przeciganego
kwadratu, tak aby jego rodek znajdowa si w tym samym miejscu co punkt centralny myszki.
Nastpnie ponownie rysujemy obszar roboczy, aby ukaza
nowe pooenie kursora myszy.
public void mouseDragged(MouseEvent event)
{
if (current != null)
{
int x = event.getX();
int y = event.getY();
current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);
repaint();
}
Metoda
mouseMoved jest wywoywana tylko wtedy, gdy kursor znajduje si w ob-
rbie komponentu. Natomiast metoda
mouseDragged jest wywoywana nawet wtedy,
gdy kursor opuci komponent.
Istniej jeszcze dwie inne metody obsugujce zdarzenia myszy:
mouseEntered
i
mouseExited
.
S one wywoywane, gdy kursor myszy wchodzi do komponentu lub go opuszcza.
Na zako czenie wyjanimy sposób nasuchiwania zdarze generowanych przez mysz. Klik-
nicia przyciskiem myszy s raportowane przez metod
mouseClicked
nalec do interfejsu
MouseListener
. Poniewa wiele aplikacji korzysta wycznie z klikni myszk i wystpuj
one bardzo czsto, zdarzenia ruchu myszy i przecigania zostay zdefiniowane w osobnym
interfejsie o nazwie
MouseMotionListener
.
W naszym programie interesuj nas oba rodzaje zdarze generowanych przez mysz. Zdefi-
niowalimy dwie klasy wewntrzne o nazwach
MouseHandler
i
MouseMotionHandler
. Pierwsza
z nich jest podklas klasy
MouseAdapter
, poniewa definiuje tylko dwie z piciu metod interfej-
su
MouseListener
. Klasa
MouseMotionHandler
implementuje interfejs
MouseMotionListener
,
co znaczy, e zawiera definicje obu jego metod. Listing 8.4 przedstawia kod ródowy oma-
wianego programu.
Rozdzia 8.
Q
Obsuga zdarze
385
Listing 8.4. MouseTest.java
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.awt.geom.*;
import javax.swing.*;
/**
* @version 1.32 2007-06-12
* @author Cay Horstmann
*/
public class MouseTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
MouseFrame frame = new MouseFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
/**
* Ramka zawierajca panel testujcy dziaania myszy.
*/
class MouseFrame extends JFrame
{
public MouseFrame()
{
setTitle("MouseTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
// Dodanie komponentu do ramki.
MouseComponent component = new MouseComponent();
add(component);
}
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}
/**
* Komponent z dziaaniami myszy, do którego mona dodawa (lub z którego mona usuwa) kwadraty.
*/
class MouseComponent extends JComponent
{
public MouseComponent()
{
squares = new ArrayList<Rectangle2D>();
current = null;
386
Java. Podstawy
addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseMotionHandler());
}
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
// Rysowanie wszystkich kwadratów.
for (Rectangle2D r : squares)
g2.draw(r);
}
/**
* Znajduje pierwszy kwadrat zawierajcy punkt.
* @param p punkt
* @return pierwszy kwadrat zawierajcy punkt p
*/
public Rectangle2D find(Point2D p)
{
for (Rectangle2D r : squares)
{
if (r.contains(p)) return r;
}
return null;
}
/**
* Dodaje kwadrat do zbioru.
* @param p rodek kwadratu
*/
public void add(Point2D p)
{
double x = p.getX();
double y = p.getY();
current = new Rectangle2D.Double(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH,
SIDELENGTH);
squares.add(current);
repaint();
}
/**
* Usuwa kwadrat ze zbioru.
* @param s kwadrat, który ma by usunity
*/
public void remove(Rectangle2D s)
{
if (s == null) return;
if (s == current) current = null;
squares.remove(s);
repaint();
}
private static final int SIDELENGTH = 10;
private ArrayList<Rectangle2D> squares;
private Rectangle2D current;
Rozdzia 8.
Q
Obsuga zdarze
387
// Kwadrat zawierajcy kursor myszy.
private class MouseHandler extends MouseAdapter
{
public void mousePressed(MouseEvent event)
{
// Dodanie nowego kwadratu, jeli kursor nie jest wewntrz innego kwadratu.
current = find(event.getPoint());
if (current == null) add(event.getPoint());
}
public void mouseClicked(MouseEvent event)
{
// Usunicie kwadratu w wyniku jego dwukrotnego kliknicia.
current = find(event.getPoint());
if (current != null && event.getClickCount() >= 2) remove(current);
}
}
private class MouseMotionHandler implements MouseMotionListener
{
public void mouseMoved(MouseEvent event)
{
// Ustawienie kursora na krzyyk, jeli znajduje si wewntrz
// kwadratu.
if (find(event.getPoint()) == null) setCursor(Cursor.getDefaultCursor());
else setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
public void mouseDragged(MouseEvent event)
{
if (current != null)
{
int x = event.getX();
int y = event.getY();
// Przecignicie aktualnego kwadratu w celu wycentrowania go w punkcie (x, y).
current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH,
´SIDELENGTH);
repaint();
}
}
}
}
java.awt.event.MouseEvent
1.1
Q
int getX()
Q
int getY()
Q
Point getPoint()
Zwraca wspórzdne
x
(pozioma) i
y
(pionowa) lub punkt, w którym miao miejsce
zdarzenie, mierzc od lewego górnego rogu komponentu bdcego ródem
zdarzenia.
388
Java. Podstawy
Q
int getClickCount()
Zwraca liczb kolejnych klikni
przyciskiem myszy zwizanych z danym
zdarzeniem (odstp czasu oddzielajcy zdarzenia okrelane jako kolejne zaley
od systemu).
java.awt.event.InputEvent
1.1
Q
int getModifiersEx()
1.4
Zwraca rozszerzone modyfikatory zdarzenia. Do sprawdzania zwróconych
wartoci su nastpujce maski:
BUTTON1_DOWN_MASK
BUTTON2_DOWN_MASK
BUTTON3_DOWN_MASK
SHIFT_DOWN_MASK
CTRL_DOWN_MASK
ALT_DOWN_MASK
ALT_GRAPH_DOWN_MASK
META_DOWN_MASK
Q
static String getModifiersExText(int modifiers)
1.4
Zwraca a cuch typu
Shift+Button1
opisujcy rozszerzone modyfikatory w
danym zbiorze znaczników.
java.awt.Toolkit
1.0
Q
public Cursor createCustomCursor(Image image, Point hotSpot, String name)
1.2
Tworzy nowy obiekt niestandardowego kursora.
Parametry:
image
Obraz reprezentujcy kursor
hotSpot
Punkt centralny kursora (na przykad ko cówka strzaki
lub rodek krzyyka)
name
Opis kursora wspomagajcy dostpno
w specjalnych
rodowiskach
java.awt.Component
1.0
Q
public void setCursor(Cursor cursor)
1.1
Ustawia obraz kursora na okrelony kursor.
Hierarchia zdarze w bibliotece AWT
Majc ju pewne rozeznanie w temacie obsugi zdarze , na zako czenie niniejszego rozdziau
zrobimy krótki przegld architektury obsugi zdarze biblioteki
AWT
.
Rozdzia 8.
Q
Obsuga zdarze
389
Jak wspominalimy wczeniej, zdarzenia w Javie s obsugiwane w metodologii obiektowej,
a wszystkie zdarzenia pochodz od klasy
EventObject
z pakietu
java.util
(nazw wspólnej
nadklasy nie jest
Event
, poniewa tak nazw nosi klasa zdarze w starym modelu zdarze
— mimo e model ten jest obecnie odradzany, jego klasy nadal wchodz w skad biblio-
teki Javy).
Klasa
EventObject
posiada podklas
AWTEvent
bdc nadklas wszystkich klas zdarzenio-
wych
AWT
. Rysunek 8.8 przedstawia diagram dziedziczenia zdarze
AWT
.
Rysunek 8.8. Diagram dziedziczenia klas zdarzeniowych AWT
Niektóre komponenty Swing generuj obiekty zdarzeniowe jeszcze innych typów zdarze .
Rozszerzaj one bezporednio klas
EventObject
, a nie
AWTEvent
.
390
Java. Podstawy
Obiekty zdarzeniowe zawieraj informacje o zdarzeniach przesyanych przez ródo zda-
rze do swoich suchaczy. W razie potrzeby mona przeanalizowa
obiekty zdarzeniowe,
które zostay przekazane do obiektów nasuchujcych, co zrobilimy w przykadzie z przy-
ciskiem za pomoc metod
getSource
i
getActionCommands
.
Niektóre klasy zdarzeniowe
AWT
s dla programisty Javy bezuyteczne. Na przykad biblio-
teka
AWT
wstawia do kolejki zdarze obiekty
PaintEvent
, ale obiekty te nie s dostarczane
do suchaczy. Programici Javy nie nasuchuj zdarze rysowania. Przesaniaj oni metod
paintComponent
, aby móc kontrolowa ponowne rysowanie. Ponadto
AWT
generuje pewne
zdarzenia, które s potrzebne tylko programistom systemowym. Nie opisujemy tych specjal-
nych typów zdarze .
Zdarzenia semantyczne i niskiego poziomu
Biblioteka
AWT
rozrónia zdarzenia niskiego poziomu i zdarzenia semantyczne. Zdarzenie
semantyczne jest dzieem uytkownika ( jest to np. kliknicie przycisku). Dlatego zdarzenie
ActionEvent
jest zdarzeniem semantycznym. Zdarzenia niskiego poziomu to takie zdarze-
nia, które umoliwiaj zaistnienie zdarze semantycznych. W przypadku kliknicia przyci-
sku jest to jego nacinicie, szereg ruchów mysz i zwolnienie (ale tylko jeli zwolnienie
nastpi w obrbie przycisku). Moe to by
nacinicie klawisza majce miejsce po wybra-
niu przycisku przez uytkownika za pomoc klawisza Tab i nacinicia go za pomoc spa-
cji. Podobnie semantycznym zdarzeniem jest przesunicie paska przewijania, a ruch mysz
jest zdarzeniem niskiego poziomu.
Poniej znajduje si lista najczciej uywanych klas zdarze semantycznych pakietu
java.awt.event
:
Q
ActionEvent
— kliknicie przycisku, wybór elementu z menu, wybór elementu
listy, nacinicie klawisza Enter w polu tekstowym.
Q
AdjustmentEvent
— przesunicie paska przewijania.
Q
ItemEvent
— wybór jednego z pól do wyboru lub elementów listy.
Do najczciej uywanych klas zdarze niskiego poziomu zaliczaj si:
Q
KeyEvent
— nacinicie lub zwolnienie klawisza.
Q
MouseEvent
— nacinicie lub zwolnienie przycisku myszy, poruszenie
lub przecignicie mysz.
Q
MouseWheelEvent
— pokrcenie kókiem myszy.
Q
FocusEvent
— uaktywnienie lub dezaktywacja elementu.
Q
WindowEvent
— zmiana stanu okna.
Niniejszych zdarze nasuchuj nastpujce interfejsy:
ActionListener
AdjustmentListener
FocusListener
ItemListener
Rozdzia 8.
Q
Obsuga zdarze
391
KeyListener
MouseListener
MouseMotionListener
MouseWheelListener
WindowListener
WindowFocusListener
WindowStateListener
Niektóre interfejsy nasuchujce
AWT
, te zawierajce wicej ni jedn metod, posiadaj od-
powiadajce im klasy adaptacyjne, które implementuj wszystkie ich metody (pozostae inter-
fejsy maj tylko jedn metod, a wic utworzenie dla nich klas adaptacyjnych nie daoby
adnych korzyci). Ponisze klasy adaptacyjne s czsto uywane:
FocusAdapter
KeyAdapter
MouseAdapter
MouseMotionAdapter
WindowAdapter
Tabela 8.4 przedstawia najwaniejsze interfejsy nasuchowe, zdarzenia i róda zdarze bi-
blioteki AWT.
Tabela 8.4. Obsuga zdarze
Interfejs
Metody
Parametry/
metody dostpu
Zdarzenia
generowane przez
ActionListener
actionPerformed
ActionEvent
getActionCommand
getModifiers
AbstractButton
JComboBox
JTextField
Timer
AdjustmentListener
adjustmentValueChanged
AdjustmentEvent
getAdjustable
getAdjustmentType
getValue
JScrollbar
ItemListener
itemStateChanged
ItemEvent
getItem
getItemSelectable
getStateChange
AbstractButton
JComboBox
FocusListener
focusGained
focusLost
FocusEvent
isTemporary
Component
KeyListener
keyPressed
keyReleased
keyTyped
KeyEvent
getKeyChar
getKeyCode
getKeyModifiersText
getKeyText
isActionText
Component
392
Java. Podstawy
Tabela 8.4. Obsuga zdarze (cig dalszy)
Interfejs
Metody
Parametry/
metody dostpu
Zdarzenia
generowane przez
MouseListener
mousePressed
mouseReleased
mouseEntered
mouseExited
mouseClicked
MouseEvent
getClickCount
getX
getY
getPoint
translatePoint
Component
MouseMotionListener
mouseDragged
mouseMoved
MouseEvent
Component
MouseWheelListener
MouseWheelMoved
MouseWheelEvent
getWheelRotation
getScrollAmount
Component
WindowListener
windowClosing
windowOpened
windowIconified
windowDeiconified
windowClosed
windowActivated
windowDeactivated
WindowEvent
getWindow
Window
WindowFocusListener
windowGainedFocus
windowLostFocus
WindowEvent
getOppositeWindow
Window
WindowStateListener
windowStateChanged
WindowEvent
getOldState
getNewState
Window
Pakiet
javax.swing.event
zawiera dodatkowe zdarzenia specyficzne dla komponentów Swinga.
Niektóre z nich opisujemy w nastpnym rozdziale.
Na tym zako czymy opis technik obsugi zdarze
AWT
. W nastpnym rozdziale nauczymy
si wykorzystywa
najpopularniejsze komponenty Swinga oraz szczegóowo przeanalizu-
jemy generowane przez nie zdarzenia.