Java Podstawy Wydanie VIII javpd3

background image

Wydawnictwo Helion

ul. Koœciuszki 1c

44-100 Gliwice

tel. 032 230 98 63

e-mail: helion@helion.pl

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

Jakie nowoœci kryj¹ siê w Java Standard Edition 6?

Jak rozpocz¹æ przygodê z jêzykiem Java?

Jak wykorzystaæ wielow¹tkowoœæ?

Jêzyk programowania Java zosta³ stworzony i jest rozwijany przez firmê Sun

Microsystems. Mo¿liwoœæ zastosowania go na ró¿nych platformach zosta³a doceniona

przez wielu programistów na œwiecie. Jednak nie jest to jedyna mocna strona Javy.

Warto tu wskazaæ równie¿ jej silne ukierunkowanie na obiektowoœæ, obs³ugê

programowania rozproszonego, mechanizm automatycznego oczyszczania pamiêci

(ang. garbage collection). Dziêki swoim atutom, dobrej dokumentacji i licznych

publikacjom Java jest dziœ wiod¹cym rozwi¹zaniem na rynku jêzyków programowania.
Ksi¹¿ka „Java. Podstawy. Wydanie VIII” zosta³a zaktualizowana o wszystkie

te elementy, które pojawi³y siê w wersji szóstej platformy Java Standard Edition.

Tom pierwszy — „Podstawy” — zawiera wprowadzenie do jêzyka programowania Java.

Autorzy ksi¹¿ki przedstawi¹ tu za³o¿enia przyjête przez firmê Sun przy tworzeniu

tej platformy. Dowiesz siê, jakie prawa rz¹dz¹ programowaniem obiektowym

oraz jak wykorzystaæ interfejsy i obs³ugê wyj¹tków. Dodatkowo bêdziesz mieæ

mo¿liwoœæ zapoznania siê z elementami projektowania i tworzenia interfejsu

u¿ytkownika. W ostatnim rozdziale autorzy omówi¹ wielow¹tkowoœæ oraz sposób

zastosowania tego typu rozwi¹zañ w codziennej pracy programisty jêzyka Java.

Podstawy jêzyka Java

— Programowanie obiektowe — Interfejsy — Sposób u¿ycia klas proxy oraz klas

wewnêtrznych — Projektowanie interfejsu u¿ytkownika z wykorzystaniem

biblioteki Swing — Obs³uga wyj¹tków — Wykrywanie i rozwi¹zywanie problemów

w kodzie — Wielow¹tkowoœæ

Wykorzystaj si³ê obiektów.

Programowanie obiektowe w jêzyku Java ma przysz³oœæ!

background image

Spis treci

Podzikowania ......................................................................................................................................... 13

Wstp ........................................................................................................................................................ 15

Rozdzia 1. Wstp do Javy ........................................................................................................................ 21

Java jako platforma programistyczna .............................................................................. 21
Sowa klucze biaej ksigi Javy ...................................................................................... 22

Prosty .................................................................................................................... 23
Zorientowany obiektowo .......................................................................................... 23
Sieciowy ................................................................................................................. 24
Niezawodny ............................................................................................................ 24
Bezpieczny ............................................................................................................. 25
Niezaleny od architektury ....................................................................................... 26
Przenony .............................................................................................................. 26
Interpretowany ........................................................................................................ 27
Wysokowydajny ....................................................................................................... 27
Wielowtkowy ......................................................................................................... 27
Dynamiczny ............................................................................................................ 28

Aplety Javy i internet ..................................................................................................... 28
Krótka historia Javy ...................................................................................................... 30
Gówne nieporozumienia dotyczce Javy ......................................................................... 32

Rozdzia 2. rodowisko programistyczne Javy ................................................................................... 37

Instalacja oprogramowania Java Development Kit ........................................................... 38

Pobieranie pakietu JDK ........................................................................................... 38
Ustawianie cieki dostpu ...................................................................................... 40
Instalacja bibliotek i dokumentacji ............................................................................ 41
Instalacja przykadowych programów ......................................................................... 42
Drzewo katalogów Javy ............................................................................................ 43

Wybór rodowiska programistycznego ............................................................................ 44
Uywanie narzdzi wiersza polece ................................................................................ 44

Rozwizywanie problemów ....................................................................................... 46

background image

4 Java.

Podstawy

Praca w zintegrowanym rodowisku programistycznym .................................................... 47

Znajdowanie bdów kompilacji ................................................................................ 50

Uruchamianie aplikacji graficznej ................................................................................... 51
Tworzenie i uruchamianie apletów ................................................................................. 53

Rozdzia 3. Podstawowe elementy jzyka Java .................................................................................... 59

Prosty program w Javie ................................................................................................. 60
Komentarze ................................................................................................................. 63
Typy danych ................................................................................................................. 64

Typy cakowite ........................................................................................................ 64
Typy zmiennoprzecinkowe ........................................................................................ 65
Typ char ................................................................................................................. 66
Typ boolean ............................................................................................................ 68

Zmienne ...................................................................................................................... 69

Inicjacja zmiennych ................................................................................................. 70
Stae ...................................................................................................................... 70

Operatory .................................................................................................................... 71

Operatory inkrementacji i dekrementacji ................................................................... 72
Operatory relacyjne i logiczne ................................................................................... 73
Operatory bitowe ..................................................................................................... 74
Funkcje i stae matematyczne .................................................................................. 75
Konwersja typów numerycznych ................................................................................ 76
Rzutowanie ............................................................................................................. 77
Nawiasy i priorytety operatorów ................................................................................ 78
Typ wyliczeniowy ..................................................................................................... 79

acuchy ..................................................................................................................... 79

Podacuchy ........................................................................................................... 79
Konkatenacja ......................................................................................................... 80
acuchów nie mona modyfikowa .......................................................................... 80
Porównywanie acuchów ......................................................................................... 82
Wspórzdne kodowe znaków i jednostki kodowe ....................................................... 83
API String ............................................................................................................... 84
Dokumentacja API w internecie ................................................................................ 86
Skadanie acuchów ............................................................................................... 87

Wejcie i wyjcie .......................................................................................................... 90

Odbieranie danych wejciowych ................................................................................ 90
Formatowanie danych wyjciowych ........................................................................... 93
Zapis do pliku i odczyt ............................................................................................. 97

Przepyw sterowania ..................................................................................................... 99

Zasig blokowy ....................................................................................................... 99
Instrukcje warunkowe ............................................................................................ 100
Ptle .................................................................................................................... 102
Ptle o okrelonej liczbie powtórze ....................................................................... 107
Wybór wielokierunkowy — instrukcja switch ............................................................ 110
Instrukcje przerywajce przepyw sterowania ........................................................... 112

Wielkie liczby ............................................................................................................. 115
Tablice ...................................................................................................................... 118

Ptla typu for each ................................................................................................ 119
Inicjowanie tablic i tworzenie tablic anonimowych .................................................... 120
Kopiowanie tablicy ................................................................................................ 120
Parametry wiersza polece .................................................................................... 122

background image

Spis

treci

5

Sortowanie tablicy ................................................................................................. 123
Tablice wielowymiarowe ......................................................................................... 127
Tablice postrzpione ............................................................................................. 130

Rozdzia 4. Obiekty i klasy .....................................................................................................................133

Wstp do programowania zorientowanego obiektowo .................................................... 134

Klasy ................................................................................................................... 134
Obiekty ................................................................................................................ 136
Identyfikacja klas .................................................................................................. 136
Relacje midzy klasami ......................................................................................... 137

Uywanie klas predefiniowanych .................................................................................. 139

Obiekty i zmienne obiektów .................................................................................... 139
Klasa GregorianCalendar ....................................................................................... 142
Metody udostpniajce i zmieniajce warto elementu ........................................... 144

Definiowanie wasnych klas ......................................................................................... 150

Klasa Employee .................................................................................................... 151
Stosowanie kilku plików ródowych ........................................................................ 154
Analiza klasy Employee ......................................................................................... 154
Pierwsze kroki w tworzeniu konstruktorów ............................................................... 155
Parametry jawne i niejawne .................................................................................... 156
Korzyci z hermetyzacji .......................................................................................... 157
Przywileje klasowe ................................................................................................ 159
Metody prywatne ................................................................................................... 160
Stae jako pola klasy ............................................................................................. 161

Pola i metody statyczne .............................................................................................. 161

Pola statyczne ...................................................................................................... 161
Stae statyczne ..................................................................................................... 162
Metody statyczne .................................................................................................. 163
Metody fabrykujce ............................................................................................... 164
Metoda main ........................................................................................................ 165

Parametry metod ........................................................................................................ 167
Konstruowanie obiektów ............................................................................................. 173

Przecianie ......................................................................................................... 173
Inicjacja pól wartociami domylnymi ...................................................................... 174
Konstruktor domylny ............................................................................................ 175
Jawna inicjacja pól ................................................................................................ 175
Nazywanie parametrów .......................................................................................... 176
Wywoywanie innego konstruktora .......................................................................... 177
Bloki inicjujce ...................................................................................................... 178
Niszczenie obiektów i metoda finalize ..................................................................... 182

Pakiety ...................................................................................................................... 182

Importowanie klas ................................................................................................. 183
Importy statyczne .................................................................................................. 185
Dodawanie klasy do pakietu .................................................................................. 185
Zasig pakietów .................................................................................................... 188

cieka klas .............................................................................................................. 190

Ustawianie cieki klas ......................................................................................... 192

Komentarze dokumentacyjne ...................................................................................... 193

Wstawianie komentarzy ......................................................................................... 193
Komentarze do klas .............................................................................................. 194
Komentarze do metod ........................................................................................... 194

background image

6 Java.

Podstawy

Komentarze do pól ................................................................................................ 195
Komentarze ogólne ............................................................................................... 195
Komentarze do pakietów i ogólne ........................................................................... 197
Generowanie dokumentacji .................................................................................... 197

Porady dotyczce projektowania klas ........................................................................... 198

Rozdzia 5. Dziedziczenie .......................................................................................................................201

Klasy, nadklasy i podklasy .......................................................................................... 202

Hierarchia dziedziczenia ........................................................................................ 208
Polimorfizm .......................................................................................................... 208
Wizanie dynamiczne ............................................................................................ 210
Wyczanie dziedziczenia — klasy i metody finalne .................................................. 213
Rzutowanie ........................................................................................................... 214
Klasy abstrakcyjne ................................................................................................ 216
Dostp chroniony .................................................................................................. 221

Klasa bazowa Object .................................................................................................. 222

Metoda equals ..................................................................................................... 223
Porównywanie a dziedziczenie ................................................................................ 224
Metoda hashCode ................................................................................................. 227
Metoda toString .................................................................................................... 229

Generyczne listy tablicowe .......................................................................................... 234

Dostp do elementów listy tablicowej ..................................................................... 237
Zgodno pomidzy typowanymi a surowymi listami tablicowymi ............................... 241

Osony obiektów i autoboxing ...................................................................................... 242
Metody ze zmienn liczb parametrów ......................................................................... 245
Klasy wyliczeniowe ..................................................................................................... 246
Refleksja ................................................................................................................... 248

Klasa Class .......................................................................................................... 249
Podstawy przechwytywania wyjtków ....................................................................... 251
Zastosowanie refleksji w analizie funkcjonalnoci klasy ............................................ 253
Refleksja w analizie obiektów w czasie dziaania programu ....................................... 258
Zastosowanie refleksji w generycznym kodzie tablicowym ......................................... 263
Wska niki do metod .............................................................................................. 267

Porady projektowe dotyczce dziedziczenia ................................................................... 270

Rozdzia 6. Interfejsy i klasy wewntrzne .......................................................................................... 273

Interfejsy ................................................................................................................... 274

Wasnoci interfejsów ............................................................................................ 279
Interfejsy a klasy abstrakcyjne ............................................................................... 280

Klonowanie obiektów .................................................................................................. 281
Interfejsy a sprzenie zwrotne .................................................................................... 287
Klasy wewntrzne ....................................................................................................... 290

Dostp do stanu obiektu w klasie wewntrznej ........................................................ 292
Specjalne reguy skadniowe dotyczce klas wewntrznych ....................................... 295
Czy klasy wewntrzne s potrzebne i bezpieczne? .................................................... 296
Lokalne klasy wewntrzne ..................................................................................... 298
Dostp do zmiennych finalnych z metod zewntrznych .............................................. 299
Anonimowe klasy wewntrzne ................................................................................ 301
Statyczne klasy wewntrzne ................................................................................... 304

Klasy proxy ................................................................................................................ 307

Wasnoci klas proxy ............................................................................................. 311

background image

Spis

treci

7

Rozdzia 7. Grafika .................................................................................................................................313

Wprowadzenie do pakietu Swing .................................................................................. 314
Tworzenie ramki ......................................................................................................... 317
Pozycjonowanie ramki ................................................................................................. 320

