Java. Podstawy.
Wydanie VIII
Autor: Cay S. Horstmann, Gary Cornell
Tłumaczenie: Łukasz Piwko
ISBN: 978-83-246-1478-3
Tytuł oryginału: Core Java(TM),
Volume I--Fundamentals (8th Edition)
Format: 172x245, stron: 888
Zacznij tworzyć niezależne od platformy aplikacje jeszcze dziS!
" Jakie nowoSci kryją się w Java Standard Edition 6?
" Jak rozpocząć przygodę z językiem Java?
" Jak wykorzystać wielowątkowoSć?
Język programowania Java został stworzony i jest rozwijany przez firmę Sun
Microsystems. MożliwoSć zastosowania go na różnych platformach została doceniona
przez wielu programistów na Swiecie. Jednak nie jest to jedyna mocna strona Javy.
Warto tu wskazać również jej silne ukierunkowanie na obiektowoSć, obsługę
programowania rozproszonego, mechanizm automatycznego oczyszczania pamięci
(ang. garbage collection). Dzięki swoim atutom, dobrej dokumentacji i licznych
publikacjom Java jest dziS 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żliwoSć zapoznania się z elementami projektowania i tworzenia interfejsu
użytkownika. W ostatnim rozdziale autorzy omówią wielowątkowoSć 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
Wydawnictwo Helion
w kodzie WielowątkowoSć
ul. KoSciuszki 1c
Wykorzystaj siłę obiektów.
44-100 Gliwice
Programowanie obiektowe w języku Java ma przyszłoSć!
tel. 032 230 98 63
e-mail: helion@helion.pl
Spis tre ci
Podzi kowania .........................................................................................................................................13
Wst p ........................................................................................................................................................15
Rozdzia 1. Wst p do Javy ........................................................................................................................21
Java jako platforma programistyczna .............................................................................. 21
S owa klucze bia ej ksi gi Javy ...................................................................................... 22
Prosty .................................................................................................................... 23
Zorientowany obiektowo .......................................................................................... 23
Sieciowy ................................................................................................................. 24
Niezawodny ............................................................................................................ 24
Bezpieczny ............................................................................................................. 25
Niezale ny od architektury ....................................................................................... 26
Przeno ny .............................................................................................................. 26
Interpretowany ........................................................................................................ 27
Wysokowydajny ....................................................................................................... 27
Wielow tkowy ......................................................................................................... 27
Dynamiczny ............................................................................................................ 28
Aplety Javy i internet ..................................................................................................... 28
Krótka historia Javy ...................................................................................................... 30
G ówne nieporozumienia dotycz ce Javy ......................................................................... 32
Rozdzia 2. rodowisko programistyczne Javy ................................................................................... 37
Instalacja oprogramowania Java Development Kit ........................................................... 38
Pobieranie pakietu JDK ........................................................................................... 38
Ustawianie cie ki dost pu ...................................................................................... 40
Instalacja bibliotek i dokumentacji ............................................................................ 41
Instalacja przyk adowych programów ......................................................................... 42
Drzewo katalogów Javy ............................................................................................ 43
Wybór rodowiska programistycznego ............................................................................ 44
U ywanie narz dzi wiersza polece ................................................................................ 44
Rozwi zywanie problemów ....................................................................................... 46
4 Java. Podstawy
Praca w zintegrowanym rodowisku programistycznym .................................................... 47
Znajdowanie b dów kompilacji ................................................................................ 50
Uruchamianie aplikacji graficznej ................................................................................... 51
Tworzenie i uruchamianie apletów ................................................................................. 53
Rozdzia 3. Podstawowe elementy j zyka Java .................................................................................... 59
Prosty program w Javie ................................................................................................. 60
Komentarze ................................................................................................................. 63
Typy danych ................................................................................................................. 64
Typy ca kowite ........................................................................................................ 64
Typy zmiennoprzecinkowe ........................................................................................ 65
Typ char ................................................................................................................. 66
Typ boolean ............................................................................................................ 68
Zmienne ...................................................................................................................... 69
Inicjacja zmiennych ................................................................................................. 70
Sta e ...................................................................................................................... 70
Operatory .................................................................................................................... 71
Operatory inkrementacji i dekrementacji ................................................................... 72
Operatory relacyjne i logiczne ................................................................................... 73
Operatory bitowe ..................................................................................................... 74
Funkcje i sta e matematyczne .................................................................................. 75
Konwersja typów numerycznych ................................................................................ 76
Rzutowanie ............................................................................................................. 77
Nawiasy i priorytety operatorów ................................................................................ 78
Typ wyliczeniowy ..................................................................................................... 79
a cuchy ..................................................................................................................... 79
Pod a cuchy ........................................................................................................... 79
Konkatenacja ......................................................................................................... 80
a cuchów nie mo na modyfikowa .......................................................................... 80
Porównywanie a cuchów ......................................................................................... 82
Wspó rz dne kodowe znaków i jednostki kodowe ....................................................... 83
API String ............................................................................................................... 84
Dokumentacja API w internecie ................................................................................ 86
Sk adanie a cuchów ............................................................................................... 87
Wej cie i wyj cie .......................................................................................................... 90
Odbieranie danych wej ciowych ................................................................................ 90
Formatowanie danych wyj ciowych ........................................................................... 93
Zapis do pliku i odczyt ............................................................................................. 97
Przep yw sterowania ..................................................................................................... 99
Zasi g blokowy ....................................................................................................... 99
Instrukcje warunkowe ............................................................................................ 100
P tle .................................................................................................................... 102
P tle o okre lonej liczbie powtórze ....................................................................... 107
Wybór wielokierunkowy instrukcja switch ............................................................ 110
Instrukcje przerywaj ce przep yw sterowania ........................................................... 112
Wielkie liczby ............................................................................................................. 115
Tablice ...................................................................................................................... 118
P tla typu for each ................................................................................................ 119
Inicjowanie tablic i tworzenie tablic anonimowych .................................................... 120
Kopiowanie tablicy ................................................................................................ 120
Parametry wiersza polece .................................................................................... 122
Spis tre ci 5
Sortowanie tablicy ................................................................................................. 123
Tablice wielowymiarowe ......................................................................................... 127
Tablice postrz pione ............................................................................................. 130
Rozdzia 4. Obiekty i klasy .....................................................................................................................133
Wst p do programowania zorientowanego obiektowo .................................................... 134
Klasy ................................................................................................................... 134
Obiekty ................................................................................................................ 136
Identyfikacja klas .................................................................................................. 136
Relacje mi dzy klasami ......................................................................................... 137
U ywanie klas predefiniowanych .................................................................................. 139
Obiekty i zmienne obiektów .................................................................................... 139
Klasa GregorianCalendar ....................................................................................... 142
Metody udost pniaj ce i zmieniaj ce warto elementu ........................................... 144
Definiowanie w asnych klas ......................................................................................... 150
Klasa Employee .................................................................................................... 151
Stosowanie kilku plików ród owych ........................................................................ 154
Analiza klasy Employee ......................................................................................... 154
Pierwsze kroki w tworzeniu konstruktorów ............................................................... 155
Parametry jawne i niejawne .................................................................................... 156
Korzy ci z hermetyzacji .......................................................................................... 157
Przywileje klasowe ................................................................................................ 159
Metody prywatne ................................................................................................... 160
Sta e jako pola klasy ............................................................................................. 161
Pola i metody statyczne .............................................................................................. 161
Pola statyczne ...................................................................................................... 161
Sta e statyczne ..................................................................................................... 162
Metody statyczne .................................................................................................. 163
Metody fabrykuj ce ............................................................................................... 164
Metoda main ........................................................................................................ 165
Parametry metod ........................................................................................................ 167
Konstruowanie obiektów ............................................................................................. 173
Przeci anie ......................................................................................................... 173
Inicjacja pól warto ciami domy lnymi ...................................................................... 174
Konstruktor domy lny ............................................................................................ 175
Jawna inicjacja pól ................................................................................................ 175
Nazywanie parametrów .......................................................................................... 176
Wywo ywanie innego konstruktora .......................................................................... 177
Bloki inicjuj ce ...................................................................................................... 178
Niszczenie obiektów i metoda finalize ..................................................................... 182
Pakiety ...................................................................................................................... 182
Importowanie klas ................................................................................................. 183
Importy statyczne .................................................................................................. 185
Dodawanie klasy do pakietu .................................................................................. 185
Zasi g pakietów .................................................................................................... 188
cie ka klas .............................................................................................................. 190
Ustawianie cie ki 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 dotycz ce projektowania klas ........................................................................... 198
Rozdzia 5. Dziedziczenie .......................................................................................................................201
Klasy, nadklasy i podklasy .......................................................................................... 202
Hierarchia dziedziczenia ........................................................................................ 208
Polimorfizm .......................................................................................................... 208
Wi zanie dynamiczne ............................................................................................ 210
Wy czanie dziedziczenia klasy i metody finalne .................................................. 213
Rzutowanie ........................................................................................................... 214
Klasy abstrakcyjne ................................................................................................ 216
Dost p chroniony .................................................................................................. 221
Klasa bazowa Object .................................................................................................. 222
Metoda equals ..................................................................................................... 223
Porównywanie a dziedziczenie ................................................................................ 224
Metoda hashCode ................................................................................................. 227
Metoda toString .................................................................................................... 229
Generyczne listy tablicowe .......................................................................................... 234
Dost p do elementów listy tablicowej ..................................................................... 237
Zgodno pomi dzy typowanymi a surowymi listami tablicowymi ............................... 241
Os ony obiektów i autoboxing ...................................................................................... 242
Metody ze zmienn liczb parametrów ......................................................................... 245
Klasy wyliczeniowe ..................................................................................................... 246
Refleksja ................................................................................................................... 248
Klasa Class .......................................................................................................... 249
Podstawy przechwytywania wyj tków ....................................................................... 251
Zastosowanie refleksji w analizie funkcjonalno ci klasy ............................................ 253
Refleksja w analizie obiektów w czasie dzia ania programu ....................................... 258
Zastosowanie refleksji w generycznym kodzie tablicowym ......................................... 263
Wska niki do metod .............................................................................................. 267
Porady projektowe dotycz ce dziedziczenia ................................................................... 270
Rozdzia 6. Interfejsy i klasy wewn trzne ..........................................................................................273
Interfejsy ................................................................................................................... 274
W asno ci interfejsów ............................................................................................ 279
Interfejsy a klasy abstrakcyjne ............................................................................... 280
Klonowanie obiektów .................................................................................................. 281
Interfejsy a sprz enie zwrotne .................................................................................... 287
Klasy wewn trzne ....................................................................................................... 290
Dost p do stanu obiektu w klasie wewn trznej ........................................................ 292
Specjalne regu y sk adniowe dotycz ce klas wewn trznych ....................................... 295
Czy klasy wewn trzne s potrzebne i bezpieczne? .................................................... 296
Lokalne klasy wewn trzne ..................................................................................... 298
Dost p do zmiennych finalnych z metod zewn trznych .............................................. 299
Anonimowe klasy wewn trzne ................................................................................ 301
Statyczne klasy wewn trzne ................................................................................... 304
Klasy proxy ................................................................................................................ 307
W asno ci klas proxy ............................................................................................. 311
Spis tre ci 7
Rozdzia 7. Grafika .................................................................................................................................313
Wprowadzenie do pakietu Swing .................................................................................. 314
Tworzenie ramki ......................................................................................................... 317
Pozycjonowanie ramki ................................................................................................. 320
W asno ci ramek .................................................................................................. 322
Okre lanie rozmiaru ramki ..................................................................................... 323
Wy wietlanie informacji w komponencie ....................................................................... 327
Figury 2W .................................................................................................................. 331
Kolory ....................................................................................................................... 339
Czcionki .................................................................................................................... 343
Wy wietlanie obrazów ................................................................................................. 351
Rozdzia 8. Obs uga zdarze .................................................................................................................355
Podstawy obs ugi zdarze ........................................................................................... 355
Przyk ad obs uga klikni cia przycisku .................................................................. 357
Nabywanie bieg o ci w pos ugiwaniu si klasami wewn trznymi ................................ 362
Tworzenie s uchaczy zawieraj cych jedno wywo anie metody ..................................... 365
Przyk ad 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 u ytkownika .....................................................................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 zarz dzania rozk adem ..................................................................... 400
Rozk ad brzegowy .................................................................................................. 403
Rozk ad siatkowy .................................................................................................. 405
Wprowadzanie tekstu ................................................................................................. 409
Pola tekstowe ....................................................................................................... 409
Etykiety komponentów ........................................................................................... 411
Pola hase ............................................................................................................ 413
Obszary tekstowe .................................................................................................. 413
Panele przewijane ................................................................................................. 414
Komponenty umo liwiaj ce wybór opcji ........................................................................ 417
Pola wyboru .......................................................................................................... 417
Prze czniki .......................................................................................................... 420
Obramowanie ....................................................................................................... 424
Listy rozwijalne ..................................................................................................... 428
Suwaki ................................................................................................................. 432
Menu ........................................................................................................................ 438
Tworzenie menu .................................................................................................... 439
Ikony w elementach menu ..................................................................................... 441
Pola wyboru i prze czniki jako elementy menu ........................................................ 442
Menu podr czne ................................................................................................... 444
Mnemoniki i akceleratory ....................................................................................... 445
8 Java. Podstawy
Aktywowanie i dezaktywowanie elementów menu ..................................................... 448
Paski narz dzi ...................................................................................................... 451
Dymki .................................................................................................................. 453
Zaawansowane techniki zarz dzania rozk adem ............................................................ 456
Rozk ad GridBagLayout .......................................................................................... 458
Rozk ad grupowy ................................................................................................... 468
Nieu ywanie adnego zarz dcy rozk adu .................................................................. 478
Niestandardowi zarz dcy rozk adu .......................................................................... 479
Kolejka dost pu .................................................................................................... 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 u ytku ............................................................525
Pliki JAR .................................................................................................................... 526
Manifest .............................................................................................................. 526
Wykonywalne pliki JAR ........................................................................................... 528
Zasoby ................................................................................................................. 529
Piecz towanie 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 przekazuj ce informacje do apletów ........................................................ 557
Dost p do obrazów i plików audio .......................................................................... 562
rodowisko dzia ania apletu ................................................................................... 563
Zapisywanie preferencji u ytkownika ............................................................................ 572
Mapy w asno ci .................................................................................................... 572
API Preferences .................................................................................................... 577
Rozdzia 11. Wyj tki, dzienniki, asercje i debugowanie .......................................................................585
Obs uga b dów ......................................................................................................... 586
Klasyfikacja wyj tków ............................................................................................ 587
Deklarowanie wyj tków kontrolowanych .................................................................. 589
Zg aszanie wyj tków .............................................................................................. 591
Tworzenie klas wyj tków ........................................................................................ 593
Przechwytywanie wyj tków ........................................................................................... 594
Przechwytywanie wielu typów wyj tków .................................................................... 596
Powtórne generowanie wyj tków i budowanie a cuchów wyj tków ............................ 596
Klauzula finally ..................................................................................................... 597
Analiza danych ze ledzenia stosu .......................................................................... 601
Wskazówki dotycz ce stosowania wyj tków .................................................................. 604
Spis tre ci 9
Asercje ...................................................................................................................... 607
W czanie i wy czanie asercji ................................................................................ 608
Zastosowanie asercji w sprawdzaniu parametrów .................................................... 608
Zastosowanie asercji w dokumentacji za o e ......................................................... 610
Dzienniki ................................................................................................................... 611
Podstawy zapisu do dziennika ................................................................................ 611
Zaawansowane techniki zapisu do dziennika ........................................................... 612
Zmiana konfiguracji mened era dzienników ............................................................. 614
Lokalizacja ........................................................................................................... 615
Obiekty typu Handler ............................................................................................. 616
Filtry .................................................................................................................... 620
Formatery ............................................................................................................. 620
Przepis na dziennik ............................................................................................... 620
Wskazówki dotycz ce debugowania ............................................................................. 629
U ywanie okna konsoli .......................................................................................... 635
ledzenie zdarze AWT .......................................................................................... 636
Zaprz ganie 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 wyra e generycznych ............................................................................ 659
Translacja metod uogólnionych .............................................................................. 660
U ywanie starego kodu .......................................................................................... 662
Ograniczenia i braki .................................................................................................... 663
Nie mo na podawa typów prostych jako parametrów typowych ................................ 663
Sprawdzanie typów w czasie dzia ania programu jest mo liwe tylko
dla typów surowych ............................................................................................ 663
Obiektów klasy uogólnionej nie mo na generowa ani przechwytywa ........................ 664
Nie mo na tworzy tablic typów uogólnionych .......................................................... 665
Nie wolno tworzy egzemplarzy zmiennych typowych ................................................. 665
Zmiennych typowych nie mo na u ywa w statycznych kontekstach klas uogólnionych ... 667
Uwa aj 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
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 powi zane .................................................................................................... 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 opakowuj ce ................................................................................. 733
Operacje zbiorcze .................................................................................................. 739
Konwersja pomi dzy kolekcjami a tablicami ............................................................ 740
Algorytmy ................................................................................................................... 741
Sortowanie i tasowanie ......................................................................................... 742
Wyszukiwanie binarne ........................................................................................... 745
Proste algorytmy ................................................................................................... 746
Pisanie w asnych algorytmów ................................................................................. 748
Stare kolekcje ............................................................................................................ 749
Klasa Hashtable ................................................................................................... 749
Wyliczenia ............................................................................................................ 750
Mapy w asno ci .................................................................................................... 751
Stosy ................................................................................................................... 751
Zbiory bitów .......................................................................................................... 752
Rozdzia 14. Wielow tkowo ...............................................................................................................757
Czym s w tki ............................................................................................................ 758
Wykonywanie zada w osobnych w tkach ................................................................ 763
Przerywanie w tków .................................................................................................... 769
Stany w tków ............................................................................................................. 771
W tki NEW ........................................................................................................... 772
W tki RUNNABLE .................................................................................................. 772
W tki BLOCKED i WAITING ..................................................................................... 773
Zamykanie w tków ................................................................................................ 773
W asno ci w tków ...................................................................................................... 775
Priorytety w tków .................................................................................................. 775
W tki demony ....................................................................................................... 776
Procedury obs ugi nieprzechwyconych wyj tków ....................................................... 777
Synchronizacja ........................................................................................................... 778
Przyk ad sytuacji powoduj cej wy cig ...................................................................... 778
Wy cigi ................................................................................................................ 783
Obiekty klasy Lock ................................................................................................ 784
Warunki ............................................................................................................... 787
S owo kluczowe synchronized ................................................................................. 792
Bloki synchronizowane .......................................................................................... 796
Monitor ................................................................................................................ 797
Spis tre ci 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 blokuj ce ........................................................................................................ 808
Kolekcje bezpieczne w tkowo ...................................................................................... 815
Szybkie mapy, zbiory i kolejki ................................................................................. 815
Tablice kopiowane przy zapisie ............................................................................... 817
Starsze kolekcje bezpieczne w tkowo ..................................................................... 817
Interfejsy Callable i Future ........................................................................................... 819
Klasa Executors ......................................................................................................... 823
Pule w tków ......................................................................................................... 824
Planowanie wykonywania ....................................................................................... 828
Kontrolowanie grup zada ...................................................................................... 829
Synchronizatory .......................................................................................................... 830
Semafory ............................................................................................................. 830
Klasa CountDownLatch .......................................................................................... 831
Bariery ................................................................................................................. 832
Klasa Exchanger ................................................................................................... 833
Kolejki synchroniczne ............................................................................................ 833
Przyk ad wstrzymywanie i ponowne uruchamianie animacji ................................... 833
W tki a biblioteka Swing ............................................................................................. 839
Uruchamianie czasoch onnych zada ...................................................................... 840
Klasa SwingWorker ............................................................................................... 845
Zasada jednego w tku .......................................................................................... 851
Dodatek A S owa kluczowe Javy ..........................................................................................................853
Skorowidz .............................................................................................................................................855
8
Obs uga zdarze
W tym rozdziale:
Podstawy obs ugi zdarze
Akcje
Zdarzenia generowane przez mysz
Hierarchia zdarze AWT
Obs uga zdarze ma fundamentalne znaczenie w programach z graficznym interfejsem u yt-
kownika. Ka dy, kto chce tworzy interfejsy graficzne w Javie, musi opanowa obs ug zda-
rze . Niniejszy rozdzia opisuje model obs ugi zdarze biblioteki AWT. Do opisywanych
zagadnie nale przechwytywanie zdarze w komponentach interfejsu u ytkownika i urz -
dzeniach wej ciowych, a tak e akcje (ang. actions), czyli bardziej strukturalna metoda
przetwarzania zdarze .
Podstawy obs ugi zdarze
Ka dy system operacyjny posiadaj cy graficzny interfejs u ytkownika stale monitoruje za-
chodz ce w nim zdarzenia, jak naciskanie klawiszy na klawiaturze czy klikni cia przyciskiem
myszy. Informacje o tych zdarzeniach s przesy ane do uruchomionych programów. Nast p-
nie ka dy program podejmuje samodzieln decyzj , w jaki sposób, je li w ogóle, zareagowa
na te zdarzenia. W takich j zykach jak Visual Basic relacje pomi dzy zdarzeniami a kodem
s oczywiste. Programista pisze kod obs ugi ka dego interesuj cego go zdarzenia i umieszcza
go w tzw. procedurze obs ugi zdarze (ang. event procedure). Na przyk ad z przyciskiem
o nazwie HelpButton w j zyku Visual Basic mo e by skojarzona procedura obs ugi zdarze
o nazwie HelpButton_Click. Kod niniejszej procedury jest wykonywany w odpowiedzi na
ka de klikni cie niniejszego przycisku. Ka dy komponent GUI w j zyku Visual Basic reaguje
na ustalony zestaw zdarze nie mo na zmieni zdarze , na które reaguje dany komponent.
356 Java. Podstawy
Natomiast programi ci czystego j zyka C zajmuj cy si zdarzeniami musz pisa procedury
nieprzerwanie monitoruj ce kolejk zdarze w celu sprawdzenia, jakie powiadomienia prze-
sy a system operacyjny (z regu y do tego celu stosuje si p tl zawieraj c bardzo rozbudowan
instrukcj switch!). Technika ta jest oczywi cie bardzo ma o elegancka i sprawia wiele pro-
blemów podczas pisania kodu. Jej zalet jest natomiast to, e nie ma adnych ogranicze
dotycz cych zdarze , na które mo na reagowa , w przeciwie stwie do innych j zyków, np.
Visual Basica, które wk adaj bardzo du o wysi ku w ukrywanie kolejki zdarze przed
programist .
W rodowisku programistycznym Javy przyj to podej cie po rednie pomi dzy j zykami Visual
Basic a C, je li chodzi o oferowane mo liwo ci, a co za tym idzie tak e z o ono . Poru-
szaj c si w zakresie zdarze , które obs uguje biblioteka AWT, programista ma pe n kontrol
nad sposobem przesy ania zdarze ze róde zdarze (ang. event sources), np. przycisków lub
pasków przewijania, do s uchaczy zdarze (ang. event listener). Na s uchacza zdarze mo na
desygnowa ka dy obiekt w praktyce wybiera si ten obiekt, który z atwo ci mo e wy-
kona odpowiednie dzia ania w odpowiedzi na zdarzenie. Ten delegacyjny model zdarze daje
znacznie wi ksze mo liwo ci ni j zyk Visual Basic, w którym s uchacz jest ustalony z góry.
ród a zdarze dysponuj metodami, w których mo na rejestrowa s uchaczy zdarze . Kiedy
ma miejsce okre lone zdarzenie, ród o wysy a powiadomienie o nim do wszystkich obiektów
nas uchuj cych, które zosta y dla niego zarejestrowane.
Jak mo na si spodziewa , informacje o zdarzeniu w j zyku obiektowym, takim jak Java, s
pakowane w obiekcie zdarze (ang. event object). W Javie wszystkie obiekty zdarze nale
do klasy java.util.EventObject. Oczywi cie istniej te podklasy reprezentuj ce ka dy typ
zdarzenia, takie jak ActionEvent czy WindowEvent.
Ró ne ród a zdarze mog dostarcza ró nego rodzaju zdarze . Na przyk ad przycisk mo e
wysy a obiekty ActionEvent, podczas gdy okno wysy a obiekty WindowEvent.
Podsumujmy, co ju wiemy na temat obs ugi zdarze w bibliotece AWT:
Obiekt nas uchuj cy jest egzemplarzem klasy implementuj cej specjalny interfejs
nas uchu (ang. listener interface).
ród o zdarze to obiekt, który mo e rejestrowa obiekty nas uchuj ce i wysy a
do nich obiekty zdarze .
ród o zdarze wysy a obiekty zdarze do wszystkich zarejestrowanych s uchaczy
w chwili wyst pienia zdarzenia.
Informacje zawarte w obiekcie zdarze s wykorzystywane przez obiekty nas uchuj ce
przy podejmowaniu decyzji dotycz cej reakcji na zdarzenie.
Rysunek 8.1 przedstawia relacje pomi dzy klasami obs ugi zdarze a interfejsami
Poni ej znajduje si przyk adowa definicja s uchacza:
ActionListener listener = . . .;
JButton button = new JButton("Ok");
button.addActionListener(listener);
Rozdzia 8. Obs uga zdarze 357
Rysunek 8.1.
Relacje pomi dzy
ród ami zdarze
a s uchaczami
Od tej pory obiekt listener b dzie powiadamiany o ka dym zdarzeniu akcji w przycisku.
Jak si mo na domy li , zdarzenie akcji w przypadku przycisku to jego klikni cie.
Klasa implementuj ca 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 klikni cie przycisku.
. . .
}
}
Kiedy u ytkownik kliknie przycisk, obiekt typu JButton tworzy obiekt typu ActionEvent
i wywo uje metod listener.actionPerformed(event), przekazuj c do niej niniejszy obiekt
zdarzenia. ród o zdarze , takie jak przycisk, mo e mie kilku s uchaczy. W takim przy-
padku klikni cie przycisku przez u ytkownika powoduje wywo anie metod actionPerformed
wszystkich s uchaczy.
Rysunek 8.2 przedstawia relacje pomi dzy ród em zdarze , s uchaczem zdarze a obiek-
tem zdarze .
Przyk ad obs uga klikni cia przycisku
Aby nabra bieg o ci w pos ugiwaniu si modelem delegacji zdarze , przeanalizujemy szcze-
gó owo prosty program reaguj cy na klikni cie przycisku. Utworzymy panel zawieraj cy trzy
przyciski, których zdarze b d nas uchiwa trzy obiekty nas uchuj ce.
W tym przypadku za ka dym razem, gdy u ytkownik kliknie jeden z przycisków na panelu,
skojarzony z tym przyciskiem obiekt odbierze obiekt typu ActionEvent oznaczaj cy klikni cie
przycisku. W odpowiedzi obiekt nas uchuj cy zmieni kolor t a panelu.
Przed przej ciem do programu, który nas uchuje klikni przycisków, musimy najpierw za-
pozna si z technik tworzenia i dodawania przycisków do panelu (wi cej 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 okre laj cego etykiet
przycisku, ikony lub jednego i drugiego. Poni ej znajduj si przyk ady 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 powy szych dzia a przedstawia rysunek 8.3.
Nast pnie konieczne jest dodanie procedur nas uchuj cych tych przycisków. Do tego po-
trzebne s klasy implementuj ce interfejs ActionListener, który, jak ju wspominali my,
zawiera tylko jedn metod : actionPerformed. Sygnatura niniejszej metody jest nast puj ca:
public void actionPerformed(ActionEvent event)
Rozdzia 8. Obs uga 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:
wybór elementu z pola listy za pomoc dwukrotnego klikni cia,
wybór elementu menu,
klikni cie klawisza Enter w polu tekstowym,
up yw okre lonej ilo ci czasu dla komponentu Timer.
Wi cej szczegó ów na ten temat znajduje si w niniejszym i kolejnym rozdziale.
Sposób u ycia 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 mia o miejsce.
Reakcj na klikni cie przycisku ma by zmiana koloru t a panelu. dany kolor b dziemy
przechowywa w klasie nas uchuj cej:
class ColorAction implements ActionListener
{
public ColorAction(Color c)
{
backgroundColor = c;
}
public void actionPerformed(ActionEvent event)
{
// Ustawienie koloru t a panelu.
. . .
}
private Color backgroundColor;
}
Nast pnie dla ka dego koloru tworzymy osobny obiekt i ka dy z nich rejestrujemy jako
s uchacza 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
Je li u ytkownik kliknie na przyk ad przycisk z napisem ó ty, zostanie wywo ana metoda
actionPerformed obiektu yellowAction. Pole backgroundColor niniejszego obiektu ma warto
color.YELLOW.
Zosta jeszcze tylko jeden problem do rozwi zania. Obiekt typu ColorAction nie ma dost -
pu do zmiennej buttonPanel. Mo na to rozwi za na jeden z dwóch sposobów. Mo na za-
pisa panel w obiekcie ColorAction i skonstruowa go w konstruktorze ColorAction. Wygod-
niej jednak by oby, gdyby ColorAction by a klas wewn trzn klasy ButtonFrame. Dzi ki
temu jej metody mia yby automatycznie dost p do zewn trznego panelu (wi cej informacji
na temat klas wewn trznych znajduje si w rozdziale 6.).
Zastosujemy drug z opisanych metod. Poni ej przedstawiamy klas ColorAction wewn trz
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 uwa niej metodzie actionPerformed. Klasa ColorAction nie posiada pola
buttonPanel. Ma go natomiast zewn trzna klasa ButtonFrame.
Jest to bardzo cz sto spotykana sytuacja. Obiekty nas uchu zdarze cz sto musz wykony-
wa dzia ania, które maj wp yw na inne obiekty. Klas nas uchuj c cz sto mo na umie ci
w strategicznym miejscu wewn trz klasy, której obiekt ma mie zmieniony stan.
Listing 8.1 przedstawia kompletny program. Klikni cie jednego z przycisków powoduje
zmian koloru t a panelu przez odpowiedniego s uchacza 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. Obs uga 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 zawieraj cym 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);
// Powi zanie akcji z przyciskami.
yellowButton.addActionListener(yellowAction);
blueButton.addActionListener(blueAction);
redButton.addActionListener(redAction);
}
/**
* S uchacz akcji ustawiaj cy kolor t a 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
JButton(String label)
JButton(Icon icon)
JButton(String label, Icon icon)
Tworzy przycisk. a cuch etykiety mo e zawiera sam tekst lub (od Java SE 1.3)
kod HTML, np. "Ok".
java.awt.Container 1.0
Component add(Component c)
Dodaje komponent c do kontenera.
javax.swing.ImageIcon 1.2
ImageIcon(String filename)
Tworzy ikon , której obraz jest zapisany w pliku.
Nabywanie bieg o ci w pos ugiwaniu si klasami wewn trznymi
Niektórzy programi ci nie przepadaj za klasami wewn trznymi, poniewa uwa aj , e klasy
i obiekty o du ych rozmiarach spowalniaj dzia anie programu. Przyjrzyjmy si temu twier-
dzeniu. Nie potrzebujemy nowej klasy dla ka dego elementu interfejsu u ytkownika. W na-
szym programie wszystkie trzy przyciski wspó dziel jedn klas nas uchuj c . Oczywi cie
ka dy z nich posiada osobny obiekt nas uchuj cy. Ale obiekty te nie s du e. Ka dy z nich
zawiera warto okre laj c kolor i referencj do panelu. A tradycyjne rozwi zanie, z zasto-
sowaniem instrukcji if-else, równie odwo uje si do tych samych obiektów kolorów prze-
chowywanych przez s uchaczy akcji, tylko e jako zmienne lokalne, a nie pola obiektów.
Rozdzia 8. Obs uga zdarze 363
Poni ej przedstawiamy dobry przyk ad tego, jak anonimowe klasy wewn trzne mog upro-
ci kod programu. W programie na listingu 8.1 z ka dym przyciskiem zwi zane s takie
same dzia ania:
1. Utworzenie przycisku z etykiet .
2. Dodanie przycisku do panelu.
3. Utworzenie s uchacza akcji z odpowiednim kolorem.
4. Dodanie s uchacza akcji.
Napiszemy metod pomocnicz , która b dzie upraszcza a niniejsze czynno ci:
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 nast puj ce wywo ania:
makeButton(" ó ty", Color.YELLOW);
makeButton("niebieski", Color.BLUE);
makeButton("czerwony", Color.RED);
Mo liwe s dalsze uproszczenia. Zauwa my, e klasa ColorAction jest potrzebna tylko jeden
raz w metodzie makeButton. A zatem mo na 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 s uchacza akcji sta si znacznie prostszy. Metoda actionPerformed odwo uje si do
zmiennej parametrycznej backgroundColor (podobnie jak w przypadku wszystkich zmiennych
lokalnych wykorzystywanych w klasie wewn trznej, parametr ten musi by finalny).
Nie jest potrzebny aden jawny konstruktor. Jak widzieli my w rozdziale 6., mechanizm klas
wewn trznych automatycznie generuje konstruktor zapisuj cy wszystkie finalne zmienne
lokalne, które s u ywane w jednej z metod klasy wewn trznej.
364 Java. Podstawy
Anonimowe klasy wewn trzne potrafi zmyli niejednego programist . Mo na jed-
nak przyzwyczai si do ich rozszyfrowywania, wyrabiaj c sobie umiej tno po-
mijania wzrokiem kodu procedury:
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
buttonPanel.setBackground(backgroundColor);
}
});
Akcja przycisku ustawia kolor t a. Dopóki procedura obs ugi zdarze sk ada si z tylko
kilku instrukcji, wydaje si , e z odczytem nie powinno by problemów, zw aszcza je li
w sferze naszych zainteresowa nie le mechanizmy klas wewn trznych.
S uchaczem przycisku mo e by obiekt ka dej klasy, która implementuje interfejs
ActionListener. My wolimy u ywa obiektów nowej klasy, która zosta a utworzona
specjalnie z my l o wykonywaniu akcji przycisku. Jednak niektórzy programi ci nie czuj
si pewnie w stosowaniu klas wewn trznych i wybieraj inne podej cie. Implementuj
interfejs ActionListener w kontenerze róde zdarze . Nast pnie kontener ten ustawia
sam siebie jako s uchacza w nast puj cy sposób:
yellowButton.addActionListener(this);
blueButton.addActionListener(this);
redButton.addActionListener(this);
W tej sytuacji aden z trzech przycisków nie ma osobnego s uchacza. Dysponuj one
wspólnym obiektem, którym jest ramka przycisku. W zwi zku z tym metoda action-
Performed musi sprawdzi , który przycisk zosta klikni ty.
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
Object setSource()
Zwraca referencj do obiektu, w którym wyst pi o zdarzenie.
Rozdzia 8. Obs uga zdarze 365
java.awt.event.ActionEvent 1.1
String getActionCommand()
Zwraca a cuch polecenia skojarzonego z danym zdarzeniem akcji. Je li 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
static Object create(Class listenerInterface, Object target, String action)
static Object create(Class listenerInterface, Object target, String action,
String eventProperty)
static Object create(Class listenerInterface, Object target, String action,
String eventProperty, String listenerMethod)
Tworzy obiekt klasy po rednicz cej implementuj cej dany interfejs. Albo podana
metoda, albo wszystkie metody interfejsu wykonuj dane akcje na rzecz obiektu
docelowego.
Akcj mo e by metoda lub w asno obiektu docelowego. Je li jest to w asno ,
wykonywana jest jej metoda ustawiaj ca. Na przyk ad akcja text jest zamieniana
na wywo anie metody setText.
W asno zdarzenia sk ada si z jednej lub wi kszej liczby nazw w asno ci
oddzielonych kropkami. Pierwsza w asno jest wczytywana z parametru metody
nas uchuj cej. Druga w asno pochodzi od powsta ego obiektu itd. Wynik ko cowy
staje si parametrem akcji. Na przyk ad w asno source.text jest zamieniana
na wywo ania metod getSource i getText.
Tworzenie s uchaczy zawieraj cych jedno wywo anie metody
W Java SE 1.4 wprowadzono mechanizm umo liwiaj cy okre lanie prostych s uchaczy zda-
rze bez tworzenia klas wewn trznych. Wyobra my sobie na przyk ad, e mamy przycisk
z etykiet Load, którego procedura obs ugi zdarze zawiera tylko jedn metod :
frame.loadData();
Oczywi cie mo na u y anonimowej klasy wewn trznej:
loadButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
frame.loadData();
}
});
Ale klasa EventHandler mo e utworzy takiego s uchacza automatycznie, za pomoc nast -
puj cego wywo ania:
EventHandler.create(ActionListener.class, frame, "loadData")
366 Java. Podstawy
Oczywi cie nadal konieczne jest zainstalowanie procedury obs ugi:
loadButton.addActionListener(
EventHandler.create(ActionListener.class, frame, "loadData"));
Je li s uchacz wywo uje metod z jednym parametrem, który mo na uzyska z parametru
zdarzenia, mo na u y innego rodzaju metody create. Na przyk ad wywo anie:
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 w asno ci source i text zamieniaj si w wywo ania metod getSource i getText.
Przyk ad zmiana stylu
Domy lnym stylem programów pisanych przy u yciu 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 nale y ustawi w asno swing.defaultlaf
na nazw klasy stylu, który chcemy zastosowa . Na przyk ad:
swing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel
Zauwa my, e styl Metal jest zlokalizowany w pakiecie javax.swing. Pozosta e style znaj-
duj si w pakiecie com.sun.java i nie musz by obecne w ka dej implementacji Javy. Obec-
nie ze wzgl du na prawa autorskie pakiety stylów systemów Windows i Macintosh s dost pne
wy cznie z wersjami rodowiska uruchomieniowego Javy przeznaczonymi dla tych systemów.
Poniewa w plikach w asno ci linie zaczynaj ce si od znaku # s ignorowane,
mo na w takim pliku umie ci kilka stylów i wybiera je wedle upodobania, odpo-
wiednio zmieniaj c po o enie 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. Nale y wywo a statyczn metod
UIManager.setLookAndFeel oraz przekaza do niej nazw klasy wybranego stylu. Nast pnie
wywo ujemy statyczn metod SwingUtilities.updateComponentTreeUI w celu od wie enia
ca ego zbioru komponentów. Metodzie tej wystarczy przekaza tylko jeden komponent, a po-
zosta e znajdzie ona samodzielnie. Metoda UIManager.setLookAndFeel mo e spowodowa
Rozdzia 8. Obs uga zdarze 367
kilka wyj tków, je li nie znajdzie danego stylu lub je li wyst pi b d podczas adowania
stylu. Jak zwykle nie zg biamy kodu obs uguj cego wyj tki, poniewa szczegó owo zajmie-
my si tym w rozdziale 11.
Poni szy przyk adowy fragment programu przedstawia sposób prze czenia 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, nale y u y wywo ania:
UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();
W takiej sytuacji nazw ka dego stylu i jego klasy mo na uzyska nast puj co:
String name = infos[i].getName();
String className = infos[i].getClassName();
Listing 8.2 przedstawia pe ny kod programu demonstruj cego prze czanie stylów (zobacz
rysunek 8.4). Program ten jest podobny do programu z listingu 8.1. Id c za rad z poprzed-
niej sekcji, akcj przycisku, polegaj c na zmianie stylu, okre lili my za pomoc metody
pomocniczej makeButton i anonimowej klasy wewn trznej.
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 zawieraj cym przyciski zmieniaj ce 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 zmieniaj cy 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 prze czenie 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. Obs uga zdarze 369
Rysunek 8.4.
Zmienianie stylu
Jedna rzecz w niniejszym programie jest godna szczególnej uwagi. Metoda actionPerformed
wewn trznej klasy nas uchuj cej akcji musi przekaza referencj this klasy zewn trznej
PlafFrame do metody updateComponentTreeUI. Przypomnijmy sobie z rozdzia u 6., e przed
wska nikiem this obiektu klasy zewn trznej musi znajdowa si przedrostek w postaci na-
zwy klasy zewn trznej:
SwingUtilities.updateComponentTreeUI(PlafPanel.this);
javax.swing.UIManager 1.2
static UIManager.LookAndFeelInfo[] getInstalledLookAndFeels()
Tworzy tablic obiektów reprezentuj cych zainstalowane style.
static setLookAndFeel(String className)
Ustawia aktualny styl, wykorzystuj c do tego podan nazw klasy
(np. javax.swing.plaf.metal.MetalLookAndFeel).
javax.swing.UIManager.LookAndFeelInfo 1.2
String getName()
Zwraca nazw stylu.
String getClassName()
Zwraca nazw klasy implementuj cej dany styl.
370 Java. Podstawy
Klasy adaptacyjne
Nie wszystkie zdarzenia s tak atwe w obs udze jak klikni cie przycisku. W profesjonalnym
programie nale y stale sprawdza , czy u ytkownik nie zamyka g ównej ramki, aby zapo-
biec ewentualnej utracie jego danych. Gdy u ytkownik zamyka ramk , powinno wy wietla
si okno dialogowe monituj ce o potwierdzenie niniejszego zamiaru.
Kiedy u ytkownik zamyka okno, obiekt klasy JFrame jest ród em zdarzenia WindowEvent.
Aby przechwyci to zdarzenie, konieczny jest odpowiedni obiekt nas uchuj cy, który nale y
doda do listy s uchaczy okna ramki.
WindowListener listener = . . .;
frame.addWindowListener(listener);
Obiekt nas uchuj cy okna musi nale e do klasy implementuj cej interfejs WindowListener.
Interfejs ten zawiera siedem metod. Ramka wywo uje 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. Nale y tylko wyja ni , e iconfied w systemie Windows oznacza to samo
co minimized. Poni ej wida ca y 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 zosta o zmaksymalizowane, nale y zainstalowa obiekt
WindowStateListener. Zobacz wyci g 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.
Oczywi cie nic nie stoi na przeszkodzie, aby zaimplementowa niniejszy interfejs, wstawi
wywo anie System.exit(0) do metody windowClosing i napisa sze nicnierobi cych funkcji
dla pozosta ych metod:
class Terminator implements WindowListener
{
public void windowClosing(WindowEvent e)
{
if (u ytkownik potwierdza)
System.exit(0);
}
public void windowOpened(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
Rozdzia 8. Obs uga zdarze 371
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
}
Pisanie sze ciu metod, które nic nie robi , jest tym rodzajem pracy, której nikt nie lubi. Za-
danie to u atwiaj klasy adaptacyjne (ang. adapter class) dost pne z ka dym interfejsem
nas uchuj cym w bibliotece AWT, który ma wi cej ni jedn metod . Klasy te implementuj
wszystkie metody interfejsów, którym odpowiadaj , ale metody te nic nie robi . Na przyk ad
klasa WindowAdapter zawiera definicje siedmiu nicnierobi cych metod. Oznacza to, e klasa
adaptacyjna automatycznie spe nia wymagania techniczne stawiane przez Jav , a dotycz ce
implementacji odpowiadaj cego jej interfejsu nas uchuj cego. Klas adaptacyjn mo na roz-
szerzy , definiuj c w podklasie metody odpowiadaj ce 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 nicnierobi cych metod,
a metod windowClossing przes onimy:
class Terminator extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
if (u ytkownik potwierdza)
System.exit(0);
}
}
Teraz mo emy zarejestrowa obiekt typu Terminator jako s uchacza zdarze :
WindowListener listener = new Terminator();
frame.addWindowListener(listener);
Ka de zdarzenie okna wygenerowane przez ramk jest przekazywane do obiektu listener
za pomoc wywo ania jednej z jego siedmiu metod (zobacz rysunek 8.5). Sze z nich nie
robi nic, a metoda windowClosing wywo uje metod System.exit(0), zamykaj c tym samym
aplikacj .
Je li w nazwie metody rozszerzanej klasy adaptacyjnej znajdzie si b d, kompi-
lator go nie wykryje. Je li na przyk ad w klasie rozszerzaj cej WindowAdapter zo-
stanie zdefiniowana metoda windowIsClosing, nowa klasa b dzie zawiera a osiem me-
tod, a metoda windowClosing nic nie b dzie robi a.
Utworzenie klasy rozszerzaj cej klas adaptacyjn WindowAdapter jest krokiem naprzód, ale
mo na posun si jeszcze dalej. Nie ma potrzeby nadawa obiektowi listener nazwy.
Wystarczy napisa :
frame.addWindowListener(new Terminator());
Ale czemu poprzestawa na tym? Klasa nas uchuj ca mo e by anonimow klas we-
wn trzn ramki.
372 Java. Podstawy
Rysunek 8.5.
Obiekt
nas uchuj cy
zdarze
dotycz cych okna
frame.addWindowListener(new
WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if (u ytkownik potwierdza)
System.exit(0);
}
});
Powy szy fragment programu ma nast puj ce dzia anie:
Definiuje klas bez nazwy, rozszerzaj c klas WindowAdapter.
Do utworzonej anonimowej klasy dodaje metod windowClosing (podobnie jak
wcze niej, metoda ta zamyka program).
Dziedziczy sze pozosta ych nicnierobi cych metod po klasie WindowAdapter.
Tworzy obiekt tej nowej klasy obiekt równie nie ma nazwy.
Przekazuje niniejszy obiekt do metody addWindowListener.
Powtarzamy jeszcze raz, e do sk adni wewn trznych klas anonimowych trzeba si przy-
zwyczai . Dzi ki nim mo na pisa tak zwi z y kod, jak to tylko mo liwe.
Rozdzia 8. Obs uga zdarze 373
java.awt.event.WindowListener 1.1
void windowOpened(WindowEvent e)
Jest wywo ywana po otwarciu okna.
void windowClosing(WindowEvent e)
Jest wywo ywana, kiedy u ytkownik wyda polecenie mened era okien,
aby zamkn okno. Okno zostanie zamkni te tylko wtedy, gdy zostanie wywo ana
jego metoda hide lub dispose.
void windowClosed(WindowEvent e)
Jest wywo ywana po zamkni ciu okna.
void windowIconified(WindowEvent e)
Jest wywo ywana po zminimalizowaniu okna.
void windowDeiconified(WindowEvent e)
Jest wywo ywana po przywróceniu okna.
void windowActivated(WindowEvent e)
Jest wywo ywana po uaktywnieniu okna. Aktywna mo e by tylko ramka lub okno
dialogowe. Z regu y mened er okien zaznacza w jaki sposób aktywne okno
np. pod wietlaj c pasek tytu u.
void WindowDeactivated(WindowEvent e)
Jest wywo ywana po dezaktywowaniu okna.
java.awt.event.WindowStateListener 1.4
void windowStateChanged(WindowEvent event)
Jest wywo ywana po zmaksymalizowaniu, zminimalizowaniu lub przywróceniu
do normalnego rozmiaru okna.
java.awt.event.WindowEvent 1.1
int getNewState() 1.4
int getOldState() 1.4
Zwraca nowy i stary stan okna w zdarzeniu zmiany stanu okna. Zwracana liczba
ca kowita jest jedn z nast puj cych warto ci:
Frame.NORMAL
Frame.ICONIFIED
Frame.MAXIMIZED_HORIZ
Frame.MAXIMIZED_VERT
Frame.MAXIMIZED_BOTH
374 Java. Podstawy
Akcje
Cz sto jedn opcj mo na wybra na kilka ró nych sposobów. U ytkownik mo e wybra
odpowiedni funkcj w menu, nacisn okre lony klawisz lub przycisk na pasku narz dzi.
Zaprogramowanie takiej funkcjonalno ci w modelu zdarze AWT jest proste nale y
wszystkie zdarzenia zwi za z tym samym obiektem nas uchuj cym. Wyobra my sobie, e
blueAction jest obiektem nas uchuj cym akcji, którego metoda actionPerformed zmienia ko-
lor t a na niebieski. Jeden obiekt mo na zwi za jako s uchacza z kilkoma ród ami zdarze :
przyciskiem paska narz dzi z etykiet Niebieski;
elementem menu z etykiet Niebieski;
skrótem klawiszowym Ctrl+N.
Dzi ki temu zmiana koloru b dzie wykonywana zawsze w taki sam sposób, bez znaczenia,
czy wywo a j klikni cie przycisku, wybór elementu menu, czy naci ni cie klawisza.
W pakiecie Swing dost pna jest niezwykle przydatna struktura opakowuj ca polecenia i wi -
ca je z ró nymi ród ami zdarze interfejs Action. Akcja to obiekt, który opakowuje:
opis polecenia ( a cuch tekstowy i opcjonalna ikona),
parametry niezb dne do wykonania polecenia (w naszym przypadku
wymagany kolor).
Interfejs Action zawiera nast puj ce 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. Nale y doda , e inter-
fejs Action rozszerza interfejs ActionListener. W zwi zku z tym wsz dzie, gdzie powinien
znale si obiekt ActionListener, mo na u y obiektu Action.
Dwie kolejne metody w czaj i wy czaj akcj oraz sprawdzaj , czy akcja jest aktualnie
w czona. Kiedy akcja jest zwi zana z menu lub paskiem narz dzi i jest wy czona, odpo-
wiadaj ca 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. Obs uga zdarze 375
Tabela 8.1. Predefiniowane sta e interfejsu Action
Nazwa Warto
NAME Nazwa akcji wy wietlana na przyciskach i elementach menu.
SMALL_ICON Ma a ikona mo e by wy wietlana na przyciskach, pasku narz dzi
lub elementach menu.
SHORT_DESCRIPTION Krótki opis ikony wy wietlany w etykiecie narz dzia.
LONG_DESCRIPTION D ugi opis ikony do u ytku w pomocy internetowej. aden komponent
Swinga nie u ywa tej warto ci.
MNEMONIC_KEY Skrót akcji wy wietlany na elementach menu (zobacz rozdzia 9.).
ACCELERATOR_KEY Skrót klawiaturowy. aden komponent Swinga nie u ywa tej warto ci.
ACTION_COMMAND_KEY U ywana w przestarza ej ju metodzie registerKeyboardAction.
DEFAULT W asno pasuj ca do wszystkiego. aden komponent Swinga nie u ywa
tej warto ci.
Je li obiekt akcji jest dodawany do menu lub paska narz dzi, jego nazwa i ikona s auto-
matycznie pobierane i wy wietlane w menu lub na pasku narz dzi. Warto w asno ci
SHORT_DESCRIPTION zamienia si w dymek opisuj cy narz dzie.
Pozosta e dwie metody interfejsu Action umo liwiaj powiadamianie innych obiektów, zw asz-
cza menu i pasków narz dzi, które s ród em akcji, o zmianach w asno ci obiektu akcji.
Je li na przyk ad menu jest dodawane jako obiekt nas uchuj cy zmian w asno ci obiektu akcji
i obiekt ten zostanie nast pnie wy czony, menu zostanie wywo ane, a nazwa akcji b dzie
szara. Obiekty nas uchu zmian w asno ci s ogóln konstrukcj stanowi c cz modelu
komponentów JavaBean. Wi cej informacji na temat Beanów i ich w asno ci znajduje si
w drugim tomie.
Nie nale y zapomina , e Action to interfejs, a nie klasa. Ka da klasa implementuj ca go
musi definiowa wszystkie siedem metod, które opisali my. Na szcz cie jaki dobry cz owiek
napisa klas o nazwie AbstractAction, która implementuje wszystkie niniejsze metody
z wyj tkiem actionPerformed. Klasa ta zajmuje si zapisywaniem par nazwa warto
i zarz dzaniem obiektami nas uchuj cymi zmian w asno ci. Wystarczy rozszerzy klas
AbstractAction i zdefiniowa metod actionPerformed.
Utworzymy obiekt wykonuj cy polecenia zmiany koloru. Zapiszemy nazw polecenia, iko-
n i dany kolor. Kolor zapiszemy w tablicy par nazwa warto dostarczanej przez klas
AbstractAction. Poni ej znajduje si kod ród owy 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 przyk adowy program tworzy trzy obiekty niniejszej klasy, np.:
Action blueAction = new ColorAction("Niebieski", new ImageIcon("blue-ball.gif"),
Color.BLUE);
Teraz konieczne jest zwi zanie akcji z przyciskiem. Jest to atwe, poniewa mo emy u y
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 s uchacza. Ikony i etykiet przedstawia rysunek 8.6.
Rysunek 8.6.
Przyciski
zawieraj ikony
z obiektów akcji
W kolejnym rozdziale wyka emy, e tak samo atwe jest dodawanie tej samej akcji do menu.
Na koniec przypiszemy obiekty akcji do klawiszy, dzi ki czemu akcje te b d wykonywane,
kiedy u ytkownik wpisze polecenia z klawiatury. Kojarzenie akcji z klawiszami nale y za-
cz od wygenerowania obiektu klasy KeyStroke. Klasa ta opakowuje opis klawisza.
Do utworzenia obiektu typu KeyStroke nie u ywa si konstruktora, ale statycznej metody
getKeyStroke klasy KeyStroke.
KeyStroke ctrlBKey = KeyStroke.getKeyStroke("ctrl N");
Do zrozumienia nast pnego etapu potrzebna jest znajomo poj cia aktywno ci komponentu
(ang. keyboard focus). Interfejs u ytkownika mo e sk ada si z wielu przycisków, menu,
pasków przewijania i innych komponentów. Kiedy zostanie naci ni ty klawisz, zdarzenie to
zostaje wys ane do aktywnego komponentu. Komponent ten jest z regu y (cho nie zawsze)
w jaki sposób wizualnie wyró niony. Na przyk ad w stylu Javy tekst na aktywnym przycisku
ma cienk obwódk . Fokus (aktywno komponentu) mo na przenosi na ró ne kompo-
nenty za pomoc klawisza Tab. Naci ni cie klawisza spacji powoduje klikni cie aktywnego
przycisku. Inne klawisze wywo uj inne dzia ania. Na przyk ad klawisze strza ek mog ste-
rowa paskiem przewijania.
Jednak my nie chcemy wysy a zdarzenia naci ni cia klawisza do aktywnego komponentu.
W przeciwnym razie ka dy przycisk musia by zna procedur obs ugi kombinacji klawiszy
Ctrl+Y, Ctrl+B i Ctrl+R.
Rozdzia 8. Obs uga zdarze 377
Jest to bardzo powszechny problem. Jednak projektanci biblioteki Swing znale li dla niego
proste rozwi zanie. Ka dy JComponent posiada trzy mapy wej cia (ang. input maps), z których
ka da odwzorowuje obiekty KeyStroke na zwi zane z nimi akcje. Mapy te odpowiadaj trzem
ró nym sytuacjom (zobacz tabela 8.2).
Tabela 8.2. Mapy klawiaturowe
Znacznik Wywo uje dzia anie, 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 nast puj cej kolejno ci w wyniku naci ni cia klawisza:
1. Sprawdzenie mapy WHEN_FOCUSED aktywnego komponentu. Je li dany skrót
klawiaturowy istnieje, nast puje wykonanie powi zanego z nim dzia ania.
Je li dzia anie zostaje wykonane, nast puje zatrzymanie sprawdzania warunków.
2. Nast puje sprawdzenie map WHEN_ANCESTOR_OF_FOCUSED_COMPONENT aktywnego
komponentu, a nast pnie jego komponentów nadrz dnych. Gdy zostanie znaleziona
mapa z danym skrótem klawiaturowym, nast puje wykonanie dzia ania.
Je li dzia anie zostaje wykonane, nast puje zatrzymanie sprawdzania warunków.
3. Odszukanie wszystkich widocznych i w czonych komponentów w aktywnym oknie,
w których mapie WHEN_IN_FOCUSED_WINDOW znajduje si dany skrót klawiaturowy.
Umo liwienie tym komponentom (w kolejno ci zgodnej z rejestracj zdarze
naci ni cia klawisza) wykonania odpowiednich dzia a . Po wykonaniu pierwszego
dzia ania nast puje zatrzymanie przetwarzania. Ta cz procesu mo e by ród em
problemów, je li dany skrót klawiaturowy pojawia si w wi cej ni jednej mapie
WHEN_IN_FOCUSED_WINDOW.
Map wej cia komponentu tworzy si za pomoc metody getInputMap. Na przyk ad:
InputMap imap = panel.getInputMap(JComponent.WHEN_FOCUSED);
Warunek WHEN_FOCUSED powoduje, e ta mapa b dzie 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 zmieniaj cych kolor nadaje si jedna z pozosta ych dwóch map.
W naszym przyk adowym programie u yjemy mapy WHEN_ANCESTOR_OF_FOCUSED_COMPONENT.
Klasa InputMap nie odwzorowuje bezpo rednio 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. Dzi ki temu atwiej jest wspó dzie-
li te same akcje przez skróty klawiaturowe pochodz ce z ró nych map wej cia.
A zatem ka dy komponent posiada trzy mapy wej cia i jedn map akcji (ang. action map).
Aby je powi za , trzeba wymy li nazwy dla akcji. Klawisz mo na powi za z akcj w na-
st puj cy 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 niewykonuj cej adnych dzia a zwyczajowo stosuje si a cuch none.
W ten sposób mo na 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 rozwi zanie. Nazwa akcji jest wy wietlana na przyciskach i ele-
mentach menu, w zwi zku z czym mo e si zmienia w zale no ci od kaprysu projek-
tanta interfejsu oraz mo e by przet umaczona na wiele j zyków. Takie niesta e a cu-
chy nie s dobrym wyborem w przypadku klawiszy wyszukiwania. Zalecamy wymy lenie
nazw akcji niezale nych od wy wietlanych nazw.
Poni ej znajduje si zestawienie dzia a , które trzeba wykona , aby wywo a to samo dzia a-
nie w odpowiedzi na zdarzenie naci ni cia przycisku, wyboru elementu z menu lub naci ni -
cia klawisza:
1. Utwórz podklas klasy AbstractAction. Mo na u y tej samej klasy dla wielu
spokrewnionych akcji.
2. Utwórz obiekt powy szej klasy akcji.
3. Utwórz przycisk lub element menu z obiektu powy szej klasy akcji. Konstruktor
odczyta etykiet i ikon z tego obiektu.
4. W przypadku akcji uruchamianych przez naci ni cie klawisza konieczne jest
wykonanie dodatkowych czynno ci. Najpierw nale y zlokalizowa komponent
najwy szego poziomu w oknie, np. panel zawieraj cy wszystkie pozosta e elementy.
5. Pobierz map WHEN_ANCESTOR_OF_FOCUSED_COMPONENT komponentu najwy szego
poziomu. Utwórz obiekt klasy KeyStroke reprezentuj cy odpowiedni skrót
klawiaturowy. Utwórz obiekt b d cy kluczem dzia ania, np. a cuch opisuj cy
akcj . Wstaw niniejsz par danych (klawisz, klucz dzia ania) do mapy wej cia.
6. Pobierz map akcji komponentu najwy szego poziomu. Dodaj par klucz akcji
obiekt akcji do tej mapy.
Listing 8.3 przedstawia kompletny kod programu mapuj cego przyciski i klawisze na obiekty
akcji. Mo na go wypróbowa klikni cie jednego z przycisków lub naci ni cie 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. Obs uga 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);
// Powi zanie 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");
// Powi zanie 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 t a
*/
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
boolean isEnabled()
void setEnabled(boolean b)
Pobiera lub ustawia w asno enabled akcji.
void putValue(String key, Object value)
Wstawia par nazwa warto do obiektu akcji.
Parametry: key Nazwa w asno ci, która ma zosta zapisana z obiektem
akcji. Mo e to by dowolny a cuch, ale jest kilka nazw
o z góry zdefiniowanym znaczeniu zobacz tabel 8.1
na stronie 375.
value Obiekt powi zany z nazw .
Object getValue(String key)
Zwraca warto z zapisanej pary nazwa warto .
Rozdzia 8. Obs uga zdarze 381
javax.swing.KeyStroke 1.2
static KeyStroke getKeyStroke(String description)
Tworzy skrót klawiaturowy z czytelnego dla cz owieka opisu (ci gu a cuchów
rozdzielonych spacjami). Opis zaczyna si od zera lub wi kszej liczby
modyfikatorów shift control ctrl meta alt altGraph, a ko czy si a cuchem
typed i a cuchem sk adaj cym si z jednego znaku (na przyk ad typed a)
lub opcjonalnym specyfikatorem zdarzenia (pressed domy lny lub released)
i kodem klawisza. Kod klawisza, je li ma przedrostek VK_, powinien odpowiada
sta ej KeyEvent, na przyk ad INSERT odpowiada KeyEvent.VK_INSERT.
javax.swing.JComponent 1.2
ActionMap getActionMap() 1.3
Zwraca map wi c klucze mapy akcji (które mog by dowolnymi obiektami)
z obiektami klasy Action.
InputMap getInputMap(int flag) 1.3
Pobiera map wej cia, która odwzorowuje klawisze w postaci kluczy mapy akcji.
Parametry: flag Warunek okre laj cy, kiedy element aktywny ma wywo a
akcj jedna z warto ci z tabeli 8.2 na stronie 377.
Zdarzenia generowane przez mysz
Takie zdarzenia jak klikni cie przycisku lub elementu w menu za pomoc myszy nie wyma-
gaj pisania procedur obs ugi. Niniejsze zdarzenia s obs ugiwane automatycznie przez
ró ne elementy interfejsu u ytkownika. Aby jednak umo liwi rysowanie za pomoc myszy,
konieczne jest przechwycenie zdarze ruchu, klikni cia i przeci gania myszy.
W niniejszym podrozdziale prezentujemy prosty edytor grafiki pozwalaj cy umieszcza , prze-
suwa i usuwa kwadraty z obszaru roboczego (zobacz rysunek 8.7).
Rysunek 8.7.
Program
obs uguj cy
zdarzenia myszy
382 Java. Podstawy
Kiedy u ytkownik naci nie przycisk myszy, wywo ywane s trzy metody nas uchuj ce:
mousePressed po naci ni ciu przycisku, mouseReleased po zwolnieniu przycisku myszy
i mouseClicked. Je li w sferze zainteresowa le wy cznie pe ne klikni cia, pierwsze dwie
z wymienionych metod mo na pomin . Wywo uj c metody getX i getY na rzecz obiektu
klasy MouseEvent, mo na sprawdzi wspó rz dne x i y wska nika myszy w chwili klik-
ni cia. Do rozró nienia pojedynczych, podwójnych i potrójnych (!) klikni s u y metoda
getClickCount.
Niektórzy projektanci interfejsów tworz kombinacje klawiszy po czone z klikni ciami
myszk , np. Ctrl+Shift+klikni cie. Naszym zdaniem jest to post powanie niegodne na la-
dowania. Osoby, które nie zgadzaj si z nasz opini , mo e 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 zosta y ustawione, nale y u y maski bitowej. W ory-
ginalnym API dwie maski przycisków s równowa ne z maskami klawiszy specjalnych,
mianowicie:
BUTTON2_MASK == ALT_MASK
BUTTON3_MASK == META_MASK
Zrobiono tak, aby u ytkownicy posiadaj cy myszk z jednym przyciskiem mogli na lado-
wa pozosta e przyciski za pomoc klawiszy specjalnych (ang. modifier keys). Od Java SE 1.4
zaproponowano jednak inn metod . Od tej pory istniej nast puj ce 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 dok adne informacje o przyciskach myszy i klawiszach spe-
cjalnych u ytych w zdarzeniu myszy.
Pami tajmy, e maska BUTTON3_DOWN_MASK w systemie Windows sprawdza prawy (nie g ówny)
przycisk myszy. Na przyk ad poni szy fragment programu sprawdza, czy prawy przycisk
myszy jest wci ni ty:
if ((event.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) != 0)
. . . // procedury obs ugi zdarzenia klikni cia prawym przyciskiem myszy
W przyk adowym programie definiujemy zarówno metod mousePressed, jak i mouseClicked.
Je li u ytkownik kliknie piksel nieznajduj cy si w obr bie adnego z narysowanych kwa-
dratów, zostanie dodany nowy kwadrat. Dzia anie to zosta o zaimplementowane w metodzie
mousePressed, a wi c kwadrat pojawia si natychmiast po klikni ciu, przed zwolnieniem
przycisku myszy. Dwukrotne klikni cie przyciskiem myszy w obr bie narysowanego kwa-
dratu powoduje jego usuni cie. Implementacja tej funkcji zosta a umieszczona w metodzie
mouseClicked, poniewa konieczne jest sprawdzenie liczby klikni :
Rozdzia 8. Obs uga zdarze 383
public void mousePressed(MouseEvent event)
{
current = find(event.getPoint());
if (current == null) // nie w obr bie 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 sta y strumie zdarze ruchu
myszy. Zauwa my, e s osobne interfejsy MouseListener i MouseMotionListener. Wyró nio-
no je z ch ci zwi kszenia efektywno ci. Kiedy u ytkownik przesuwa mysz, powstaje ca a
masa zdarze dotycz cych tej czynno ci. Obiekt nas uchuj cy, który oczekuje na klikni cia,
nie jest zajmowany przez nieinteresuj ce go zdarzenia ruchu.
Nasz testowy program przechwytuje zdarzenia ruchu i w odpowiedzi na nie zmienia wygl d
kursora (na krzy yk). Odpowiedzialna jest za to metoda getPredefinedCursor z klasy Cursor.
Tabela 8.3 przedstawia sta e podawane jako argument wspomnianej funkcji oraz reprezento-
wane przez nie kursory w systemie Windows.
Tabela 8.3. Przyk adowe kursory
Ikona Sta a Ikona Sta a
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
Poni ej znajduje si kod ród owy metody mouseMoved z klasy MouseMotionListener zdefi-
niowanej w naszym przyk adowym programie:
public void mouseMoved(MouseEvent event)
{
if (find(event.getPoint()) == null)
setCursor(Cursor.getDefaultCursor());
else
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
384 Java. Podstawy
Mo na zdefiniowa w asne typy kursorów. S u y 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 okre la plik graficzny przedstawiaj cy kursor. Drugi
wyznacza przesuni cie punktu aktywnego kursora. Trzeci jest a cuchem opisuj cym
kursor. a cuch ten mo e s u y zwi kszeniu dost pno ci. Na przyk ad program czytaj cy
z ekranu u ywany przez osob niedowidz c mo e przeczyta opis takiego kursora.
Je li w czasie przesuwania myszy u ytkownik kliknie jej przycisk, generowane s wywo ania
metody mouseDragged zamiast mouseMoved. Nasz przyk adowy program zezwala na przeci ga-
nie kwadratów pod kursorem. Efekt ten uzyskali my, aktualizuj c po o enie przeci ganego
kwadratu, tak aby jego rodek znajdowa si w tym samym miejscu co punkt centralny myszki.
Nast pnie ponownie rysujemy obszar roboczy, aby ukaza nowe po o enie 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 wywo ywana tylko wtedy, gdy kursor znajduje si w ob-
r bie komponentu. Natomiast metoda mouseDragged jest wywo ywana nawet wtedy,
gdy kursor opu ci komponent.
Istniej jeszcze dwie inne metody obs uguj ce zdarzenia myszy: mouseEntered i mouseExited.
S one wywo ywane, gdy kursor myszy wchodzi do komponentu lub go opuszcza.
Na zako czenie wyja nimy sposób nas uchiwania zdarze generowanych przez mysz. Klik-
ni cia przyciskiem myszy s raportowane przez metod mouseClicked nale c do interfejsu
MouseListener. Poniewa wiele aplikacji korzysta wy cznie z klikni myszk i wyst puj
one bardzo cz sto, zdarzenia ruchu myszy i przeci gania zosta y zdefiniowane w osobnym
interfejsie o nazwie MouseMotionListener.
W naszym programie interesuj nas oba rodzaje zdarze generowanych przez mysz. Zdefi-
niowali my dwie klasy wewn trzne o nazwach MouseHandler i MouseMotionHandler. Pierwsza
z nich jest podklas klasy MouseAdapter, poniewa definiuje tylko dwie z pi ciu metod interfej-
su MouseListener. Klasa MouseMotionHandler implementuje interfejs MouseMotionListener,
co znaczy, e zawiera definicje obu jego metod. Listing 8.4 przedstawia kod ród owy oma-
wianego programu.
Rozdzia 8. Obs uga 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 zawieraj ca panel testuj cy dzia ania 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 dzia aniami myszy, do którego mo na dodawa (lub z którego mo na usuwa ) kwadraty.
*/
class MouseComponent extends JComponent
{
public MouseComponent()
{
squares = new ArrayList();
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 zawieraj cy punkt.
* @param p punkt
* @return pierwszy kwadrat zawieraj cy 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 usuni ty
*/
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 squares;
private Rectangle2D current;
Rozdzia 8. Obs uga zdarze 387
// Kwadrat zawieraj cy kursor myszy.
private class MouseHandler extends MouseAdapter
{
public void mousePressed(MouseEvent event)
{
// Dodanie nowego kwadratu, je li kursor nie jest wewn trz innego kwadratu.
current = find(event.getPoint());
if (current == null) add(event.getPoint());
}
public void mouseClicked(MouseEvent event)
{
// Usuni cie kwadratu w wyniku jego dwukrotnego klikni cia.
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 krzy yk, je li znajduje si wewn trz
// 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();
// Przeci gni cie 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
int getX()
int getY()
Point getPoint()
Zwraca wspó rz dne x (pozioma) i y (pionowa) lub punkt, w którym mia o miejsce
zdarzenie, mierz c od lewego górnego rogu komponentu b d cego ród em
zdarzenia.
388 Java. Podstawy
int getClickCount()
Zwraca liczb kolejnych klikni przyciskiem myszy zwi zanych z danym
zdarzeniem (odst p czasu oddzielaj cy zdarzenia okre lane jako kolejne zale y
od systemu).
java.awt.event.InputEvent 1.1
int getModifiersEx() 1.4
Zwraca rozszerzone modyfikatory zdarzenia. Do sprawdzania zwróconych
warto ci s u nast puj ce 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
static String getModifiersExText(int modifiers) 1.4
Zwraca a cuch typu Shift+Button1 opisuj cy rozszerzone modyfikatory w
danym zbiorze znaczników.
java.awt.Toolkit 1.0
public Cursor createCustomCursor(Image image, Point hotSpot, String name)1.2
Tworzy nowy obiekt niestandardowego kursora.
Parametry: image Obraz reprezentuj cy kursor
hotSpot Punkt centralny kursora (na przyk ad ko cówka strza ki
lub rodek krzy yka)
name Opis kursora wspomagaj cy dost pno w specjalnych
rodowiskach
java.awt.Component 1.0
public void setCursor(Cursor cursor) 1.1
Ustawia obraz kursora na okre lony kursor.
Hierarchia zdarze w bibliotece AWT
Maj c ju pewne rozeznanie w temacie obs ugi zdarze , na zako czenie niniejszego rozdzia u
zrobimy krótki przegl d architektury obs ugi zdarze biblioteki AWT.
Rozdzia 8. Obs uga zdarze 389
Jak wspominali my wcze niej, zdarzenia w Javie s obs ugiwane 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 sk ad biblio-
teki Javy).
Klasa EventObject posiada podklas AWTEvent b d c 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 bezpo rednio klas EventObject, a nie AWTEvent.
390 Java. Podstawy
Obiekty zdarzeniowe zawieraj informacje o zdarzeniach przesy anych przez ród o zda-
rze do swoich s uchaczy. W razie potrzeby mo na przeanalizowa obiekty zdarzeniowe,
które zosta y przekazane do obiektów nas uchuj cych, co zrobili my w przyk adzie z przy-
ciskiem za pomoc metod getSource i getActionCommands.
Niektóre klasy zdarzeniowe AWT s dla programisty Javy bezu yteczne. Na przyk ad biblio-
teka AWT wstawia do kolejki zdarze obiekty PaintEvent, ale obiekty te nie s dostarczane
do s uchaczy. Programi ci Javy nie nas uchuj zdarze rysowania. Przes aniaj 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 dzie em u ytkownika ( jest to np. klikni cie przycisku). Dlatego zdarzenie
ActionEvent jest zdarzeniem semantycznym. Zdarzenia niskiego poziomu to takie zdarze-
nia, które umo liwiaj zaistnienie zdarze semantycznych. W przypadku klikni cia przyci-
sku jest to jego naci ni cie, szereg ruchów mysz i zwolnienie (ale tylko je li zwolnienie
nast pi w obr bie przycisku). Mo e to by naci ni cie klawisza maj ce miejsce po wybra-
niu przycisku przez u ytkownika za pomoc klawisza Tab i naci ni cia go za pomoc spa-
cji. Podobnie semantycznym zdarzeniem jest przesuni cie paska przewijania, a ruch mysz
jest zdarzeniem niskiego poziomu.
Poni ej znajduje si lista najcz ciej u ywanych klas zdarze semantycznych pakietu
java.awt.event:
ActionEvent klikni cie przycisku, wybór elementu z menu, wybór elementu
listy, naci ni cie klawisza Enter w polu tekstowym.
AdjustmentEvent przesuni cie paska przewijania.
ItemEvent wybór jednego z pól do wyboru lub elementów listy.
Do najcz ciej u ywanych klas zdarze niskiego poziomu zaliczaj si :
KeyEvent naci ni cie lub zwolnienie klawisza.
MouseEvent naci ni cie lub zwolnienie przycisku myszy, poruszenie
lub przeci gni cie mysz .
MouseWheelEvent pokr cenie kó kiem myszy.
FocusEvent uaktywnienie lub dezaktywacja elementu.
WindowEvent zmiana stanu okna.
Niniejszych zdarze nas uchuj nast puj ce interfejsy:
ActionListener
AdjustmentListener
FocusListener
ItemListener
Rozdzia 8. Obs uga zdarze 391
KeyListener
MouseListener
MouseMotionListener
MouseWheelListener
WindowListener
WindowFocusListener
WindowStateListener
Niektóre interfejsy nas uchuj ce AWT, te zawieraj ce wi cej ni jedn metod , posiadaj od-
powiadaj ce im klasy adaptacyjne, które implementuj wszystkie ich metody (pozosta e inter-
fejsy maj tylko jedn metod , a wi c utworzenie dla nich klas adaptacyjnych nie da oby
adnych korzy ci). Poni sze klasy adaptacyjne s cz sto u ywane:
FocusAdapter
KeyAdapter
MouseAdapter
MouseMotionAdapter
WindowAdapter
Tabela 8.4 przedstawia najwa niejsze interfejsy nas uchowe, zdarzenia i ród a zdarze bi-
blioteki AWT.
Tabela 8.4. Obs uga zdarze
Parametry/ Zdarzenia
Interfejs Metody
metody dost pu generowane przez
ActionListener actionPerformed ActionEvent AbstractButton
getActionCommand JComboBox
getModifiers JTextField
Timer
AdjustmentListener adjustmentValueChanged AdjustmentEvent JScrollbar
getAdjustable
getAdjustmentType
getValue
ItemListener itemStateChanged ItemEvent AbstractButton
getItem JComboBox
getItemSelectable
getStateChange
FocusListener focusGained FocusEvent Component
focusLost isTemporary
KeyListener keyPressed KeyEvent Component
keyReleased getKeyChar
keyTyped getKeyCode
getKeyModifiersText
getKeyText
isActionText
392 Java. Podstawy
Tabela 8.4. Obs uga zdarze (ci g dalszy)
Parametry/ Zdarzenia
Interfejs Metody
metody dost pu generowane przez
MouseListener mousePressed MouseEvent Component
mouseReleased getClickCount
mouseEntered getX
mouseExited getY
mouseClicked getPoint
translatePoint
MouseMotionListener mouseDragged MouseEvent Component
mouseMoved
MouseWheelListener MouseWheelMoved MouseWheelEvent Component
getWheelRotation
getScrollAmount
WindowListener windowClosing WindowEvent Window
windowOpened getWindow
windowIconified
windowDeiconified
windowClosed
windowActivated
windowDeactivated
WindowFocusListener windowGainedFocus WindowEvent Window
windowLostFocus getOppositeWindow
WindowStateListener windowStateChanged WindowEvent Window
getOldState
getNewState
Pakiet javax.swing.event zawiera dodatkowe zdarzenia specyficzne dla komponentów Swinga.
Niektóre z nich opisujemy w nast pnym rozdziale.
Na tym zako czymy opis technik obs ugi zdarze AWT. W nast pnym rozdziale nauczymy
si wykorzystywa najpopularniejsze komponenty Swinga oraz szczegó owo przeanalizu-
jemy generowane przez nie zdarzenia.
Wyszukiwarka
Podobne podstrony:
Po prostu JavaScript Wydanie VIII ppjsc8
Java Podstawy, Programowanie, Zastosowania
Emigracja do USA Wydanie VIII emigra
Java Podstawowe typy?nych
Java podstawy jezyka wyklad1
Java?ektywne programowanie Wydanie II javep2
JP SS 5 podstawy Java
Java cwiczenia praktyczne Wydanie III cwjav3
Core Java Servlets i JavaServer Pages Tom II Wydanie II
JP SS 5 podstawy Java (3)
1 podstawy java 2562
Giełda Podstawy inwestowania Wydanie III zaktualizowane
Java Przewodnik dla poczatkujacych Wydanie V javpp5
więcej podobnych podstron