Wasnoci ramek .................................................................................................. 322
Okrelanie rozmiaru ramki ..................................................................................... 323

Wywietlanie informacji w komponencie ....................................................................... 327
Figury 2W .................................................................................................................. 331
Kolory ....................................................................................................................... 339
Czcionki .................................................................................................................... 343
Wywietlanie obrazów ................................................................................................. 351

Rozdzia 8. Obsuga zdarze ................................................................................................................. 355

Podstawy obsugi zdarze ........................................................................................... 355

Przykad — obsuga kliknicia przycisku .................................................................. 357
Nabywanie biegoci w posugiwaniu si klasami wewntrznymi ................................ 362
Tworzenie suchaczy zawierajcych jedno wywoanie metody ..................................... 365
Przykad — zmiana stylu ........................................................................................ 366
Klasy adaptacyjne ................................................................................................. 370

Akcje ......................................................................................................................... 374
Zdarzenia generowane przez mysz ............................................................................... 381
Hierarchia zdarze w bibliotece AWT ............................................................................ 388

Zdarzenia semantyczne i niskiego poziomu ............................................................. 390

Rozdzia 9. Komponenty Swing interfejsu uytkownika ..................................................................... 393

Swing a wzorzec projektowy Model-View-Controller ........................................................ 394

Wzorce projektowe ................................................................................................ 394
Wzorzec Model-View-Controller ............................................................................... 395
Analiza MVC przycisków Swing ............................................................................... 399

Wprowadzenie do zarzdzania rozkadem ..................................................................... 400

Rozkad brzegowy .................................................................................................. 403
Rozkad siatkowy .................................................................................................. 405

Wprowadzanie tekstu ................................................................................................. 409

Pola tekstowe ....................................................................................................... 409
Etykiety komponentów ........................................................................................... 411
Pola hase ............................................................................................................ 413
Obszary tekstowe .................................................................................................. 413
Panele przewijane ................................................................................................. 414

Komponenty umoliwiajce wybór opcji ........................................................................ 417

Pola wyboru .......................................................................................................... 417
Przeczniki .......................................................................................................... 420
Obramowanie ....................................................................................................... 424
Listy rozwijalne ..................................................................................................... 428
Suwaki ................................................................................................................. 432

Menu ........................................................................................................................ 438

Tworzenie menu .................................................................................................... 439
Ikony w elementach menu ..................................................................................... 441
Pola wyboru i przeczniki jako elementy menu ........................................................ 442
Menu podrczne ................................................................................................... 444
Mnemoniki i akceleratory ....................................................................................... 445

background image

8 Java.

Podstawy

Aktywowanie i dezaktywowanie elementów menu ..................................................... 448
Paski narzdzi ...................................................................................................... 451
Dymki .................................................................................................................. 453

Zaawansowane techniki zarzdzania rozkadem ............................................................ 456

Rozkad GridBagLayout .......................................................................................... 458
Rozkad grupowy ................................................................................................... 468
Nieuywanie adnego zarzdcy rozkadu .................................................................. 478
Niestandardowi zarzdcy rozkadu .......................................................................... 479
Kolejka dostpu .................................................................................................... 483

Okna dialogowe ......................................................................................................... 485

Okna dialogowe opcji ............................................................................................ 485
Tworzenie okien dialogowych .................................................................................. 495
Wymiana danych ................................................................................................... 500
Okna dialogowe wyboru plików ............................................................................... 506
Okna dialogowe wyboru kolorów ............................................................................. 517

Rozdzia 10. Przygotowywanie apletów i aplikacji do uytku ............................................................ 525

Pliki JAR .................................................................................................................... 526

Manifest .............................................................................................................. 526
Wykonywalne pliki JAR ........................................................................................... 528
Zasoby ................................................................................................................. 529
Piecztowanie pakietów ......................................................................................... 532

Java Web Start ........................................................................................................... 533

Sandbox ............................................................................................................... 537
Podpisywanie kodu ............................................................................................... 538
API JNLP .............................................................................................................. 539

Aplety ........................................................................................................................ 548

Prosty aplet .......................................................................................................... 549
Znacznik applet i jego atrybuty ............................................................................... 553
Znacznik object ..................................................................................................... 557
Parametry przekazujce informacje do apletów ........................................................ 557
Dostp do obrazów i plików audio .......................................................................... 562
rodowisko dziaania apletu ................................................................................... 563

Zapisywanie preferencji uytkownika ............................................................................ 572

Mapy wasnoci .................................................................................................... 572
API Preferences .................................................................................................... 577

Rozdzia 11. Wyjtki, dzienniki, asercje i debugowanie ....................................................................... 585

Obsuga bdów ......................................................................................................... 586

Klasyfikacja wyjtków ............................................................................................ 587
Deklarowanie wyjtków kontrolowanych .................................................................. 589
Zgaszanie wyjtków .............................................................................................. 591
Tworzenie klas wyjtków ........................................................................................ 593

Przechwytywanie wyjtków ........................................................................................... 594

Przechwytywanie wielu typów wyjtków .................................................................... 596
Powtórne generowanie wyjtków i budowanie acuchów wyjtków ............................ 596
Klauzula finally ..................................................................................................... 597
Analiza danych ze ledzenia stosu .......................................................................... 601

Wskazówki dotyczce stosowania wyjtków .................................................................. 604

background image

Spis

treci

9

Asercje ...................................................................................................................... 607

Wczanie i wyczanie asercji ................................................................................ 608
Zastosowanie asercji w sprawdzaniu parametrów .................................................... 608
Zastosowanie asercji w dokumentacji zaoe ......................................................... 610

Dzienniki ................................................................................................................... 611

Podstawy zapisu do dziennika ................................................................................ 611
Zaawansowane techniki zapisu do dziennika ........................................................... 612
Zmiana konfiguracji menedera dzienników ............................................................. 614
Lokalizacja ........................................................................................................... 615
Obiekty typu Handler ............................................................................................. 616
Filtry .................................................................................................................... 620
Formatery ............................................................................................................. 620
Przepis na dziennik ............................................................................................... 620

Wskazówki dotyczce debugowania ............................................................................. 629

Uywanie okna konsoli .......................................................................................... 635
ledzenie zdarze AWT .......................................................................................... 636
Zaprzganie robota AWT do pracy ........................................................................... 640

Praca z debugerem ..................................................................................................... 645

Rozdzia 12. Programowanie uogólnione ............................................................................................. 649

Dlaczego programowanie uogólnione ........................................................................... 650

Dla kogo programowanie uogólnione ...................................................................... 651

Definicja prostej klasy uogólnionej ............................................................................... 652
Metody uogólnione ..................................................................................................... 654
Ograniczenia zmiennych typowych ................................................................................ 655
Kod uogólniony a maszyna wirtualna ............................................................................ 657

Translacja wyrae generycznych ............................................................................ 659
Translacja metod uogólnionych .............................................................................. 660
Uywanie starego kodu .......................................................................................... 662

Ograniczenia i braki .................................................................................................... 663

Nie mona podawa typów prostych jako parametrów typowych ................................ 663
Sprawdzanie typów w czasie dziaania programu jest moliwe tylko

dla typów surowych ............................................................................................ 663

Obiektów klasy uogólnionej nie mona generowa ani przechwytywa ........................ 664
Nie mona tworzy tablic typów uogólnionych .......................................................... 665
Nie wolno tworzy egzemplarzy zmiennych typowych ................................................. 665
Zmiennych typowych nie mona uywa w statycznych kontekstach klas uogólnionych ... 667
Uwaaj na konflikty, które mog powsta po wymazaniu typów .................................. 667

Zasady dziedziczenia dla typów uogólnionych ................................................................ 668
Typy wieloznaczne ...................................................................................................... 671

Ograniczenia nadtypów typów wieloznacznych .......................................................... 672
Typy wieloznaczne bez ogranicze .......................................................................... 674
Chwytanie typu wieloznacznego .............................................................................. 675

Refleksja a typy uogólnione ......................................................................................... 679

Zastosowanie parametrów Class<T> do dopasowywania typów ................................. 680
Informacje o typach generycznych w maszynie wirtualnej .......................................... 680

background image

10 Java.

Podstawy

Rozdzia 13. Kolekcje ............................................................................................................................. 687

Interfejsy kolekcyjne ................................................................................................... 687

Oddzielenie warstwy interfejsów od warstwy klas konkretnych ................................... 688
Interfejsy Collection i Iterator ................................................................................. 690

Konkretne klasy kolekcyjne ......................................................................................... 696

Listy powizane .................................................................................................... 696
Listy tablicowe ...................................................................................................... 706
Zbiór HashSet ...................................................................................................... 706
Zbiór TreeSet ........................................................................................................ 710
Porównywanie obiektów ......................................................................................... 711
Kolejki Queue i Deque ........................................................................................... 717
Kolejki priorytetowe ............................................................................................... 718
Mapy ................................................................................................................... 719
Specjalne klasy Set i Map ..................................................................................... 724

Architektura kolekcji ................................................................................................... 729

Widoki i obiekty opakowujce ................................................................................. 733
Operacje zbiorcze .................................................................................................. 739
Konwersja pomidzy kolekcjami a tablicami ............................................................ 740

Algorytmy ................................................................................................................... 741

Sortowanie i tasowanie ......................................................................................... 742
Wyszukiwanie binarne ........................................................................................... 745
Proste algorytmy ................................................................................................... 746
Pisanie wasnych algorytmów ................................................................................. 748

Stare kolekcje ............................................................................................................ 749

Klasa Hashtable ................................................................................................... 749
Wyliczenia ............................................................................................................ 750
Mapy wasnoci .................................................................................................... 751
Stosy ................................................................................................................... 751
Zbiory bitów .......................................................................................................... 752

Rozdzia 14. Wielowtkowo ............................................................................................................... 757

Czym s wtki ............................................................................................................ 758

Wykonywanie zada w osobnych wtkach ................................................................ 763

Przerywanie wtków .................................................................................................... 769
Stany wtków ............................................................................................................. 771

Wtki NEW ........................................................................................................... 772
Wtki RUNNABLE .................................................................................................. 772
Wtki BLOCKED i WAITING ..................................................................................... 773
Zamykanie wtków ................................................................................................ 773

Wasnoci wtków ...................................................................................................... 775

Priorytety wtków .................................................................................................. 775
Wtki demony ....................................................................................................... 776
Procedury obsugi nieprzechwyconych wyjtków ....................................................... 777

Synchronizacja ........................................................................................................... 778

Przykad sytuacji powodujcej wycig ...................................................................... 778
Wycigi ................................................................................................................ 783
Obiekty klasy Lock ................................................................................................ 784
Warunki ............................................................................................................... 787
Sowo kluczowe synchronized ................................................................................. 792
Bloki synchronizowane .......................................................................................... 796
Monitor ................................................................................................................ 797

background image

Spis

treci

11

Pola ulotne ........................................................................................................... 798
Zakleszczenia ....................................................................................................... 800
Testowanie blokad i odmierzanie czasu .................................................................. 803
Blokady odczytu-zapisu .......................................................................................... 804
Dlaczego metody stop i suspend s odradzane ....................................................... 805

Kolejki blokujce ........................................................................................................ 808
Kolekcje bezpieczne wtkowo ...................................................................................... 815

Szybkie mapy, zbiory i kolejki ................................................................................. 815
Tablice kopiowane przy zapisie ............................................................................... 817
Starsze kolekcje bezpieczne wtkowo ..................................................................... 817

Interfejsy Callable i Future ........................................................................................... 819
Klasa Executors ......................................................................................................... 823

Pule wtków ......................................................................................................... 824
Planowanie wykonywania ....................................................................................... 828
Kontrolowanie grup zada ...................................................................................... 829

Synchronizatory .......................................................................................................... 830

Semafory ............................................................................................................. 830
Klasa CountDownLatch .......................................................................................... 831
Bariery ................................................................................................................. 832
Klasa Exchanger ................................................................................................... 833
Kolejki synchroniczne ............................................................................................ 833
Przykad — wstrzymywanie i ponowne uruchamianie animacji ................................... 833

Wtki a biblioteka Swing ............................................................................................. 839

Uruchamianie czasochonnych zada ...................................................................... 840
Klasa SwingWorker ............................................................................................... 845
Zasada jednego wtku .......................................................................................... 851

Dodatek A Sowa kluczowe Javy .......................................................................................................... 853

Skorowidz ............................................................................................................................................. 855

background image

8

Obsuga zdarze

W tym rozdziale:

Q

Podstawy obsugi zdarze

Q

Akcje

Q

Zdarzenia generowane przez mysz

Q

Hierarchia zdarze

AWT

Obsuga zdarze ma fundamentalne znaczenie w programach z graficznym interfejsem uyt-
kownika. Kady, kto chce tworzy interfejsy graficzne w Javie, musi opanowa obsug zda-
rze . Niniejszy rozdzia opisuje model obsugi zdarze biblioteki

AWT

. Do opisywanych

zagadnie nale przechwytywanie zdarze w komponentach interfejsu uytkownika i urz-
dzeniach wejciowych, a take akcje (ang. actions), czyli bardziej strukturalna metoda
przetwarzania zdarze .

Podstawy obsugi zdarze

Kady system operacyjny posiadajcy graficzny interfejs uytkownika stale monitoruje za-
chodzce w nim zdarzenia, jak naciskanie klawiszy na klawiaturze czy kliknicia przyciskiem
myszy. Informacje o tych zdarzeniach s przesyane do uruchomionych programów. Nastp-
nie kady program podejmuje samodzieln decyzj, w jaki sposób, jeli w ogóle, zareagowa
na te zdarzenia. W takich jzykach jak Visual Basic relacje pomidzy zdarzeniami a kodem
s oczywiste. Programista pisze kod obsugi kadego interesujcego go zdarzenia i umieszcza
go w tzw. procedurze obsugi zdarze (ang. event procedure). Na przykad z przyciskiem
o nazwie

HelpButton

w jzyku Visual Basic moe by skojarzona procedura obsugi zdarze

o nazwie

HelpButton_Click

. Kod niniejszej procedury jest wykonywany w odpowiedzi na

kade kliknicie niniejszego przycisku. Kady komponent GUI w jzyku Visual Basic reaguje
na ustalony zestaw zdarze — nie mona zmieni zdarze , na które reaguje dany komponent.

background image

356

Java. Podstawy

Natomiast programici czystego jzyka C zajmujcy si zdarzeniami musz pisa procedury
nieprzerwanie monitorujce kolejk zdarze w celu sprawdzenia, jakie powiadomienia prze-
sya system operacyjny (z reguy do tego celu stosuje si ptl zawierajc bardzo rozbudowan
instrukcj

switch

!). Technika ta jest oczywicie bardzo mao elegancka i sprawia wiele pro-

blemów podczas pisania kodu. Jej zalet jest natomiast to, e nie ma adnych ogranicze
dotyczcych zdarze , na które mona reagowa , w przeciwie stwie do innych jzyków, np.
Visual Basica, które wkadaj bardzo duo wysiku w ukrywanie kolejki zdarze przed
programist.

W rodowisku programistycznym Javy przyjto podejcie porednie pomidzy jzykami Visual
Basic a C, jeli chodzi o oferowane moliwoci, a co za tym idzie — take zoono . Poru-
szajc si w zakresie zdarze , które obsuguje biblioteka

AWT

, programista ma pen kontrol

nad sposobem przesyania zdarze ze róde zdarze (ang. event sources), np. przycisków lub
pasków przewijania, do suchaczy zdarze (ang. event listener). Na suchacza zdarze mona
desygnowa kady obiekt — w praktyce wybiera si ten obiekt, który z atwoci moe wy-
kona odpowiednie dziaania w odpowiedzi na zdarzenie. Ten delegacyjny model zdarze daje
znacznie wiksze moliwoci ni jzyk Visual Basic, w którym suchacz jest ustalony z góry.

róda zdarze dysponuj metodami, w których mona rejestrowa suchaczy zdarze . Kiedy
ma miejsce okrelone zdarzenie, ródo wysya powiadomienie o nim do wszystkich obiektów
nasuchujcych, które zostay dla niego zarejestrowane.

Jak mona si spodziewa , informacje o zdarzeniu w jzyku obiektowym, takim jak Java, s
pakowane w obiekcie zdarze (ang. event object). W Javie wszystkie obiekty zdarze nale
do klasy

java.util.EventObject

. Oczywicie istniej te podklasy reprezentujce kady typ

zdarzenia, takie jak

ActionEvent

czy

WindowEvent

.

Róne róda zdarze mog dostarcza rónego rodzaju zdarze . Na przykad przycisk moe
wysya obiekty

ActionEvent

, podczas gdy okno wysya obiekty

WindowEvent

.

Podsumujmy, co ju wiemy na temat obsugi zdarze w bibliotece

AWT

:

Q

Obiekt nasuchujcy jest egzemplarzem klasy implementujcej specjalny interfejs
nasuchu
(ang. listener interface).

Q

ródo zdarze to obiekt, który moe rejestrowa obiekty nasuchujce i wysya
do nich obiekty zdarze .

Q

ródo zdarze wysya obiekty zdarze do wszystkich zarejestrowanych suchaczy
w chwili wystpienia zdarzenia.

Q

Informacje zawarte w obiekcie zdarze s wykorzystywane przez obiekty nasuchujce
przy podejmowaniu decyzji dotyczcej reakcji na zdarzenie.

Rysunek 8.1 przedstawia relacje pomidzy klasami obsugi zdarze a interfejsami

Poniej znajduje si przykadowa definicja suchacza:

ActionListener listener = . . .;
JButton button = new JButton("Ok");
button.addActionListener(listener);

background image

Rozdzia 8.

Q

Obsuga zdarze

357

Rysunek 8.1.
Relacje pomidzy
ródami zdarze
a suchaczami

Od tej pory obiekt

listener

bdzie powiadamiany o kadym zdarzeniu akcji w przycisku.

Jak si mona domyli , zdarzenie akcji w przypadku przycisku to jego kliknicie.

Klasa implementujca interfejs

ActionListener

musi definiowa metod o nazwie

action-

Performed

, która jako parametr przyjmuje obiekt typu

ActionEvent

:

class MyListener implements ActionListener
{
. . .
public void actionPerformed(ActionEvent event)
{
// Instrukcje wykonywane w odpowiedzi na kliknicie przycisku.
. . .
}
}

Kiedy uytkownik kliknie przycisk, obiekt typu

JButton

tworzy obiekt typu

ActionEvent

i wywouje metod

listener.actionPerformed(event)

, przekazujc do niej niniejszy obiekt

zdarzenia. ródo zdarze , takie jak przycisk, moe mie kilku suchaczy. W takim przy-
padku kliknicie przycisku przez uytkownika powoduje wywoanie metod

actionPerformed

wszystkich suchaczy.

Rysunek 8.2 przedstawia relacje pomidzy ródem zdarze , suchaczem zdarze a obiek-
tem zdarze .

Przykad — obsuga kliknicia przycisku

Aby nabra biegoci w posugiwaniu si modelem delegacji zdarze , przeanalizujemy szcze-
góowo prosty program reagujcy na kliknicie przycisku. Utworzymy panel zawierajcy trzy
przyciski, których zdarze bd nasuchiwa trzy obiekty nasuchujce.

W tym przypadku za kadym razem, gdy uytkownik kliknie jeden z przycisków na panelu,
skojarzony z tym przyciskiem obiekt odbierze obiekt typu

ActionEvent

oznaczajcy kliknicie

przycisku. W odpowiedzi obiekt nasuchujcy zmieni kolor ta panelu.

Przed przejciem do programu, który nasuchuje klikni przycisków, musimy najpierw za-
pozna si z technik tworzenia i dodawania przycisków do panelu (wicej informacji na
temat elementów GUI znajduje si w rozdziale 9.).

background image

358

Java. Podstawy

Rysunek 8.2.
Powiadamianie
o zdarzeniach

Tworzenie przycisku polega na podaniu jego konstruktorowi a cucha okrelajcego etykiet
przycisku, ikony lub jednego i drugiego. Poniej znajduj si przykady tworzenia dwóch
przycisków:

JButton yellowButton = new JButton(" óty");
JButton blueButton = new JButton(new ImageIcon("blue-ball.gif"));

Przyciski do panelu dodaje si za pomoc metody

add

:

JButton yellowButton = new JButton(" óty");
JButton blueButton = new JButton("Niebieski");
JButton redButton = new JButton("Czerwony");

buttonPanel.add(yellowButton);
buttonPanel.add(blueButton);
buttonPanel.add(redButton);

Wynik powyszych dziaa przedstawia rysunek 8.3.

Nastpnie konieczne jest dodanie procedur nasuchujcych tych przycisków. Do tego po-
trzebne s klasy implementujce interfejs

ActionListener

, który, jak ju wspominalimy,

zawiera tylko jedn metod:

actionPerformed

. Sygnatura niniejszej metody jest nastpujca:

public void actionPerformed(ActionEvent event)

background image

Rozdzia 8.

Q

Obsuga zdarze

359

Rysunek 8.3.
Panel
z przyciskami

Interfejs

ActionListener nie ogranicza si tylko do klikni przycisków. Znajduje

on zastosowanie w wielu innych sytuacjach, takich jak:

Q

wybór elementu z pola listy za pomoc dwukrotnego kliknicia,

Q

wybór elementu menu,

Q

kliknicie klawisza Enter w polu tekstowym,

Q

upyw okrelonej iloci czasu dla komponentu

Timer.

Wicej szczegóów na ten temat znajduje si w niniejszym i kolejnym rozdziale.

Sposób uycia interfejsu

ActionListener jest taki sam we wszystkich sytuacjach:

metoda

actionPerformed (jedyna w interfejsie ActionListener) przyjmuje obiekt typu

ActionEvent jako parametr. Ten obiekt zdarzenia dostarcza informacji o zdarzeniu,
które miao miejsce.

Reakcj na kliknicie przycisku ma by zmiana koloru ta panelu. dany kolor bdziemy
przechowywa w klasie nasuchujcej:

class ColorAction implements ActionListener
{
public ColorAction(Color c)
{
backgroundColor = c;
}

public void actionPerformed(ActionEvent event)
{
// Ustawienie koloru ta panelu.
. . .
}
private Color backgroundColor;
}

Nastpnie dla kadego koloru tworzymy osobny obiekt i kady z nich rejestrujemy jako
suchacza przycisku.

ColorAction yellowAction = new ColorAction(Color.YELLOW);
ColorAction blueAction = new ColorAction(Color.BLUE);
ColorAction redAction = new ColorAction(Color.RED);

yellowButton.addActionListener(yellowAction);
blueButton.addActionListener(blueAction);
redButton.addActionListener(redAction);

background image

360

Java. Podstawy

Jeli uytkownik kliknie na przykad przycisk z napisem

óty

, zostanie wywoana metoda

actionPerformed

obiektu

yellowAction

. Pole

backgroundColor

niniejszego obiektu ma warto

color.YELLOW

.

Zosta jeszcze tylko jeden problem do rozwizania. Obiekt typu

ColorAction

nie ma dost-

pu do zmiennej

buttonPanel

. Mona to rozwiza na jeden z dwóch sposobów. Mona za-

pisa panel w obiekcie

ColorAction

i skonstruowa go w konstruktorze

ColorAction

. Wygod-

niej jednak byoby, gdyby

ColorAction

bya klas wewntrzn klasy

ButtonFrame

. Dziki

temu jej metody miayby automatycznie dostp do zewntrznego panelu (wicej informacji
na temat klas wewntrznych znajduje si w rozdziale 6.).

Zastosujemy drug z opisanych metod. Poniej przedstawiamy klas

ColorAction

wewntrz

klasy

ButtonFrame

:

class ButtonPanel extends JFrame
{
. . .
private class ColorAction implements ActionListener
{
. . .
public void actionPerformed(ActionEvent event)
{
buttonPanel.setBackground(backgroundColor);
}

private Color backgroundColor;
}
private JPanel buttonPanel;
}

Przypatrzmy si uwaniej metodzie

actionPerformed

. Klasa

ColorAction

nie posiada pola

buttonPanel

. Ma go natomiast zewntrzna klasa

ButtonFrame

.

Jest to bardzo czsto spotykana sytuacja. Obiekty nasuchu zdarze czsto musz wykony-
wa dziaania, które maj wpyw na inne obiekty. Klas nasuchujc czsto mona umieci
w strategicznym miejscu wewntrz klasy, której obiekt ma mie zmieniony stan.

Listing 8.1 przedstawia kompletny program. Kliknicie jednego z przycisków powoduje
zmian koloru ta panelu przez odpowiedniego suchacza akcji.

Listing 8.1. ButtonTest.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
* @version 1.33 2007-06-12
* @author Cay Horstmann
*/
public class ButtonTest
{

background image

Rozdzia 8.

Q

Obsuga zdarze

361

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
ButtonFrame frame = new ButtonFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}

/**
* Ramka z panelem zawierajcym przyciski.
*/
class ButtonFrame extends JFrame
{
public ButtonFrame()
{
setTitle("ButtonTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

// Tworzenie przycisków.
JButton yellowButton = new JButton(" óty");
JButton blueButton = new JButton("Niebieski");
JButton redButton = new JButton("Czerwony");

buttonPanel = new JPanel();

// Dodanie przycisków do panelu.
buttonPanel.add(yellowButton);
buttonPanel.add(blueButton);
buttonPanel.add(redButton);

// Dodanie panelu do ramki.
add(buttonPanel);

// Utworzenie akcji przycisków.
ColorAction yellowAction = new ColorAction(Color.YELLOW);
ColorAction blueAction = new ColorAction(Color.BLUE);
ColorAction redAction = new ColorAction(Color.RED);

// Powizanie akcji z przyciskami.
yellowButton.addActionListener(yellowAction);
blueButton.addActionListener(blueAction);
redButton.addActionListener(redAction);
}

/**
* Suchacz akcji ustawiajcy kolor ta panelu.
*/
private class ColorAction implements ActionListener
{

background image

362

Java. Podstawy

public ColorAction(Color c)
{
backgroundColor = c;
}

public void actionPerformed(ActionEvent event)
{
buttonPanel.setBackground(backgroundColor);
}

private Color backgroundColor;
}

private JPanel buttonPanel;

public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}

javax.swing.JButton

1.2

Q

JButton(String label)

Q

JButton(Icon icon)

Q

JButton(String label, Icon icon)

Tworzy przycisk. a cuch etykiety moe zawiera sam tekst lub (od Java SE 1.3)
kod HTML, np.

"<html><b>Ok</b></html>"

.

java.awt.Container

1.0

Q

Component add(Component c)

Dodaje komponent

c

do kontenera.

javax.swing.ImageIcon

1.2

Q

ImageIcon(String filename)

Tworzy ikon, której obraz jest zapisany w pliku.

Nabywanie biegoci w posugiwaniu si klasami wewntrznymi

Niektórzy programici nie przepadaj za klasami wewntrznymi, poniewa uwaaj, e klasy
i obiekty o duych rozmiarach spowalniaj dziaanie programu. Przyjrzyjmy si temu twier-
dzeniu. Nie potrzebujemy nowej klasy dla kadego elementu interfejsu uytkownika. W na-
szym programie wszystkie trzy przyciski wspódziel jedn klas nasuchujc. Oczywicie
kady z nich posiada osobny obiekt nasuchujcy. Ale obiekty te nie s due. Kady z nich
zawiera warto okrelajc kolor i referencj do panelu. A tradycyjne rozwizanie, z zasto-
sowaniem instrukcji

if-else

, równie odwouje si do tych samych obiektów kolorów prze-

chowywanych przez suchaczy akcji, tylko e jako zmienne lokalne, a nie pola obiektów.

background image

Rozdzia 8.

Q

Obsuga zdarze

363

Poniej przedstawiamy dobry przykad tego, jak anonimowe klasy wewntrzne mog upro-
ci kod programu. W programie na listingu 8.1 z kadym przyciskiem zwizane s takie
same dziaania:

1.

Utworzenie przycisku z etykiet.

2.

Dodanie przycisku do panelu.

3.

Utworzenie suchacza akcji z odpowiednim kolorem.

4.

Dodanie suchacza akcji.

Napiszemy metod pomocnicz, która bdzie upraszczaa niniejsze czynnoci:

public void makeButton(String name, Color backgroundColor)
{
JButton button = new JButton(name);
buttonPanel.add(button);
ColorAction action = new ColorAction(backgroundColor);
button.addActionListener(action);
}

Teraz wystarcz tylko nastpujce wywoania:

makeButton("óty", Color.YELLOW);
makeButton("niebieski", Color.BLUE);
makeButton("czerwony", Color.RED);

Moliwe s dalsze uproszczenia. Zauwamy, e klasa

ColorAction

jest potrzebna tylko jeden

raz — w metodzie

makeButton

. A zatem mona j przerobi na klas anonimow:

public void makeButton(String name, final Color backgroundColor)
{
JButton button = new JButton(name);
buttonPanel.add(button);
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
buttonPanel.setBackground(backgroundColor);
}
});
}

Kod suchacza akcji sta si znacznie prostszy. Metoda

actionPerformed

odwouje si do

zmiennej parametrycznej

backgroundColor

(podobnie jak w przypadku wszystkich zmiennych

lokalnych wykorzystywanych w klasie wewntrznej, parametr ten musi by finalny).

Nie jest potrzebny aden jawny konstruktor. Jak widzielimy w rozdziale 6., mechanizm klas
wewntrznych automatycznie generuje konstruktor zapisujcy wszystkie finalne zmienne
lokalne, które s uywane w jednej z metod klasy wewntrznej.

background image

364

Java. Podstawy

Anonimowe klasy wewntrzne potrafi zmyli niejednego programist. Mona jed-
nak przyzwyczai si do ich rozszyfrowywania, wyrabiajc sobie umiejtno po-

mijania wzrokiem kodu procedury:

button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
buttonPanel.setBackground(backgroundColor);
}
});

Akcja przycisku ustawia kolor ta. Dopóki procedura obsugi zdarze skada si z tylko
kilku instrukcji, wydaje si, e z odczytem nie powinno by problemów, zwaszcza jeli
w sferze naszych zainteresowa nie le mechanizmy klas wewntrznych.

Suchaczem przycisku moe by obiekt kadej klasy, która implementuje interfejs

ActionListener. My wolimy uywa obiektów nowej klasy, która zostaa utworzona

specjalnie z myl o wykonywaniu akcji przycisku. Jednak niektórzy programici nie czuj
si pewnie w stosowaniu klas wewntrznych i wybieraj inne podejcie. Implementuj
interfejs

ActionListener w kontenerze róde zdarze. Nastpnie kontener ten ustawia

sam siebie jako suchacza w nastpujcy sposób:

yellowButton.addActionListener(this);
blueButton.addActionListener(this);
redButton.addActionListener(this);

W tej sytuacji aden z trzech przycisków nie ma osobnego suchacza. Dysponuj one
wspólnym obiektem, którym jest ramka przycisku. W zwizku z tym metoda

action-

Performed musi sprawdzi , który przycisk zosta kliknity.

class ButtonFrame extends JFrame

implements ActionListener

{
. . .
public void actionPerformed(ActionEvent event)
{
Object source = event.getSource();
if (source == yellowButton) . . .
else if (source == blueButton) . . .
else if (source == redButton ) . . .
else . . .
}
}

Jak wida , metoda ta jest nieco zagmatwana, przez co nie zalecamy jej stosowania.

java.util.EventObject

1.1

Q

Object setSource()

Zwraca referencj do obiektu, w którym wystpio zdarzenie.

background image

Rozdzia 8.

Q

Obsuga zdarze

365

java.awt.event.ActionEvent

1.1

Q

String getActionCommand()

Zwraca a cuch polecenia skojarzonego z danym zdarzeniem akcji. Jeli zdarzenie
pochodzi od przycisku, a cuch polecenia jest taki sam jak etykieta przycisku,
chyba e zosta zmieniony za pomoc metody

setActionCommand

.

java.beans.EventHandler

1.4

Q

static Object create(Class listenerInterface, Object target, String action)

Q

static Object create(Class listenerInterface, Object target, String action,
String eventProperty)

Q

static Object create(Class listenerInterface, Object target, String action,
String eventProperty, String listenerMethod)

Tworzy obiekt klasy poredniczcej implementujcej dany interfejs. Albo podana
metoda, albo wszystkie metody interfejsu wykonuj dane akcje na rzecz obiektu
docelowego.

Akcj moe by metoda lub wasno obiektu docelowego. Jeli jest to wasno ,
wykonywana jest jej metoda ustawiajca. Na przykad akcja

text

jest zamieniana

na wywoanie metody

setText

.

Wasno zdarzenia skada si z jednej lub wikszej liczby nazw wasnoci
oddzielonych kropkami. Pierwsza wasno jest wczytywana z parametru metody
nasuchujcej. Druga wasno pochodzi od powstaego obiektu itd. Wynik ko cowy
staje si parametrem akcji. Na przykad wasno

source.text

jest zamieniana

na wywoania metod

getSource

i

getText

.

Tworzenie suchaczy zawierajcych jedno wywoanie metody

W Java SE 1.4 wprowadzono mechanizm umoliwiajcy okrelanie prostych suchaczy zda-
rze bez tworzenia klas wewntrznych. Wyobramy sobie na przykad, e mamy przycisk
z etykiet Load, którego procedura obsugi zdarze zawiera tylko jedn metod:

frame.loadData();

Oczywicie mona uy anonimowej klasy wewntrznej:

loadButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
frame.loadData();
}
});

Ale klasa

EventHandler

moe utworzy takiego suchacza automatycznie, za pomoc nast-

pujcego wywoania:

EventHandler.create(ActionListener.class, frame, "loadData")

background image

366

Java. Podstawy

Oczywicie nadal konieczne jest zainstalowanie procedury obsugi:

loadButton.addActionListener(
EventHandler.create(ActionListener.class, frame, "loadData"));

Jeli suchacz wywouje metod z jednym parametrem, który mona uzyska z parametru
zdarzenia, mona uy innego rodzaju metody

create

. Na przykad wywoanie:

EventHandler.create(ActionListener.class, frame, "loadData", "source.text")

jest równoznaczne z:

new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
frame.loadData(((JTextField) event.getSource()).getText());
}
}

Nazwy wasnoci

source

i

text

zamieniaj si w wywoania metod

getSource

i

getText

.

Przykad — zmiana stylu

Domylnym stylem programów pisanych przy uyciu Swinga jest Metal. Istniej dwa spo-
soby na zmian stylu. Pierwszy z nich polega na utworzeniu pliku swing.properties w katalogu
jre/lib w miejscu instalacji Javy. W pliku tym naley ustawi wasno swing.defaultlaf
na nazw klasy stylu, który chcemy zastosowa . Na przykad:

swing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel

Zauwamy, e styl Metal jest zlokalizowany w pakiecie

javax.swing

. Pozostae style znaj-

duj si w pakiecie

com.sun.java

i nie musz by obecne w kadej implementacji Javy. Obec-

nie ze wzgldu na prawa autorskie pakiety stylów systemów Windows i Macintosh s dostpne
wycznie z wersjami rodowiska uruchomieniowego Javy przeznaczonymi dla tych systemów.

Poniewa w plikach wasnoci linie zaczynajce si od znaku

# s ignorowane,

mona w takim pliku umieci kilka stylów i wybiera je wedle upodobania, odpo-

wiednio zmieniajc pooenie znaku

#:

#swing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel
swing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel
#swing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel

Aby zmieni styl w ten sposób, konieczne jest ponowne uruchomienie programu. Pro-
gramy Swing wczytuj plik swing.properties tylko jeden raz — przy uruchamianiu.

Drugi sposób polega na dynamicznej zmianie stylu. Naley wywoa statyczn metod

UIManager.setLookAndFeel

oraz przekaza do niej nazw klasy wybranego stylu. Nastpnie

wywoujemy statyczn metod

SwingUtilities.updateComponentTreeUI

w celu odwieenia

caego zbioru komponentów. Metodzie tej wystarczy przekaza tylko jeden komponent, a po-
zostae znajdzie ona samodzielnie. Metoda

UIManager.setLookAndFeel

moe spowodowa

background image

Rozdzia 8.

Q

Obsuga zdarze

367

kilka wyjtków, jeli nie znajdzie danego stylu lub jeli wystpi bd podczas adowania
stylu. Jak zwykle nie zgbiamy kodu obsugujcego wyjtki, poniewa szczegóowo zajmie-
my si tym w rozdziale 11.

Poniszy przykadowy fragment programu przedstawia sposób przeczenia na styl Motif:

String plaf = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
try
{
UIManager.setLookAndFeel(plaf);
SwingUtilities.updateComponentTreeUI(panel);
}
catch(Exception e) { e.printStackTrace(); }

Aby odnale wszystkie zainstalowane style, naley uy wywoania:

UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();

W takiej sytuacji nazw kadego stylu i jego klasy mona uzyska nastpujco:

String name = infos[i].getName();
String className = infos[i].getClassName();

Listing 8.2 przedstawia peny kod programu demonstrujcego przeczanie stylów (zobacz
rysunek 8.4). Program ten jest podobny do programu z listingu 8.1. Idc za rad z poprzed-
niej sekcji, akcj przycisku, polegajc na zmianie stylu, okrelilimy za pomoc metody
pomocniczej

makeButton

i anonimowej klasy wewntrznej.

Listing 8.2. PlafTest.java

import java.awt.EventQueue;
import java.awt.event.*;
import javax.swing.*;

/**
* @version 1.32 2007-06-12
* @author Cay Horstmann
*/
public class PlafTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
PlafFrame frame = new PlafFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}

background image

368

Java. Podstawy

/**
* Ramka z panelem zawierajcym przyciski zmieniajce styl.
*/
class PlafFrame extends JFrame
{
public PlafFrame()
{
setTitle("PlafTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

buttonPanel = new JPanel();

UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();
for (UIManager.LookAndFeelInfo info : infos)
makeButton(info.getName(), info.getClassName());

add(buttonPanel);
}

/**
* Tworzy przycisk zmieniajcy styl.
* @param name nazwa przycisku
* @param plafName nazwa klasy stylu
*/
void makeButton(String name, final String plafName)
{
// Dodanie przycisku do panelu.

JButton button = new JButton(name);
buttonPanel.add(button);

// Ustawienie akcji przycisku.

button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
// Akcja przycisku — przeczenie na nowy styl.
try
{
UIManager.setLookAndFeel(plafName);
SwingUtilities.updateComponentTreeUI(PlafFrame.this);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
}

private JPanel buttonPanel;

public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}

background image

Rozdzia 8.

Q

Obsuga zdarze

369

Rysunek 8.4.
Zmienianie stylu

Jedna rzecz w niniejszym programie jest godna szczególnej uwagi. Metoda

actionPerformed

wewntrznej klasy nasuchujcej akcji musi przekaza referencj

this

klasy zewntrznej

PlafFrame

do metody

updateComponentTreeUI

. Przypomnijmy sobie z rozdziau 6., e przed

wskanikiem

this

obiektu klasy zewntrznej musi znajdowa si przedrostek w postaci na-

zwy klasy zewntrznej:

SwingUtilities.updateComponentTreeUI(PlafPanel.this);

javax.swing.UIManager

1.2

Q

static UIManager.LookAndFeelInfo[] getInstalledLookAndFeels()

Tworzy tablic obiektów reprezentujcych zainstalowane style.

Q

static setLookAndFeel(String className)

Ustawia aktualny styl, wykorzystujc do tego podan nazw klasy
(np.

javax.swing.plaf.metal.MetalLookAndFeel

).

javax.swing.UIManager.LookAndFeelInfo

1.2

Q

String getName()

Zwraca nazw stylu.

Q

String getClassName()

Zwraca nazw klasy implementujcej dany styl.

background image

370

Java. Podstawy

Klasy adaptacyjne

Nie wszystkie zdarzenia s tak atwe w obsudze jak kliknicie przycisku. W profesjonalnym
programie naley stale sprawdza , czy uytkownik nie zamyka gównej ramki, aby zapo-
biec ewentualnej utracie jego danych. Gdy uytkownik zamyka ramk, powinno wywietla
si okno dialogowe monitujce o potwierdzenie niniejszego zamiaru.

Kiedy uytkownik zamyka okno, obiekt klasy

JFrame

jest ródem zdarzenia

WindowEvent

.

Aby przechwyci to zdarzenie, konieczny jest odpowiedni obiekt nasuchujcy, który naley
doda do listy suchaczy okna ramki.

WindowListener listener = . . .;
frame.addWindowListener(listener);

Obiekt nasuchujcy okna musi nalee do klasy implementujcej interfejs

WindowListener

.

Interfejs ten zawiera siedem metod. Ramka wywouje jedn z nich w odpowiedzi na jedno
z siedmiu zdarze , które mog mie miejsce w przypadku okna. Nazwy tych metod mówi
same za siebie. Naley tylko wyjani , e

iconfied

w systemie Windows oznacza to samo

co

minimized

. Poniej wida cay interfejs

WindowListener

:

public interface WindowListener
{
void windowOpened(WindowEvent e);
void windowClosing(WindowEvent e);
void windowClosed(WindowEvent e);
void windowIconified(WindowEvent e);
void windowDeiconified(WindowEvent e);
void windowActivated(WindowEvent e);
void windowDeactivated(WindowEvent e);
}

Aby sprawdzi , czy okno zostao zmaksymalizowane, naley zainstalowa obiekt

WindowStateListener. Zobacz wycig z API na stronie 373.

W Javie klasa, która implementuje dany interfejs, musi definiowa wszystkie jego metody.
W tym przypadku oznacza to implementacj siedmiu metod. Przypomnijmy jednak, e inte-
resuje nas tylko jedna z nich, o nazwie

windowClosing

.

Oczywicie nic nie stoi na przeszkodzie, aby zaimplementowa niniejszy interfejs, wstawi
wywoanie

System.exit(0)

do metody

windowClosing

i napisa sze nicnierobicych funkcji

dla pozostaych metod:

class Terminator implements WindowListener
{
public void windowClosing(WindowEvent e)
{
if (uytkownik potwierdza)
System.exit(0);
}
public void windowOpened(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}

background image

Rozdzia 8.

Q

Obsuga zdarze

371

public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
}

Pisanie szeciu metod, które nic nie robi, jest tym rodzajem pracy, której nikt nie lubi. Za-
danie to uatwiaj klasy adaptacyjne (ang. adapter class) dostpne z kadym interfejsem
nasuchujcym w bibliotece

AWT

, który ma wicej ni jedn metod. Klasy te implementuj

wszystkie metody interfejsów, którym odpowiadaj, ale metody te nic nie robi. Na przykad
klasa

WindowAdapter

zawiera definicje siedmiu nicnierobicych metod. Oznacza to, e klasa

adaptacyjna automatycznie spenia wymagania techniczne stawiane przez Jav, a dotyczce
implementacji odpowiadajcego jej interfejsu nasuchujcego. Klas adaptacyjn mona roz-
szerzy , definiujc w podklasie metody odpowiadajce niektórym, ale nie wszystkim typom
zdarze interfejsu (interfejsy, które maj tylko jedn metod, np.

ActionListener

, nie po-

trzebuj metod adaptacyjnych).

Rozszerzymy klas

WindowAdapter

. Odziedziczymy po niej sze nicnierobicych metod,

a metod

windowClossing

przesonimy:

class Terminator extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
if (uytkownik potwierdza)
System.exit(0);
}
}

Teraz moemy zarejestrowa obiekt typu

Terminator

jako suchacza zdarze :

WindowListener listener = new Terminator();
frame.addWindowListener(listener);

Kade zdarzenie okna wygenerowane przez ramk jest przekazywane do obiektu

listener

za pomoc wywoania jednej z jego siedmiu metod (zobacz rysunek 8.5). Sze z nich nie
robi nic, a metoda

windowClosing

wywouje metod

System.exit(0)

, zamykajc tym samym

aplikacj.

Jeli w nazwie metody rozszerzanej klasy adaptacyjnej znajdzie si bd, kompi-
lator go nie wykryje. Jeli na przykad w klasie rozszerzajcej

WindowAdapter zo-

stanie zdefiniowana metoda

windowIsClosing, nowa klasa bdzie zawieraa osiem me-

tod, a metoda

windowClosing nic nie bdzie robia.

Utworzenie klasy rozszerzajcej klas adaptacyjn

WindowAdapter

jest krokiem naprzód, ale

mona posun si jeszcze dalej. Nie ma potrzeby nadawa obiektowi

listener

nazwy.

Wystarczy napisa :

frame.addWindowListener(new Terminator());

Ale czemu poprzestawa na tym? Klasa nasuchujca moe by anonimow klas we-
wntrzn ramki.

background image

372

Java. Podstawy

Rysunek 8.5.
Obiekt
nasuchujcy
zdarze
dotyczcych okna

frame.addWindowListener(new
WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if (uytkownik potwierdza)
System.exit(0);
}
});

Powyszy fragment programu ma nastpujce dziaanie:

Q

Definiuje klas bez nazwy, rozszerzajc klas

WindowAdapter

.

Q

Do utworzonej anonimowej klasy dodaje metod

windowClosing

(podobnie jak

wczeniej, metoda ta zamyka program).

Q

Dziedziczy sze pozostaych nicnierobicych metod po klasie

WindowAdapter

.

Q

Tworzy obiekt tej nowej klasy — obiekt równie nie ma nazwy.

Q

Przekazuje niniejszy obiekt do metody

addWindowListener

.

Powtarzamy jeszcze raz, e do skadni wewntrznych klas anonimowych trzeba si przy-
zwyczai . Dziki nim mona pisa tak zwizy kod, jak to tylko moliwe.

background image

Rozdzia 8.

Q

Obsuga zdarze

373

java.awt.event.WindowListener

1.1

Q

void windowOpened(WindowEvent e)

Jest wywoywana po otwarciu okna.

Q

void windowClosing(WindowEvent e)

Jest wywoywana, kiedy uytkownik wyda polecenie menedera okien,
aby zamkn okno. Okno zostanie zamknite tylko wtedy, gdy zostanie wywoana
jego metoda

hide

lub

dispose

.

Q

void windowClosed(WindowEvent e)

Jest wywoywana po zamkniciu okna.

Q

void windowIconified(WindowEvent e)

Jest wywoywana po zminimalizowaniu okna.

Q

void windowDeiconified(WindowEvent e)

Jest wywoywana po przywróceniu okna.

Q

void windowActivated(WindowEvent e)

Jest wywoywana po uaktywnieniu okna. Aktywna moe by tylko ramka lub okno
dialogowe. Z reguy meneder okien zaznacza w jaki sposób aktywne okno
— np. podwietlajc pasek tytuu.

Q

void WindowDeactivated(WindowEvent e)

Jest wywoywana po dezaktywowaniu okna.

java.awt.event.WindowStateListener

1.4

Q

void windowStateChanged(WindowEvent event)

Jest wywoywana po zmaksymalizowaniu, zminimalizowaniu lub przywróceniu
do normalnego rozmiaru okna.

java.awt.event.WindowEvent

1.1

Q

int getNewState() 1.4

Q

int getOldState() 1.4

Zwraca nowy i stary stan okna w zdarzeniu zmiany stanu okna. Zwracana liczba
cakowita jest jedn z nastpujcych wartoci:

Frame.NORMAL
Frame.ICONIFIED
Frame.MAXIMIZED_HORIZ
Frame.MAXIMIZED_VERT
Frame.MAXIMIZED_BOTH

background image

374

Java. Podstawy

Akcje

Czsto jedn opcj mona wybra na kilka rónych sposobów. Uytkownik moe wybra
odpowiedni funkcj w menu, nacisn okrelony klawisz lub przycisk na pasku narzdzi.
Zaprogramowanie takiej funkcjonalnoci w modelu zdarze

AWT

jest proste — naley

wszystkie zdarzenia zwiza z tym samym obiektem nasuchujcym. Wyobramy sobie, e

blueAction

jest obiektem nasuchujcym akcji, którego metoda

actionPerformed

zmienia ko-

lor ta na niebieski. Jeden obiekt mona zwiza jako suchacza z kilkoma ródami zdarze :

Q

przyciskiem paska narzdzi z etykiet Niebieski;

Q

elementem menu z etykiet Niebieski;

Q

skrótem klawiszowym Ctrl+N.

Dziki temu zmiana koloru bdzie wykonywana zawsze w taki sam sposób, bez znaczenia,
czy wywoa j kliknicie przycisku, wybór elementu menu, czy nacinicie klawisza.

W pakiecie Swing dostpna jest niezwykle przydatna struktura opakowujca polecenia i wi-
ca je z rónymi ródami zdarze — interfejs

Action

. Akcja to obiekt, który opakowuje:

Q

opis polecenia (a cuch tekstowy i opcjonalna ikona),

Q

parametry niezbdne do wykonania polecenia (w naszym przypadku
wymagany kolor).

Interfejs

Action

zawiera nastpujce metody:

void actionPerformed(ActionEvent event)
void setEnabled(boolean b)
boolean isEnabled()
void putValue(String key, Object value)
Object getValue(String key)
void addPropertyChangeListener(PropertyChangeListener listener)
void removePropertyChangeListener(PropertyChangeListener listener)

Pierwsza z tych metod jest ju nam znana z interfejsu

ActionListener

. Naley doda , e inter-

fejs

Action

rozszerza interfejs

ActionListener

. W zwizku z tym wszdzie, gdzie powinien

znale si obiekt

ActionListener

, mona uy obiektu

Action

.

Dwie kolejne metody wczaj i wyczaj akcj oraz sprawdzaj, czy akcja jest aktualnie
wczona. Kiedy akcja jest zwizana z menu lub paskiem narzdzi i jest wyczona, odpo-
wiadajca jej opcja ma kolor szary.

Metody

putValue

i

getValue

zapisuj i pobieraj pary nazwa – warto z obiektu akcji. Nazwy

akcji i ikony s zapisywane w obiektach akcji za pomoc dwóch predefiniowanych a cu-
chów:

Action.NAME

i

Action.SMALL_ICON

:

action.putValue(Action.NAME, "Niebieski");
action.putValue(Action.SMALL_ICON, new ImageIcon("blue-ball.gif"));

Tabela 8.1 przedstawia zestawienie wszystkich predefiniowanych nazw tablicowych akcji.

background image

Rozdzia 8.

Q

Obsuga zdarze

375

Tabela 8.1. Predefiniowane stae interfejsu Action

Nazwa

Warto

NAME

Nazwa akcji — wywietlana na przyciskach i elementach menu.

SMALL_ICON

Maa ikona — moe by wywietlana na przyciskach, pasku narzdzi
lub elementach menu.

SHORT_DESCRIPTION

Krótki opis ikony — wywietlany w etykiecie narzdzia.

LONG_DESCRIPTION

Dugi opis ikony — do uytku w pomocy internetowej. aden komponent
Swinga nie uywa tej wartoci.

MNEMONIC_KEY

Skrót akcji — wywietlany na elementach menu (zobacz rozdzia 9.).

ACCELERATOR_KEY

Skrót klawiaturowy. aden komponent Swinga nie uywa tej wartoci.

ACTION_COMMAND_KEY

Uywana w przestarzaej ju metodzie

registerKeyboardAction

.

DEFAULT

Wasno pasujca do wszystkiego. aden komponent Swinga nie uywa
tej wartoci.

Jeli obiekt akcji jest dodawany do menu lub paska narzdzi, jego nazwa i ikona s auto-
matycznie pobierane i wywietlane w menu lub na pasku narzdzi. Warto wasnoci

SHORT_DESCRIPTION

zamienia si w dymek opisujcy narzdzie.

Pozostae dwie metody interfejsu

Action

umoliwiaj powiadamianie innych obiektów, zwasz-

cza menu i pasków narzdzi, które s ródem akcji, o zmianach wasnoci obiektu akcji.
Jeli na przykad menu jest dodawane jako obiekt nasuchujcy zmian wasnoci obiektu akcji
i obiekt ten zostanie nastpnie wyczony, menu zostanie wywoane, a nazwa akcji bdzie
szara. Obiekty nasuchu zmian wasnoci s ogóln konstrukcj stanowic cz modelu
komponentów JavaBean. Wicej informacji na temat Beanów i ich wasnoci znajduje si
w drugim tomie.

Nie naley zapomina , e

Action

to interfejs, a nie klasa. Kada klasa implementujca go

musi definiowa wszystkie siedem metod, które opisalimy. Na szczcie jaki dobry czowiek
napisa klas o nazwie

AbstractAction

, która implementuje wszystkie niniejsze metody

z wyjtkiem

actionPerformed

. Klasa ta zajmuje si zapisywaniem par nazwa – warto

i zarzdzaniem obiektami nasuchujcymi zmian wasnoci. Wystarczy rozszerzy klas

AbstractAction

i zdefiniowa metod

actionPerformed

.

Utworzymy obiekt wykonujcy polecenia zmiany koloru. Zapiszemy nazw polecenia, iko-
n i dany kolor. Kolor zapiszemy w tablicy par nazwa – warto dostarczanej przez klas

AbstractAction

. Poniej znajduje si kod ródowy klasy

ColorAction

. Konstruktor ustawia

pary nazwa – warto , a metoda

actionPerformed

wykonuje akcj zmiany koloru.

public class ColorAction extends AbstractAction
{
public ColorAction(String name, Icon icon, Color c)
{
putValue(Action.NAME, name);
putValue(Action.SMALL_ICON, icon);
putValue("color", c);
putValue(Action.SHORT_DESCRIPTION, "Ustaw kolor panelu na " + name.toLowerCase());
}

background image

376

Java. Podstawy

public void actionPerformed(ActionEvent event)
{
Color c = (Color) getValue("color");
buttonPanel.setBackground(c);
}
}

Nasz przykadowy program tworzy trzy obiekty niniejszej klasy, np.:

Action blueAction = new ColorAction("Niebieski", new ImageIcon("blue-ball.gif"),
´Color.BLUE);

Teraz konieczne jest zwizanie akcji z przyciskiem. Jest to atwe, poniewa moemy uy
konstruktora

JButton

, który przyjmuje obiekt typu

Action

.

JButton blueButton = new JButton(blueAction);

Konstruktor odczytuje nazw i ikon z akcji, ustawia krótki opis jako etykiet oraz ustawia
akcj jako suchacza. Ikony i etykiet przedstawia rysunek 8.6.

Rysunek 8.6.
Przyciski
zawieraj ikony
z obiektów akcji

W kolejnym rozdziale wykaemy, e tak samo atwe jest dodawanie tej samej akcji do menu.

Na koniec przypiszemy obiekty akcji do klawiszy, dziki czemu akcje te bd wykonywane,
kiedy uytkownik wpisze polecenia z klawiatury. Kojarzenie akcji z klawiszami naley za-
cz od wygenerowania obiektu klasy

KeyStroke

. Klasa ta opakowuje opis klawisza.

Do utworzenia obiektu typu

KeyStroke

nie uywa si konstruktora, ale statycznej metody

getKeyStroke

klasy

KeyStroke

.

KeyStroke ctrlBKey = KeyStroke.getKeyStroke("ctrl N");

Do zrozumienia nastpnego etapu potrzebna jest znajomo pojcia aktywnoci komponentu
(ang. keyboard focus). Interfejs uytkownika moe skada si z wielu przycisków, menu,
pasków przewijania i innych komponentów. Kiedy zostanie nacinity klawisz, zdarzenie to
zostaje wysane do aktywnego komponentu. Komponent ten jest z reguy (cho nie zawsze)
w jaki sposób wizualnie wyróniony. Na przykad w stylu Javy tekst na aktywnym przycisku
ma cienk obwódk. Fokus (aktywno komponentu) mona przenosi na róne kompo-
nenty za pomoc klawisza Tab. Nacinicie klawisza spacji powoduje kliknicie aktywnego
przycisku. Inne klawisze wywouj inne dziaania. Na przykad klawisze strzaek mog ste-
rowa paskiem przewijania.

Jednak my nie chcemy wysya zdarzenia nacinicia klawisza do aktywnego komponentu.
W przeciwnym razie kady przycisk musiaby zna procedur obsugi kombinacji klawiszy
Ctrl+Y, Ctrl+B i Ctrl+R.

background image

Rozdzia 8.

Q

Obsuga zdarze

377

Jest to bardzo powszechny problem. Jednak projektanci biblioteki Swing znaleli dla niego
proste rozwizanie. Kady

JComponent

posiada trzy mapy wejcia (ang. input maps), z których

kada odwzorowuje obiekty

KeyStroke

na zwizane z nimi akcje. Mapy te odpowiadaj trzem

rónym sytuacjom (zobacz tabela 8.2).

Tabela 8.2. Mapy klawiaturowe

Znacznik

Wywouje dziaanie, gdy

WHEN_FOCUSED

komponent jest aktywny;

WHEN_ANCESTOR_OF_FOCUSED_COMPONENT

komponent zawiera komponent aktywny;

WHEN_IN_FOCUSED_WINDOW

komponent znajduje si w tym samym oknie co komponent
aktywny.

Niniejsze mapy s sprawdzane w nastpujcej kolejnoci w wyniku nacinicia klawisza:

1.

Sprawdzenie mapy

WHEN_FOCUSED

aktywnego komponentu. Jeli dany skrót

klawiaturowy istnieje, nastpuje wykonanie powizanego z nim dziaania.
Jeli dziaanie zostaje wykonane, nastpuje zatrzymanie sprawdzania warunków.

2.

Nastpuje sprawdzenie map

WHEN_ANCESTOR_OF_FOCUSED_COMPONENT

aktywnego

komponentu, a nastpnie jego komponentów nadrzdnych. Gdy zostanie znaleziona
mapa z danym skrótem klawiaturowym, nastpuje wykonanie dziaania.
Jeli dziaanie zostaje wykonane, nastpuje zatrzymanie sprawdzania warunków.

3.

Odszukanie wszystkich widocznych i wczonych komponentów w aktywnym oknie,
w których mapie

WHEN_IN_FOCUSED_WINDOW

znajduje si dany skrót klawiaturowy.

Umoliwienie tym komponentom (w kolejnoci zgodnej z rejestracj zdarze
nacinicia klawisza) wykonania odpowiednich dziaa . Po wykonaniu pierwszego
dziaania nastpuje zatrzymanie przetwarzania. Ta cz procesu moe by ródem
problemów, jeli dany skrót klawiaturowy pojawia si w wicej ni jednej mapie

WHEN_IN_FOCUSED_WINDOW

.

Map wejcia komponentu tworzy si za pomoc metody

getInputMap

. Na przykad:

InputMap imap = panel.getInputMap(JComponent.WHEN_FOCUSED);

Warunek

WHEN_FOCUSED

powoduje, e ta mapa bdzie sprawdzana, gdy komponent jest ak-

tywny. Nam potrzebna jest inna mapa. Aktywny jest jeden z przycisków, nie panel. Do wsta-
wienia skrótów klawiszy zmieniajcych kolor nadaje si jedna z pozostaych dwóch map.
W naszym przykadowym programie uyjemy mapy

WHEN_ANCESTOR_OF_FOCUSED_COMPONENT

.

Klasa

InputMap

nie odwzorowuje bezporednio obiektów

KeyStroke

w postaci obiektów

Action

. W zamian odwzorowuje w postaci dowolnych obiektów, a druga mapa, zaimple-

mentowana w klasie

ActionMap

, mapuje obiekty na akcje. Dziki temu atwiej jest wspódzie-

li te same akcje przez skróty klawiaturowe pochodzce z rónych map wejcia.

A zatem kady komponent posiada trzy mapy wejcia i jedn map akcji (ang. action map).
Aby je powiza , trzeba wymyli nazwy dla akcji. Klawisz mona powiza z akcj w na-
stpujcy sposób:

background image

378

Java. Podstawy

imap.put(KeyStroke.getKeyStroke("ctrl Z"), "panel.yellow");
ActionMap amap = panel.getActionMap();
amap.put("panel.yellow", yellowAction);

W przypadku akcji niewykonujcej adnych dziaa zwyczajowo stosuje si a cuch

none

.

W ten sposób mona atwo dezaktywowa klawisz:

imap.put(KeyStroke.getKeyStroke("ctrl C"), "none");

Dokumentacja JDK zaleca stosowanie jako klucza akcji jej nazwy. Naszym zdaniem
nie jest to dobre rozwizanie. Nazwa akcji jest wywietlana na przyciskach i ele-

mentach menu, w zwizku z czym moe si zmienia w zalenoci od kaprysu projek-
tanta interfejsu oraz moe by przetumaczona na wiele jzyków. Takie niestae acu-
chy nie s dobrym wyborem w przypadku klawiszy wyszukiwania. Zalecamy wymylenie
nazw akcji niezalenych od wywietlanych nazw.

Poniej znajduje si zestawienie dziaa , które trzeba wykona , aby wywoa to samo dziaa-
nie w odpowiedzi na zdarzenie nacinicia przycisku, wyboru elementu z menu lub nacini-
cia klawisza:

1.

Utwórz podklas klasy

AbstractAction

. Mona uy tej samej klasy dla wielu

spokrewnionych akcji.

2.

Utwórz obiekt powyszej klasy akcji.

3.

Utwórz przycisk lub element menu z obiektu powyszej klasy akcji. Konstruktor
odczyta etykiet i ikon z tego obiektu.

4.

W przypadku akcji uruchamianych przez nacinicie klawisza konieczne jest
wykonanie dodatkowych czynnoci. Najpierw naley zlokalizowa komponent
najwyszego poziomu w oknie, np. panel zawierajcy wszystkie pozostae elementy.

5.

Pobierz map

WHEN_ANCESTOR_OF_FOCUSED_COMPONENT

komponentu najwyszego

poziomu. Utwórz obiekt klasy

KeyStroke

reprezentujcy odpowiedni skrót

klawiaturowy. Utwórz obiekt bdcy kluczem dziaania, np. a cuch opisujcy
akcj. Wstaw niniejsz par danych (klawisz, klucz dziaania) do mapy wejcia.

6.

Pobierz map akcji komponentu najwyszego poziomu. Dodaj par klucz akcji
– obiekt akcji do tej mapy.

Listing 8.3 przedstawia kompletny kod programu mapujcego przyciski i klawisze na obiekty
akcji. Mona go wypróbowa — kliknicie jednego z przycisków lub nacinicie kombinacji
klawiszy Ctrl+Z, Ctrl+N lub Ctrl+C spowoduje zmian koloru panelu.

Listing 8.3. ActionTest.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
* @version 1.33 2007-06-12
* @author Cay Horstmann
*/

background image

Rozdzia 8.

Q

Obsuga zdarze

379

public class ActionTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
ActionFrame frame = new ActionFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}

/**
* Ramka z panelem, który demonstruje akcje zmiany koloru.
*/
class ActionFrame extends JFrame
{
public ActionFrame()
{
setTitle("ActionTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

buttonPanel = new JPanel();

// Definicje akcji.
Action yellowAction = new ColorAction(" óty", new ImageIcon("yellow-ball.gif"),
Color.YELLOW);
Action blueAction = new ColorAction("Niebieski", new ImageIcon("blue-ball.gif"),

´Color.BLUE);

Action redAction = new ColorAction("Czerwony", new ImageIcon("red-ball.gif"),

´Color.RED);

// Dodanie przycisków dla akcji.
buttonPanel.add(new JButton(yellowAction));
buttonPanel.add(new JButton(blueAction));
buttonPanel.add(new JButton(redAction));

// Dodanie panelu do ramki.
add(buttonPanel);

// Powizanie klawiszy Z, N i C z nazwami.
InputMap imap = buttonPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_

´COMPONENT);

imap.put(KeyStroke.getKeyStroke("ctrl Z"), "panel.yellow");
imap.put(KeyStroke.getKeyStroke("ctrl N"), "panel.blue");
imap.put(KeyStroke.getKeyStroke("ctrl C"), "panel.red");

// Powizanie nazw z akcjami.
ActionMap amap = buttonPanel.getActionMap();
amap.put("panel.yellow", yellowAction);
amap.put("panel.blue", blueAction);
amap.put("panel.red", redAction);
}

background image

380

Java. Podstawy

public class ColorAction extends AbstractAction
{
/**
* Tworzy akcj zmiany koloru.
* @param name nazwa, która pojawi si na przycisku
* @param icon ikona, która pojawi si na przycisku
* @param c kolor ta
*/
public ColorAction(String name, Icon icon, Color c)
{
putValue(Action.NAME, name);
putValue(Action.SMALL_ICON, icon);
putValue(Action.SHORT_DESCRIPTION, "Ustaw kolor panelu na " + name.

´toLowerCase());

putValue("color", c);
}

public void actionPerformed(ActionEvent event)
{
Color c = (Color) getValue("color");
buttonPanel.setBackground(c);
}
}

private JPanel buttonPanel;

public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}

javax.swing.Action

1.2

Q

boolean isEnabled()

Q

void setEnabled(boolean b)

Pobiera lub ustawia wasno

enabled

akcji.

Q

void putValue(String key, Object value)

Wstawia par nazwa – warto do obiektu akcji.

Parametry:

key

Nazwa wasnoci, która ma zosta zapisana z obiektem
akcji. Moe to by dowolny a cuch, ale jest kilka nazw
o z góry zdefiniowanym znaczeniu — zobacz tabel 8.1
na stronie 375.

value

Obiekt powizany z nazw.

Q

Object getValue(String key)

Zwraca warto z zapisanej pary nazwa – warto .

background image

Rozdzia 8.

Q

Obsuga zdarze

381

javax.swing.KeyStroke

1.2

Q

static KeyStroke getKeyStroke(String description)

Tworzy skrót klawiaturowy z czytelnego dla czowieka opisu (cigu a cuchów
rozdzielonych spacjami). Opis zaczyna si od zera lub wikszej liczby
modyfikatorów

shift control ctrl meta alt altGraph

, a ko czy si a cuchem

typed

i a cuchem skadajcym si z jednego znaku (na przykad

typed a

)

lub opcjonalnym specyfikatorem zdarzenia (

pressed

— domylny lub

released

)

i kodem klawisza. Kod klawisza, jeli ma przedrostek

VK_

, powinien odpowiada

staej

KeyEvent

, na przykad

INSERT

odpowiada

KeyEvent.VK_INSERT

.

javax.swing.JComponent

1.2

Q

ActionMap getActionMap()

1.3

Zwraca map wic klucze mapy akcji (które mog by dowolnymi obiektami)
z obiektami klasy

Action

.

Q

InputMap getInputMap(int flag)

1.3

Pobiera map wejcia, która odwzorowuje klawisze w postaci kluczy mapy akcji.

Parametry:

flag

Warunek okrelajcy, kiedy element aktywny ma wywoa
akcj — jedna z wartoci z tabeli 8.2 na stronie 377.

Zdarzenia generowane przez mysz

Takie zdarzenia jak kliknicie przycisku lub elementu w menu za pomoc myszy nie wyma-
gaj pisania procedur obsugi. Niniejsze zdarzenia s obsugiwane automatycznie przez
róne elementy interfejsu uytkownika. Aby jednak umoliwi rysowanie za pomoc myszy,
konieczne jest przechwycenie zdarze ruchu, kliknicia i przecigania myszy.

W niniejszym podrozdziale prezentujemy prosty edytor grafiki pozwalajcy umieszcza , prze-
suwa i usuwa kwadraty z obszaru roboczego (zobacz rysunek 8.7).

Rysunek 8.7.
Program
obsugujcy
zdarzenia myszy

background image

382

Java. Podstawy

Kiedy uytkownik nacinie przycisk myszy, wywoywane s trzy metody nasuchujce:

mousePressed

po naciniciu przycisku,

mouseReleased

po zwolnieniu przycisku myszy

i

mouseClicked

. Jeli w sferze zainteresowa le wycznie pene kliknicia, pierwsze dwie

z wymienionych metod mona pomin . Wywoujc metody

getX

i

getY

na rzecz obiektu

klasy

MouseEvent

, mona sprawdzi wspórzdne

x

i

y

wskanika myszy w chwili klik-

nicia. Do rozrónienia pojedynczych, podwójnych i potrójnych (!) klikni suy metoda

getClickCount

.

Niektórzy projektanci interfejsów tworz kombinacje klawiszy poczone z klikniciami
myszk, np. Ctrl+Shift+kliknicie. Naszym zdaniem jest to postpowanie niegodne nala-
dowania. Osoby, które nie zgadzaj si z nasz opini, moe przekona fakt, e sprawdzanie
przycisków myszy i klawiszy specjalnych jest niezwykle zagmatwanym zadaniem — nieba-
wem si o tym przekonamy.

Aby sprawdzi , które modyfikatory zostay ustawione, naley uy maski bitowej. W ory-
ginalnym API dwie maski przycisków s równowane z maskami klawiszy specjalnych,
mianowicie:

BUTTON2_MASK == ALT_MASK
BUTTON3_MASK == META_MASK

Zrobiono tak, aby uytkownicy posiadajcy myszk z jednym przyciskiem mogli nalado-
wa pozostae przyciski za pomoc klawiszy specjalnych (ang. modifier keys). Od Java SE 1.4
zaproponowano jednak inn metod. Od tej pory istniej nastpujce maski:

BUTTON1_DOWN_MASK
BUTTON2_DOWN_MASK
BUTTON3_DOWN_MASK
SHIFT_DOWN_MASK
CTRL_DOWN_MASK
ALT_DOWN_MASK
ALT_GRAPH_DOWN_MASK
META_DOWN_MASK

Metoda

getModifiersEx

zwraca dokadne informacje o przyciskach myszy i klawiszach spe-

cjalnych uytych w zdarzeniu myszy.

Pamitajmy, e maska

BUTTON3_DOWN_MASK

w systemie Windows sprawdza prawy (nie gówny)

przycisk myszy. Na przykad poniszy fragment programu sprawdza, czy prawy przycisk
myszy jest wcinity:

if ((event.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) != 0)
. . . // procedury obsugi zdarzenia kliknicia prawym przyciskiem myszy

W przykadowym programie definiujemy zarówno metod

mousePressed

, jak i

mouseClicked

.

Jeli uytkownik kliknie piksel nieznajdujcy si w obrbie adnego z narysowanych kwa-
dratów, zostanie dodany nowy kwadrat. Dziaanie to zostao zaimplementowane w metodzie

mousePressed

, a wic kwadrat pojawia si natychmiast po klikniciu, przed zwolnieniem

przycisku myszy. Dwukrotne kliknicie przyciskiem myszy w obrbie narysowanego kwa-
dratu powoduje jego usunicie. Implementacja tej funkcji zostaa umieszczona w metodzie

mouseClicked

, poniewa konieczne jest sprawdzenie liczby klikni :

background image

Rozdzia 8.

Q

Obsuga zdarze

383

public void mousePressed(MouseEvent event)
{
current = find(event.getPoint());
if (current == null) // nie w obrbie adnego kwadratu
add(event.getPoint());
}

public void mouseClicked(MouseEvent event)
{
current = find(event.getPoint());
if (current != null && event.getClickCount() >= 2)
remove(current);
}

Kiedy kursor myszy przesuwa si nad oknem, odbiera ono stay strumie zdarze ruchu
myszy. Zauwamy, e s osobne interfejsy

MouseListener

i

MouseMotionListener

. Wyrónio-

no je z chci zwikszenia efektywnoci. Kiedy uytkownik przesuwa mysz, powstaje caa
masa zdarze dotyczcych tej czynnoci. Obiekt nasuchujcy, który oczekuje na kliknicia,
nie jest zajmowany przez nieinteresujce go zdarzenia ruchu.

Nasz testowy program przechwytuje zdarzenia ruchu i w odpowiedzi na nie zmienia wygld
kursora (na krzyyk). Odpowiedzialna jest za to metoda

getPredefinedCursor

z klasy

Cursor

.

Tabela 8.3 przedstawia stae podawane jako argument wspomnianej funkcji oraz reprezento-
wane przez nie kursory w systemie Windows.

Tabela 8.3. Przykadowe kursory

Ikona

Staa

Ikona

Staa

DEFAULT_CURSOR

NE_RESIZE_CURSOR

CROSSHAIR_CURSOR

E_RESIZE_CURSOR

HAND_CURSOR

SE_RESIZE_CURSOR

MOVE_CURSOR

S_RESIZE_CURSOR

TEXT_CURSOR

SW_RESIZE_CURSOR

WAIT_CURSOR

W_RESIZE_CURSOR

N_RESIZE_CURSOR

NW_RESIZE_CURSOR

Poniej znajduje si kod ródowy metody

mouseMoved

z klasy

MouseMotionListener

zdefi-

niowanej w naszym przykadowym programie:

public void mouseMoved(MouseEvent event)
{
if (find(event.getPoint()) == null)
setCursor(Cursor.getDefaultCursor());
else
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}

background image

384

Java. Podstawy

Mona zdefiniowa wasne typy kursorów. Suy do tego metoda

createCustom-

´Cursor z klasy Toolkit:

Toolkit tk = Toolkit.getDefaultToolkit();
Image img = tk.getImage("dynamite.gif");
Cursor dynamiteCursor = tk.createCustomCursor(img, new Point(10, 10), "dynamite

´stick");

Pierwszy argument niniejszej metody okrela plik graficzny przedstawiajcy kursor. Drugi
wyznacza przesunicie punktu aktywnego kursora. Trzeci jest acuchem opisujcym
kursor. acuch ten moe suy zwikszeniu dostpnoci. Na przykad program czytajcy
z ekranu uywany przez osob niedowidzc moe przeczyta opis takiego kursora.

Jeli w czasie przesuwania myszy uytkownik kliknie jej przycisk, generowane s wywoania
metody

mouseDragged

zamiast

mouseMoved

. Nasz przykadowy program zezwala na przeciga-

nie kwadratów pod kursorem. Efekt ten uzyskalimy, aktualizujc pooenie przeciganego
kwadratu, tak aby jego rodek znajdowa si w tym samym miejscu co punkt centralny myszki.
Nastpnie ponownie rysujemy obszar roboczy, aby ukaza nowe pooenie kursora myszy.

public void mouseDragged(MouseEvent event)
{
if (current != null)
{
int x = event.getX();
int y = event.getY();

current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);
repaint();
}

Metoda

mouseMoved jest wywoywana tylko wtedy, gdy kursor znajduje si w ob-

rbie komponentu. Natomiast metoda

mouseDragged jest wywoywana nawet wtedy,

gdy kursor opuci komponent.

Istniej jeszcze dwie inne metody obsugujce zdarzenia myszy:

mouseEntered

i

mouseExited

.

S one wywoywane, gdy kursor myszy wchodzi do komponentu lub go opuszcza.

Na zako czenie wyjanimy sposób nasuchiwania zdarze generowanych przez mysz. Klik-
nicia przyciskiem myszy s raportowane przez metod

mouseClicked

nalec do interfejsu

MouseListener

. Poniewa wiele aplikacji korzysta wycznie z klikni myszk i wystpuj

one bardzo czsto, zdarzenia ruchu myszy i przecigania zostay zdefiniowane w osobnym
interfejsie o nazwie

MouseMotionListener

.

W naszym programie interesuj nas oba rodzaje zdarze generowanych przez mysz. Zdefi-
niowalimy dwie klasy wewntrzne o nazwach

MouseHandler

i

MouseMotionHandler

. Pierwsza

z nich jest podklas klasy

MouseAdapter

, poniewa definiuje tylko dwie z piciu metod interfej-

su

MouseListener

. Klasa

MouseMotionHandler

implementuje interfejs

MouseMotionListener

,

co znaczy, e zawiera definicje obu jego metod. Listing 8.4 przedstawia kod ródowy oma-
wianego programu.

background image

Rozdzia 8.

Q

Obsuga zdarze

385

Listing 8.4. MouseTest.java

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.awt.geom.*;
import javax.swing.*;

/**
* @version 1.32 2007-06-12
* @author Cay Horstmann
*/
public class MouseTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
MouseFrame frame = new MouseFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}

/**
* Ramka zawierajca panel testujcy dziaania myszy.
*/
class MouseFrame extends JFrame
{
public MouseFrame()
{
setTitle("MouseTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

// Dodanie komponentu do ramki.

MouseComponent component = new MouseComponent();
add(component);
}

public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}

/**
* Komponent z dziaaniami myszy, do którego mona dodawa (lub z którego mona usuwa) kwadraty.
*/
class MouseComponent extends JComponent
{
public MouseComponent()
{
squares = new ArrayList<Rectangle2D>();
current = null;

background image

386

Java. Podstawy

addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseMotionHandler());
}

public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;

// Rysowanie wszystkich kwadratów.
for (Rectangle2D r : squares)
g2.draw(r);
}

/**
* Znajduje pierwszy kwadrat zawierajcy punkt.
* @param p punkt
* @return pierwszy kwadrat zawierajcy punkt p
*/
public Rectangle2D find(Point2D p)
{
for (Rectangle2D r : squares)
{
if (r.contains(p)) return r;
}
return null;
}

/**
* Dodaje kwadrat do zbioru.
* @param p rodek kwadratu
*/
public void add(Point2D p)
{
double x = p.getX();
double y = p.getY();

current = new Rectangle2D.Double(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH,
SIDELENGTH);
squares.add(current);
repaint();
}

/**
* Usuwa kwadrat ze zbioru.
* @param s kwadrat, który ma by usunity
*/
public void remove(Rectangle2D s)
{
if (s == null) return;
if (s == current) current = null;
squares.remove(s);
repaint();
}

private static final int SIDELENGTH = 10;
private ArrayList<Rectangle2D> squares;
private Rectangle2D current;

background image

Rozdzia 8.

Q

Obsuga zdarze

387

// Kwadrat zawierajcy kursor myszy.

private class MouseHandler extends MouseAdapter
{
public void mousePressed(MouseEvent event)
{
// Dodanie nowego kwadratu, jeli kursor nie jest wewntrz innego kwadratu.
current = find(event.getPoint());
if (current == null) add(event.getPoint());
}

public void mouseClicked(MouseEvent event)
{
// Usunicie kwadratu w wyniku jego dwukrotnego kliknicia.
current = find(event.getPoint());
if (current != null && event.getClickCount() >= 2) remove(current);
}
}

private class MouseMotionHandler implements MouseMotionListener
{
public void mouseMoved(MouseEvent event)
{
// Ustawienie kursora na krzyyk, jeli znajduje si wewntrz
// kwadratu.

if (find(event.getPoint()) == null) setCursor(Cursor.getDefaultCursor());
else setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}

public void mouseDragged(MouseEvent event)
{
if (current != null)
{
int x = event.getX();
int y = event.getY();

// Przecignicie aktualnego kwadratu w celu wycentrowania go w punkcie (x, y).
current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH,

´SIDELENGTH);

repaint();
}
}
}
}

java.awt.event.MouseEvent

1.1

Q

int getX()

Q

int getY()

Q

Point getPoint()

Zwraca wspórzdne

x

(pozioma) i

y

(pionowa) lub punkt, w którym miao miejsce

zdarzenie, mierzc od lewego górnego rogu komponentu bdcego ródem
zdarzenia.

background image

388

Java. Podstawy

Q

int getClickCount()

Zwraca liczb kolejnych klikni przyciskiem myszy zwizanych z danym
zdarzeniem (odstp czasu oddzielajcy zdarzenia okrelane jako kolejne zaley
od systemu).

java.awt.event.InputEvent

1.1

Q

int getModifiersEx()

1.4

Zwraca rozszerzone modyfikatory zdarzenia. Do sprawdzania zwróconych
wartoci su nastpujce maski:

BUTTON1_DOWN_MASK
BUTTON2_DOWN_MASK
BUTTON3_DOWN_MASK
SHIFT_DOWN_MASK
CTRL_DOWN_MASK
ALT_DOWN_MASK
ALT_GRAPH_DOWN_MASK
META_DOWN_MASK

Q

static String getModifiersExText(int modifiers)

1.4

Zwraca a cuch typu

Shift+Button1

opisujcy rozszerzone modyfikatory w

danym zbiorze znaczników.

java.awt.Toolkit

1.0

Q

public Cursor createCustomCursor(Image image, Point hotSpot, String name)

1.2

Tworzy nowy obiekt niestandardowego kursora.

Parametry:

image

Obraz reprezentujcy kursor

hotSpot

Punkt centralny kursora (na przykad ko cówka strzaki
lub rodek krzyyka)

name

Opis kursora wspomagajcy dostpno w specjalnych
rodowiskach

java.awt.Component

1.0

Q

public void setCursor(Cursor cursor)

1.1

Ustawia obraz kursora na okrelony kursor.

Hierarchia zdarze w bibliotece AWT

Majc ju pewne rozeznanie w temacie obsugi zdarze , na zako czenie niniejszego rozdziau
zrobimy krótki przegld architektury obsugi zdarze biblioteki

AWT

.

background image

Rozdzia 8.

Q

Obsuga zdarze

389

Jak wspominalimy wczeniej, zdarzenia w Javie s obsugiwane w metodologii obiektowej,
a wszystkie zdarzenia pochodz od klasy

EventObject

z pakietu

java.util

(nazw wspólnej

nadklasy nie jest

Event

, poniewa tak nazw nosi klasa zdarze w starym modelu zdarze

— mimo e model ten jest obecnie odradzany, jego klasy nadal wchodz w skad biblio-
teki Javy).

Klasa

EventObject

posiada podklas

AWTEvent

bdc nadklas wszystkich klas zdarzenio-

wych

AWT

. Rysunek 8.8 przedstawia diagram dziedziczenia zdarze

AWT

.

Rysunek 8.8. Diagram dziedziczenia klas zdarzeniowych AWT

Niektóre komponenty Swing generuj obiekty zdarzeniowe jeszcze innych typów zdarze .
Rozszerzaj one bezporednio klas

EventObject

, a nie

AWTEvent

.

background image

390

Java. Podstawy

Obiekty zdarzeniowe zawieraj informacje o zdarzeniach przesyanych przez ródo zda-
rze do swoich suchaczy. W razie potrzeby mona przeanalizowa obiekty zdarzeniowe,
które zostay przekazane do obiektów nasuchujcych, co zrobilimy w przykadzie z przy-
ciskiem za pomoc metod

getSource

i

getActionCommands

.

Niektóre klasy zdarzeniowe

AWT

s dla programisty Javy bezuyteczne. Na przykad biblio-

teka

AWT

wstawia do kolejki zdarze obiekty

PaintEvent

, ale obiekty te nie s dostarczane

do suchaczy. Programici Javy nie nasuchuj zdarze rysowania. Przesaniaj oni metod

paintComponent

, aby móc kontrolowa ponowne rysowanie. Ponadto

AWT

generuje pewne

zdarzenia, które s potrzebne tylko programistom systemowym. Nie opisujemy tych specjal-
nych typów zdarze .

Zdarzenia semantyczne i niskiego poziomu

Biblioteka

AWT

rozrónia zdarzenia niskiego poziomu i zdarzenia semantyczne. Zdarzenie

semantyczne jest dzieem uytkownika ( jest to np. kliknicie przycisku). Dlatego zdarzenie

ActionEvent

jest zdarzeniem semantycznym. Zdarzenia niskiego poziomu to takie zdarze-

nia, które umoliwiaj zaistnienie zdarze semantycznych. W przypadku kliknicia przyci-
sku jest to jego nacinicie, szereg ruchów mysz i zwolnienie (ale tylko jeli zwolnienie
nastpi w obrbie przycisku). Moe to by nacinicie klawisza majce miejsce po wybra-
niu przycisku przez uytkownika za pomoc klawisza Tab i nacinicia go za pomoc spa-
cji. Podobnie semantycznym zdarzeniem jest przesunicie paska przewijania, a ruch mysz
jest zdarzeniem niskiego poziomu.

Poniej znajduje si lista najczciej uywanych klas zdarze semantycznych pakietu

java.awt.event

:

Q

ActionEvent

— kliknicie przycisku, wybór elementu z menu, wybór elementu

listy, nacinicie klawisza Enter w polu tekstowym.

Q

AdjustmentEvent

— przesunicie paska przewijania.

Q

ItemEvent

— wybór jednego z pól do wyboru lub elementów listy.

Do najczciej uywanych klas zdarze niskiego poziomu zaliczaj si:

Q

KeyEvent

— nacinicie lub zwolnienie klawisza.

Q

MouseEvent

— nacinicie lub zwolnienie przycisku myszy, poruszenie

lub przecignicie mysz.

Q

MouseWheelEvent

— pokrcenie kókiem myszy.

Q

FocusEvent

— uaktywnienie lub dezaktywacja elementu.

Q

WindowEvent

— zmiana stanu okna.

Niniejszych zdarze nasuchuj nastpujce interfejsy:

ActionListener
AdjustmentListener
FocusListener
ItemListener

background image

Rozdzia 8.

Q

Obsuga zdarze

391

KeyListener
MouseListener
MouseMotionListener
MouseWheelListener
WindowListener
WindowFocusListener
WindowStateListener

Niektóre interfejsy nasuchujce

AWT

, te zawierajce wicej ni jedn metod, posiadaj od-

powiadajce im klasy adaptacyjne, które implementuj wszystkie ich metody (pozostae inter-
fejsy maj tylko jedn metod, a wic utworzenie dla nich klas adaptacyjnych nie daoby
adnych korzyci). Ponisze klasy adaptacyjne s czsto uywane:

FocusAdapter
KeyAdapter
MouseAdapter
MouseMotionAdapter
WindowAdapter

Tabela 8.4 przedstawia najwaniejsze interfejsy nasuchowe, zdarzenia i róda zdarze bi-
blioteki AWT.

Tabela 8.4. Obsuga zdarze

Interfejs

Metody

Parametry/

metody dostpu

Zdarzenia

generowane przez

ActionListener

actionPerformed

ActionEvent

getActionCommand

getModifiers

AbstractButton

JComboBox

JTextField

Timer

AdjustmentListener

adjustmentValueChanged

AdjustmentEvent

getAdjustable

getAdjustmentType

getValue

JScrollbar

ItemListener

itemStateChanged

ItemEvent

getItem

getItemSelectable

getStateChange

AbstractButton

JComboBox

FocusListener

focusGained

focusLost

FocusEvent

isTemporary

Component

KeyListener

keyPressed

keyReleased

keyTyped

KeyEvent

getKeyChar

getKeyCode

getKeyModifiersText

getKeyText

isActionText

Component

background image

392

Java. Podstawy

Tabela 8.4. Obsuga zdarze (cig dalszy)

Interfejs

Metody

Parametry/

metody dostpu

Zdarzenia

generowane przez

MouseListener

mousePressed

mouseReleased

mouseEntered

mouseExited

mouseClicked

MouseEvent

getClickCount

getX

getY

getPoint

translatePoint

Component

MouseMotionListener

mouseDragged

mouseMoved

MouseEvent

Component

MouseWheelListener

MouseWheelMoved

MouseWheelEvent

getWheelRotation

getScrollAmount

Component

WindowListener

windowClosing

windowOpened

windowIconified

windowDeiconified

windowClosed

windowActivated

windowDeactivated

WindowEvent

getWindow

Window

WindowFocusListener

windowGainedFocus

windowLostFocus

WindowEvent

getOppositeWindow

Window

WindowStateListener

windowStateChanged

WindowEvent

getOldState

getNewState

Window

Pakiet

javax.swing.event

zawiera dodatkowe zdarzenia specyficzne dla komponentów Swinga.

Niektóre z nich opisujemy w nastpnym rozdziale.

Na tym zako czymy opis technik obsugi zdarze

AWT

. W nastpnym rozdziale nauczymy

si wykorzystywa najpopularniejsze komponenty Swinga oraz szczegóowo przeanalizu-
jemy generowane przez nie zdarzenia.


Wyszukiwarka

Podobne podstrony:
Java Techniki zaawansowane Wydanie VIII(1)
Java Kompendium programisty Wydanie VIII 2
Java Kompendium programisty Wydanie VIII javkp8
Java Kompendium programisty Wydanie VIII
Anatomia PC Wydanie VIII
java 2 podstawy C4KSSGRISP6PU3 Nieznany
Emigracja do USA Wydanie VIII emigra
Anatomia PC Wydanie VIII anatp8

więcej podobnych podstron