Java. Podstawy. Wydanie VIII

48
Wydawnictwo Helion ul. Kociuszki 1c 44-100 Gliwice tel. 032 230 98 63 e-mail: [email protected] 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 nowoci 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 programistw na wiecie. Jednak nie jest to jedyna mocna strona Javy. Warto tu wskaza rwnie¿ 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Œzykw programowania. Ksi„¿ka Java. Podstawy. Wydanie VIII zosta‡a zaktualizowana o wszystkie te elementy, ktre pojawi‡y siŒ w wersji szstej 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„tkw. Dodatkowo bŒdziesz mie mo¿liwo zapoznania siŒ z elementami projektowania i tworzenia interfejsu u¿ytkownika. W ostatnim rozdziale autorzy omwi„ wielow„tkowo oraz sposb zastosowania tego typu rozwi„zaæ w codziennej pracy programisty jŒzyka Java. Podstawy jŒzyka Java Programowanie obiektowe Interfejsy Sposb u¿ycia klas proxy oraz klas wewnŒtrznych Projektowanie interfejsu u¿ytkownika z wykorzystaniem biblioteki Swing Obs‡uga wyj„tkw Wykrywanie i rozwi„zywanie problemw w kodzie Wielow„tkowo Wykorzystaj si‡Œ obiektw. Programowanie obiektowe w jŒzyku Java ma przysz‡o!

description

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

Transcript of Java. Podstawy. Wydanie VIII

Wydawnictwo Helionul. Ko�ciuszki 1c44-100 Gliwicetel. 032 230 98 63e-mail: [email protected]

Java. Podstawy.Wydanie VIIIAutor: Cay S. Horstmann, Gary CornellT³umaczenie: £ukasz PiwkoISBN: 978-83-246-1478-3Tytu³ 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 wszystkiete 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 tworzeniutej platformy. Dowiesz siê, jakie prawa rz¹dz¹ programowaniem obiektowymoraz jak wykorzystaæ interfejsy i obs³ugê wyj¹tków. Dodatkowo bêdziesz mieæ mo¿liwo�æ zapoznania siê z elementami projektowania i tworzenia interfejsu u¿ytkownika. W ostatnim rozdziale autorzy omówi¹ wielow¹tkowo�æ oraz sposób zastosowania tego typu rozwi¹zañ w codziennej pracy programisty jêzyka Java.

� Podstawy jêzyka Java � Programowanie obiektowe � Interfejsy � Sposób u¿ycia klas proxy oraz klas wewnêtrznych � Projektowanie interfejsu u¿ytkownika z wykorzystaniem biblioteki Swing � Obs³uga wyj¹tków � Wykrywanie i rozwi¹zywanie problemów w kodzie � Wielow¹tkowo�æ

Wykorzystaj si³ê obiektów.Programowanie obiektowe w jêzyku Java ma przysz³o�æ!

Spis tre�ci

Podzi�kowania ......................................................................................................................................... 13

Wst�p ........................................................................................................................................................ 15

Rozdzia� 1. Wst�p do Javy ........................................................................................................................21Java jako platforma programistyczna .............................................................................. 21S�owa klucze bia�ej ksi�gi Javy ...................................................................................... 22

Prosty .................................................................................................................... 23Zorientowany obiektowo .......................................................................................... 23Sieciowy ................................................................................................................. 24Niezawodny ............................................................................................................ 24Bezpieczny ............................................................................................................. 25Niezale�ny od architektury ....................................................................................... 26Przeno�ny .............................................................................................................. 26Interpretowany ........................................................................................................ 27Wysokowydajny ....................................................................................................... 27Wielow�tkowy ......................................................................................................... 27Dynamiczny ............................................................................................................ 28

Aplety Javy i internet ..................................................................................................... 28Krótka historia Javy ...................................................................................................... 30G�ówne nieporozumienia dotycz�ce Javy ......................................................................... 32

Rozdzia� 2. �rodowisko programistyczne Javy ................................................................................... 37Instalacja oprogramowania Java Development Kit ........................................................... 38

Pobieranie pakietu JDK ........................................................................................... 38Ustawianie �cie�ki dost�pu ...................................................................................... 40Instalacja bibliotek i dokumentacji ............................................................................ 41Instalacja przyk�adowych programów ......................................................................... 42Drzewo katalogów Javy ............................................................................................ 43

Wybór �rodowiska programistycznego ............................................................................ 44U�ywanie narz�dzi wiersza polece� ................................................................................ 44

Rozwi�zywanie problemów ....................................................................................... 46

4 Java. Podstawy

Praca w zintegrowanym �rodowisku programistycznym .................................................... 47Znajdowanie b��dów kompilacji ................................................................................ 50

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

Rozdzia� 3. Podstawowe elementy j�zyka Java .................................................................................... 59Prosty program w Javie ................................................................................................. 60Komentarze ................................................................................................................. 63Typy danych ................................................................................................................. 64

Typy ca�kowite ........................................................................................................ 64Typy zmiennoprzecinkowe ........................................................................................ 65Typ char ................................................................................................................. 66Typ boolean ............................................................................................................ 68

Zmienne ...................................................................................................................... 69Inicjacja zmiennych ................................................................................................. 70Sta�e ...................................................................................................................... 70

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

�a�cuchy ..................................................................................................................... 79Pod�a�cuchy ........................................................................................................... 79Konkatenacja ......................................................................................................... 80�a�cuchów nie mo�na modyfikowa .......................................................................... 80Porównywanie �a�cuchów ......................................................................................... 82Wspó�rz�dne kodowe znaków i jednostki kodowe ....................................................... 83API String ............................................................................................................... 84Dokumentacja API w internecie ................................................................................ 86Sk�adanie �a�cuchów ............................................................................................... 87

Wej�cie i wyj�cie .......................................................................................................... 90Odbieranie danych wej�ciowych ................................................................................ 90Formatowanie danych wyj�ciowych ........................................................................... 93Zapis do pliku i odczyt ............................................................................................. 97

Przep�yw sterowania ..................................................................................................... 99Zasi�g blokowy ....................................................................................................... 99Instrukcje warunkowe ............................................................................................ 100P�tle .................................................................................................................... 102P�tle o okre�lonej liczbie powtórze� ....................................................................... 107Wybór wielokierunkowy — instrukcja switch ............................................................ 110Instrukcje przerywaj�ce przep�yw sterowania ........................................................... 112

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

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

Spis tre�ci 5

Sortowanie tablicy ................................................................................................. 123Tablice wielowymiarowe ......................................................................................... 127Tablice postrz�pione ............................................................................................. 130

Rozdzia� 4. Obiekty i klasy .....................................................................................................................133Wst�p do programowania zorientowanego obiektowo .................................................... 134

Klasy ................................................................................................................... 134Obiekty ................................................................................................................ 136Identyfikacja klas .................................................................................................. 136Relacje mi�dzy klasami ......................................................................................... 137

U�ywanie klas predefiniowanych .................................................................................. 139Obiekty i zmienne obiektów .................................................................................... 139Klasa GregorianCalendar ....................................................................................... 142Metody udost�pniaj�ce i zmieniaj�ce warto� elementu ........................................... 144

Definiowanie w�asnych klas ......................................................................................... 150Klasa Employee .................................................................................................... 151Stosowanie kilku plików ród�owych ........................................................................ 154Analiza klasy Employee ......................................................................................... 154Pierwsze kroki w tworzeniu konstruktorów ............................................................... 155Parametry jawne i niejawne .................................................................................... 156Korzy�ci z hermetyzacji .......................................................................................... 157Przywileje klasowe ................................................................................................ 159Metody prywatne ................................................................................................... 160Sta�e jako pola klasy ............................................................................................. 161

Pola i metody statyczne .............................................................................................. 161Pola statyczne ...................................................................................................... 161Sta�e statyczne ..................................................................................................... 162Metody statyczne .................................................................................................. 163Metody fabrykuj�ce ............................................................................................... 164Metoda main ........................................................................................................ 165

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

Przeci��anie ......................................................................................................... 173Inicjacja pól warto�ciami domy�lnymi ...................................................................... 174Konstruktor domy�lny ............................................................................................ 175Jawna inicjacja pól ................................................................................................ 175Nazywanie parametrów .......................................................................................... 176Wywo�ywanie innego konstruktora .......................................................................... 177Bloki inicjuj�ce ...................................................................................................... 178Niszczenie obiektów i metoda finalize ..................................................................... 182

Pakiety ...................................................................................................................... 182Importowanie klas ................................................................................................. 183Importy statyczne .................................................................................................. 185Dodawanie klasy do pakietu .................................................................................. 185Zasi�g pakietów .................................................................................................... 188

�cie�ka klas .............................................................................................................. 190Ustawianie �cie�ki klas ......................................................................................... 192

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

6 Java. Podstawy

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

Porady dotycz�ce projektowania klas ........................................................................... 198

Rozdzia� 5. Dziedziczenie .......................................................................................................................201Klasy, nadklasy i podklasy .......................................................................................... 202

Hierarchia dziedziczenia ........................................................................................ 208Polimorfizm .......................................................................................................... 208Wi�zanie dynamiczne ............................................................................................ 210Wy��czanie dziedziczenia — klasy i metody finalne .................................................. 213Rzutowanie ........................................................................................................... 214Klasy abstrakcyjne ................................................................................................ 216Dost�p chroniony .................................................................................................. 221

Klasa bazowa Object .................................................................................................. 222Metoda equals ..................................................................................................... 223Porównywanie a dziedziczenie ................................................................................ 224Metoda hashCode ................................................................................................. 227Metoda toString .................................................................................................... 229

Generyczne listy tablicowe .......................................................................................... 234Dost�p do elementów listy tablicowej ..................................................................... 237Zgodno� pomi�dzy typowanymi a surowymi listami tablicowymi ............................... 241

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

Klasa Class .......................................................................................................... 249Podstawy przechwytywania wyj�tków ....................................................................... 251Zastosowanie refleksji w analizie funkcjonalno�ci klasy ............................................ 253Refleksja w analizie obiektów w czasie dzia�ania programu ....................................... 258Zastosowanie refleksji w generycznym kodzie tablicowym ......................................... 263Wskaniki do metod .............................................................................................. 267

Porady projektowe dotycz�ce dziedziczenia ................................................................... 270

Rozdzia� 6. Interfejsy i klasy wewn�trzne ..........................................................................................273Interfejsy ................................................................................................................... 274

W�asno�ci interfejsów ............................................................................................ 279Interfejsy a klasy abstrakcyjne ............................................................................... 280

Klonowanie obiektów .................................................................................................. 281Interfejsy a sprz��enie zwrotne .................................................................................... 287Klasy wewn�trzne ....................................................................................................... 290

Dost�p do stanu obiektu w klasie wewn�trznej ........................................................ 292Specjalne regu�y sk�adniowe dotycz�ce klas wewn�trznych ....................................... 295Czy klasy wewn�trzne s� potrzebne i bezpieczne? .................................................... 296Lokalne klasy wewn�trzne ..................................................................................... 298Dost�p do zmiennych finalnych z metod zewn�trznych .............................................. 299Anonimowe klasy wewn�trzne ................................................................................ 301Statyczne klasy wewn�trzne ................................................................................... 304

Klasy proxy ................................................................................................................ 307W�asno�ci klas proxy ............................................................................................. 311

Spis tre�ci 7

Rozdzia� 7. Grafika .................................................................................................................................313Wprowadzenie do pakietu Swing .................................................................................. 314Tworzenie ramki ......................................................................................................... 317Pozycjonowanie ramki ................................................................................................. 320

W�asno�ci ramek .................................................................................................. 322Okre�lanie rozmiaru ramki ..................................................................................... 323

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

Rozdzia� 8. Obs�uga zdarze� .................................................................................................................355Podstawy obs�ugi zdarze� ........................................................................................... 355

Przyk�ad — obs�uga klikni�cia przycisku .................................................................. 357Nabywanie bieg�o�ci w pos�ugiwaniu si� klasami wewn�trznymi ................................ 362Tworzenie s�uchaczy zawieraj�cych jedno wywo�anie metody ..................................... 365Przyk�ad — zmiana stylu ........................................................................................ 366Klasy adaptacyjne ................................................................................................. 370

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

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

Rozdzia� 9. Komponenty Swing interfejsu u�ytkownika .....................................................................393Swing a wzorzec projektowy Model-View-Controller ........................................................ 394

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

Wprowadzenie do zarz�dzania rozk�adem ..................................................................... 400Rozk�ad brzegowy .................................................................................................. 403Rozk�ad siatkowy .................................................................................................. 405

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

Komponenty umo�liwiaj�ce wybór opcji ........................................................................ 417Pola wyboru .......................................................................................................... 417Prze��czniki .......................................................................................................... 420Obramowanie ....................................................................................................... 424Listy rozwijalne ..................................................................................................... 428Suwaki ................................................................................................................. 432

Menu ........................................................................................................................ 438Tworzenie menu .................................................................................................... 439Ikony w elementach menu ..................................................................................... 441Pola wyboru i prze��czniki jako elementy menu ........................................................ 442Menu podr�czne ................................................................................................... 444Mnemoniki i akceleratory ....................................................................................... 445

8 Java. Podstawy

Aktywowanie i dezaktywowanie elementów menu ..................................................... 448Paski narz�dzi ...................................................................................................... 451Dymki .................................................................................................................. 453

Zaawansowane techniki zarz�dzania rozk�adem ............................................................ 456Rozk�ad GridBagLayout .......................................................................................... 458Rozk�ad grupowy ................................................................................................... 468Nieu�ywanie �adnego zarz�dcy rozk�adu .................................................................. 478Niestandardowi zarz�dcy rozk�adu .......................................................................... 479Kolejka dost�pu .................................................................................................... 483

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

Rozdzia� 10. Przygotowywanie apletów i aplikacji do u�ytku ............................................................525Pliki JAR .................................................................................................................... 526

Manifest .............................................................................................................. 526Wykonywalne pliki JAR ........................................................................................... 528Zasoby ................................................................................................................. 529Piecz�towanie pakietów ......................................................................................... 532

Java Web Start ........................................................................................................... 533Sandbox ............................................................................................................... 537Podpisywanie kodu ............................................................................................... 538API JNLP .............................................................................................................. 539

Aplety ........................................................................................................................ 548Prosty aplet .......................................................................................................... 549Znacznik applet i jego atrybuty ............................................................................... 553Znacznik object ..................................................................................................... 557Parametry przekazuj�ce informacje do apletów ........................................................ 557Dost�p do obrazów i plików audio .......................................................................... 562�rodowisko dzia�ania apletu ................................................................................... 563

Zapisywanie preferencji u�ytkownika ............................................................................ 572Mapy w�asno�ci .................................................................................................... 572API Preferences .................................................................................................... 577

Rozdzia� 11. Wyj�tki, dzienniki, asercje i debugowanie .......................................................................585Obs�uga b��dów ......................................................................................................... 586

Klasyfikacja wyj�tków ............................................................................................ 587Deklarowanie wyj�tków kontrolowanych .................................................................. 589Zg�aszanie wyj�tków .............................................................................................. 591Tworzenie klas wyj�tków ........................................................................................ 593

Przechwytywanie wyj�tków ........................................................................................... 594Przechwytywanie wielu typów wyj�tków .................................................................... 596Powtórne generowanie wyj�tków i budowanie �a�cuchów wyj�tków ............................ 596Klauzula finally ..................................................................................................... 597Analiza danych ze �ledzenia stosu .......................................................................... 601

Wskazówki dotycz�ce stosowania wyj�tków .................................................................. 604

Spis tre�ci 9

Asercje ...................................................................................................................... 607W��czanie i wy��czanie asercji ................................................................................ 608Zastosowanie asercji w sprawdzaniu parametrów .................................................... 608Zastosowanie asercji w dokumentacji za�o�e� ......................................................... 610

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

Wskazówki dotycz�ce debugowania ............................................................................. 629U�ywanie okna konsoli .......................................................................................... 635�ledzenie zdarze� AWT .......................................................................................... 636Zaprz�ganie robota AWT do pracy ........................................................................... 640

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

Rozdzia� 12. Programowanie uogólnione .............................................................................................649Dlaczego programowanie uogólnione ........................................................................... 650

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

Translacja wyra�e� generycznych ............................................................................ 659Translacja metod uogólnionych .............................................................................. 660U�ywanie starego kodu .......................................................................................... 662

Ograniczenia i braki .................................................................................................... 663Nie mo�na podawa typów prostych jako parametrów typowych ................................ 663Sprawdzanie typów w czasie dzia�ania programu jest mo�liwe tylko

dla typów surowych ............................................................................................ 663Obiektów klasy uogólnionej nie mo�na generowa ani przechwytywa ........................ 664Nie mo�na tworzy tablic typów uogólnionych .......................................................... 665Nie wolno tworzy egzemplarzy zmiennych typowych ................................................. 665Zmiennych typowych nie mo�na u�ywa w statycznych kontekstach klas uogólnionych ... 667Uwa�aj na konflikty, które mog� powsta po wymazaniu typów .................................. 667

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

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

Refleksja a typy uogólnione ......................................................................................... 679Zastosowanie parametrów Class<T> do dopasowywania typów ................................. 680Informacje o typach generycznych w maszynie wirtualnej .......................................... 680

10 Java. Podstawy

Rozdzia� 13. Kolekcje .............................................................................................................................687Interfejsy kolekcyjne ................................................................................................... 687

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

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

Architektura kolekcji ................................................................................................... 729Widoki i obiekty opakowuj�ce ................................................................................. 733Operacje zbiorcze .................................................................................................. 739Konwersja pomi�dzy kolekcjami a tablicami ............................................................ 740

Algorytmy ................................................................................................................... 741Sortowanie i tasowanie ......................................................................................... 742Wyszukiwanie binarne ........................................................................................... 745Proste algorytmy ................................................................................................... 746Pisanie w�asnych algorytmów ................................................................................. 748

Stare kolekcje ............................................................................................................ 749Klasa Hashtable ................................................................................................... 749Wyliczenia ............................................................................................................ 750Mapy w�asno�ci .................................................................................................... 751Stosy ................................................................................................................... 751Zbiory bitów .......................................................................................................... 752

Rozdzia� 14. Wielow�tkowo� ...............................................................................................................757Czym s� w�tki ............................................................................................................ 758

Wykonywanie zada� w osobnych w�tkach ................................................................ 763Przerywanie w�tków .................................................................................................... 769Stany w�tków ............................................................................................................. 771

W�tki NEW ........................................................................................................... 772W�tki RUNNABLE .................................................................................................. 772W�tki BLOCKED i WAITING ..................................................................................... 773Zamykanie w�tków ................................................................................................ 773

W�asno�ci w�tków ...................................................................................................... 775Priorytety w�tków .................................................................................................. 775W�tki demony ....................................................................................................... 776Procedury obs�ugi nieprzechwyconych wyj�tków ....................................................... 777

Synchronizacja ........................................................................................................... 778Przyk�ad sytuacji powoduj�cej wy�cig ...................................................................... 778Wy�cigi ................................................................................................................ 783Obiekty klasy Lock ................................................................................................ 784Warunki ............................................................................................................... 787S�owo kluczowe synchronized ................................................................................. 792Bloki synchronizowane .......................................................................................... 796Monitor ................................................................................................................ 797

Spis tre�ci 11

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

Kolejki blokuj�ce ........................................................................................................ 808Kolekcje bezpieczne w�tkowo ...................................................................................... 815

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

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

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

Synchronizatory .......................................................................................................... 830Semafory ............................................................................................................. 830Klasa CountDownLatch .......................................................................................... 831Bariery ................................................................................................................. 832Klasa Exchanger ................................................................................................... 833Kolejki synchroniczne ............................................................................................ 833Przyk�ad — wstrzymywanie i ponowne uruchamianie animacji ................................... 833

W�tki a biblioteka Swing ............................................................................................. 839Uruchamianie czasoch�onnych zada� ...................................................................... 840Klasa SwingWorker ............................................................................................... 845Zasada jednego w�tku .......................................................................................... 851

Dodatek A S�owa kluczowe Javy ..........................................................................................................853

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

8Obs�uga zdarze�

W tym rozdziale:

� Podstawy obs�ugi zdarze

� Akcje

� Zdarzenia generowane przez mysz

� Hierarchia zdarze AWT

Obs�uga zdarze ma fundamentalne znaczenie w programach z graficznym interfejsem u�yt-kownika. Ka�dy, kto chce tworzy interfejsy graficzne w Javie, musi opanowa obs�ug� zda-rze. Niniejszy rozdzia� opisuje model obs�ugi zdarze biblioteki AWT. Do opisywanychzagadnie nale�� przechwytywanie zdarze w komponentach interfejsu u�ytkownika i urz�-dzeniach wej�ciowych, a tak�e akcje (ang. actions), czyli bardziej strukturalna metodaprzetwarzania zdarze.

Podstawy obs�ugi zdarze�Ka�dy system operacyjny posiadaj�cy graficzny interfejs u�ytkownika stale monitoruje za-chodz�ce w nim zdarzenia, jak naciskanie klawiszy na klawiaturze czy klikni�cia przyciskiemmyszy. Informacje o tych zdarzeniach s� przesy�ane do uruchomionych programów. Nast�p-nie ka�dy program podejmuje samodzieln� decyzj�, w jaki sposób, je�li w ogóle, zareagowana te zdarzenia. W takich j�zykach jak Visual Basic relacje pomi�dzy zdarzeniami a kodems� oczywiste. Programista pisze kod obs�ugi ka�dego interesuj�cego go zdarzenia i umieszczago w tzw. procedurze obs�ugi zdarze� (ang. event procedure). Na przyk�ad z przyciskiemo nazwie HelpButton w j�zyku Visual Basic mo�e by skojarzona procedura obs�ugi zdarzeo nazwie HelpButton_Click. Kod niniejszej procedury jest wykonywany w odpowiedzi naka�de klikni�cie niniejszego przycisku. Ka�dy komponent GUI w j�zyku Visual Basic reagujena ustalony zestaw zdarze — nie mo�na zmieni zdarze, na które reaguje dany komponent.

356 Java. Podstawy

Natomiast programi�ci czystego j�zyka C zajmuj�cy si� zdarzeniami musz� pisa procedurynieprzerwanie monitoruj�ce kolejk� zdarze w celu sprawdzenia, jakie powiadomienia prze-sy�a system operacyjny (z regu�y do tego celu stosuje si� p�tl� zawieraj�c� bardzo rozbudowan�instrukcj� switch!). Technika ta jest oczywi�cie bardzo ma�o elegancka i sprawia wiele pro-blemów podczas pisania kodu. Jej zalet� jest natomiast to, �e nie ma �adnych ograniczedotycz�cych zdarze, na które mo�na reagowa, w przeciwiestwie do innych j�zyków, np.Visual Basica, które wk�adaj� bardzo du�o wysi�ku w ukrywanie kolejki zdarze przedprogramist�.

W �rodowisku programistycznym Javy przyj�to podej�cie po�rednie pomi�dzy j�zykami VisualBasic a C, je�li chodzi o oferowane mo�liwo�ci, a co za tym idzie — tak�e z�o�ono�. Poru-szaj�c si� w zakresie zdarze, które obs�uguje biblioteka AWT, programista ma pe�n� kontrol�nad sposobem przesy�ania zdarze ze róde� zdarze� (ang. event sources), np. przycisków lubpasków przewijania, do s�uchaczy zdarze� (ang. event listener). Na s�uchacza zdarze mo�nadesygnowa ka�dy obiekt — w praktyce wybiera si� ten obiekt, który z �atwo�ci� mo�e wy-kona odpowiednie dzia�ania w odpowiedzi na zdarzenie. Ten delegacyjny model zdarze dajeznacznie wi�ksze mo�liwo�ci ni� j�zyk Visual Basic, w którym s�uchacz jest ustalony z góry.

�ród�a zdarze dysponuj� metodami, w których mo�na rejestrowa s�uchaczy zdarze. Kiedyma miejsce okre�lone zdarzenie, �ród�o wysy�a powiadomienie o nim do wszystkich obiektównas�uchuj�cych, które zosta�y dla niego zarejestrowane.

Jak mo�na si� spodziewa, informacje o zdarzeniu w j�zyku obiektowym, takim jak Java, s�pakowane w obiekcie zdarze� (ang. event object). W Javie wszystkie obiekty zdarze nale��do klasy java.util.EventObject. Oczywi�cie istniej� te� podklasy reprezentuj�ce ka�dy typzdarzenia, takie jak ActionEvent czy WindowEvent.

Ró�ne �ród�a zdarze mog� dostarcza ró�nego rodzaju zdarze. Na przyk�ad przycisk mo�ewysy�a obiekty ActionEvent, podczas gdy okno wysy�a obiekty WindowEvent.

Podsumujmy, co ju� wiemy na temat obs�ugi zdarze w bibliotece AWT:

� Obiekt nas�uchuj�cy jest egzemplarzem klasy implementuj�cej specjalny interfejsnas�uchu (ang. listener interface).

� �ród�o zdarze to obiekt, który mo�e rejestrowa obiekty nas�uchuj�ce i wysy�ado nich obiekty zdarze.

� �ród�o zdarze wysy�a obiekty zdarze do wszystkich zarejestrowanych s�uchaczyw chwili wyst�pienia zdarzenia.

� Informacje zawarte w obiekcie zdarze s� wykorzystywane przez obiekty nas�uchuj�ceprzy podejmowaniu decyzji dotycz�cej reakcji na zdarzenie.

Rysunek 8.1 przedstawia relacje pomi�dzy klasami obs�ugi zdarze a interfejsami

Poni�ej znajduje si� przyk�adowa definicja s�uchacza:ActionListener listener = . . .;JButton button = new JButton("Ok");button.addActionListener(listener);

Rozdzia� 8. � Obs�uga zdarze� 357

Rysunek 8.1.Relacje pomi�dzy�ród�ami zdarze�a s�uchaczami

Od tej pory obiekt listener b�dzie powiadamiany o ka�dym zdarzeniu akcji w przycisku.Jak si� mo�na domy�li, zdarzenie akcji w przypadku przycisku to jego klikni�cie.

Klasa implementuj�ca interfejs ActionListener musi definiowa metod� o nazwie action-Performed, która jako parametr przyjmuje obiekt typu ActionEvent:

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

Kiedy u�ytkownik kliknie przycisk, obiekt typu JButton tworzy obiekt typu ActionEventi wywo�uje metod� listener.actionPerformed(event), przekazuj�c do niej niniejszy obiektzdarzenia. �ród�o zdarze, takie jak przycisk, mo�e mie kilku s�uchaczy. W takim przy-padku klikni�cie przycisku przez u�ytkownika powoduje wywo�anie metod actionPerformedwszystkich s�uchaczy.

Rysunek 8.2 przedstawia relacje pomi�dzy �ród�em zdarze, s�uchaczem zdarze a obiek-tem zdarze.

Przyk�ad — obs�uga klikni�cia przycisku

Aby nabra bieg�o�ci w pos�ugiwaniu si� modelem delegacji zdarze, przeanalizujemy szcze-gó�owo prosty program reaguj�cy na klikni�cie przycisku. Utworzymy panel zawieraj�cy trzyprzyciski, których zdarze b�d� nas�uchiwa trzy obiekty nas�uchuj�ce.

W tym przypadku za ka�dym razem, gdy u�ytkownik kliknie jeden z przycisków na panelu,skojarzony z tym przyciskiem obiekt odbierze obiekt typu ActionEvent oznaczaj�cy klikni�cieprzycisku. W odpowiedzi obiekt nas�uchuj�cy zmieni kolor t�a panelu.

Przed przej�ciem do programu, który nas�uchuje klikni� przycisków, musimy najpierw za-pozna si� z technik� tworzenia i dodawania przycisków do panelu (wi�cej informacji natemat elementów GUI znajduje si� w rozdziale 9.).

358 Java. Podstawy

Rysunek 8.2.Powiadamianieo zdarzeniach

Tworzenie przycisku polega na podaniu jego konstruktorowi �acucha okre�laj�cego etykiet�przycisku, ikony lub jednego i drugiego. Poni�ej znajduj� si� przyk�ady tworzenia dwóchprzycisków:

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

Przyciski do panelu dodaje si� za pomoc� metody add:JButton yellowButton = new JButton("�ó�ty");JButton blueButton = new JButton("Niebieski");JButton redButton = new JButton("Czerwony");

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

Wynik powy�szych dzia�a przedstawia rysunek 8.3.

Nast�pnie konieczne jest dodanie procedur nas�uchuj�cych tych przycisków. Do tego po-trzebne s� klasy implementuj�ce interfejs ActionListener, który, jak ju� wspominali�my,zawiera tylko jedn� metod�: actionPerformed. Sygnatura niniejszej metody jest nast�puj�ca:

public void actionPerformed(ActionEvent event)

Rozdzia� 8. � Obs�uga zdarze� 359

Rysunek 8.3.Panelz przyciskami

Interfejs ActionListener nie ogranicza si� tylko do klikni� przycisków. Znajduje on zastosowanie w wielu innych sytuacjach, takich jak:

� wybór elementu z pola listy za pomoc� dwukrotnego klikni�cia,

� wybór elementu menu,

� klikni�cie klawisza Enter w polu tekstowym,

� up�yw okre�lonej ilo�ci czasu dla komponentu Timer.

Wi�cej szczegó�ów na ten temat znajduje si� w niniejszym i kolejnym rozdziale.

Sposób u�ycia interfejsu ActionListener jest taki sam we wszystkich sytuacjach:metoda actionPerformed (jedyna w interfejsie ActionListener) przyjmuje obiekt typuActionEvent jako parametr. Ten obiekt zdarzenia dostarcza informacji o zdarzeniu,które mia�o miejsce.

Reakcj� na klikni�cie przycisku ma by zmiana koloru t�a panelu. ��dany kolor b�dziemyprzechowywa w klasie nas�uchuj�cej:

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

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

Nast�pnie dla ka�dego koloru tworzymy osobny obiekt i ka�dy z nich rejestrujemy jakos�uchacza przycisku.

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

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

360 Java. Podstawy

Je�li u�ytkownik kliknie na przyk�ad przycisk z napisem �ó�ty, zostanie wywo�ana metodaactionPerformed obiektu yellowAction. Pole backgroundColor niniejszego obiektu ma warto�color.YELLOW.

Zosta� jeszcze tylko jeden problem do rozwi�zania. Obiekt typu ColorAction nie ma dost�-pu do zmiennej buttonPanel. Mo�na to rozwi�za na jeden z dwóch sposobów. Mo�na za-pisa panel w obiekcie ColorAction i skonstruowa go w konstruktorze ColorAction. Wygod-niej jednak by�oby, gdyby ColorAction by�a klas� wewn�trzn� klasy ButtonFrame. Dzi�kitemu jej metody mia�yby automatycznie dost�p do zewn�trznego panelu (wi�cej informacjina temat klas wewn�trznych znajduje si� w rozdziale 6.).

Zastosujemy drug� z opisanych metod. Poni�ej przedstawiamy klas� ColorAction wewn�trzklasy ButtonFrame:

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

private Color backgroundColor; } private JPanel buttonPanel;}

Przypatrzmy si� uwa�niej metodzie actionPerformed. Klasa ColorAction nie posiada polabuttonPanel. Ma go natomiast zewn�trzna klasa ButtonFrame.

Jest to bardzo cz�sto spotykana sytuacja. Obiekty nas�uchu zdarze cz�sto musz� wykony-wa dzia�ania, które maj� wp�yw na inne obiekty. Klas� nas�uchuj�c� cz�sto mo�na umie�ciw strategicznym miejscu wewn�trz klasy, której obiekt ma mie zmieniony stan.

Listing 8.1 przedstawia kompletny program. Klikni�cie jednego z przycisków powodujezmian� koloru t�a panelu przez odpowiedniego s�uchacza akcji.

Listing 8.1. ButtonTest.java

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

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

Rozdzia� 8. � Obs�uga zdarze� 361

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

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

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

buttonPanel = new JPanel();

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

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

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

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

/** * S�uchacz akcji ustawiaj�cy kolor t�a panelu. */ private class ColorAction implements ActionListener {

362 Java. Podstawy

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

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

private Color backgroundColor; }

private JPanel buttonPanel;

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

javax.swing.JButton 1.2

� JButton(String label)

� JButton(Icon icon)

� JButton(String label, Icon icon)

Tworzy przycisk. �acuch etykiety mo�e zawiera sam tekst lub (od Java SE 1.3)kod HTML, np. "<html><b>Ok</b></html>".

java.awt.Container 1.0

� Component add(Component c)

Dodaje komponent c do kontenera.

javax.swing.ImageIcon 1.2

� ImageIcon(String filename)

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

Nabywanie bieg�o�ci w pos�ugiwaniu si� klasami wewn�trznymi

Niektórzy programi�ci nie przepadaj� za klasami wewn�trznymi, poniewa� uwa�aj�, �e klasyi obiekty o du�ych rozmiarach spowalniaj� dzia�anie programu. Przyjrzyjmy si� temu twier-dzeniu. Nie potrzebujemy nowej klasy dla ka�dego elementu interfejsu u�ytkownika. W na-szym programie wszystkie trzy przyciski wspó�dziel� jedn� klas� nas�uchuj�c�. Oczywi�cieka�dy z nich posiada osobny obiekt nas�uchuj�cy. Ale obiekty te nie s� du�e. Ka�dy z nichzawiera warto� okre�laj�c� kolor i referencj� do panelu. A tradycyjne rozwi�zanie, z zasto-sowaniem instrukcji if-else, równie� odwo�uje si� do tych samych obiektów kolorów prze-chowywanych przez s�uchaczy akcji, tylko �e jako zmienne lokalne, a nie pola obiektów.

Rozdzia� 8. � Obs�uga zdarze� 363

Poni�ej przedstawiamy dobry przyk�ad tego, jak anonimowe klasy wewn�trzne mog� upro-�ci kod programu. W programie na listingu 8.1 z ka�dym przyciskiem zwi�zane s� takiesame dzia�ania:

1. Utworzenie przycisku z etykiet�.

2. Dodanie przycisku do panelu.

3. Utworzenie s�uchacza akcji z odpowiednim kolorem.

4. Dodanie s�uchacza akcji.

Napiszemy metod� pomocnicz�, która b�dzie upraszcza�a niniejsze czynno�ci:public void makeButton(String name, Color backgroundColor){JButton button = new JButton(name);buttonPanel.add(button);ColorAction action = new ColorAction(backgroundColor);button.addActionListener(action);}

Teraz wystarcz� tylko nast�puj�ce wywo�ania:makeButton("�ó�ty", Color.YELLOW);makeButton("niebieski", Color.BLUE);makeButton("czerwony", Color.RED);

Mo�liwe s� dalsze uproszczenia. Zauwa�my, �e klasa ColorAction jest potrzebna tylko jedenraz — w metodzie makeButton. A zatem mo�na j� przerobi na klas� anonimow�:

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

Kod s�uchacza akcji sta� si� znacznie prostszy. Metoda actionPerformed odwo�uje si� dozmiennej parametrycznej backgroundColor (podobnie jak w przypadku wszystkich zmiennychlokalnych wykorzystywanych w klasie wewn�trznej, parametr ten musi by finalny).

Nie jest potrzebny �aden jawny konstruktor. Jak widzieli�my w rozdziale 6., mechanizm klaswewn�trznych automatycznie generuje konstruktor zapisuj�cy wszystkie finalne zmiennelokalne, które s� u�ywane w jednej z metod klasy wewn�trznej.

364 Java. Podstawy

Anonimowe klasy wewn�trzne potrafi� zmyli niejednego programist�. Mo�na jed- nak przyzwyczai si� do ich rozszyfrowywania, wyrabiaj�c sobie umiej�tno� po-

mijania wzrokiem kodu procedury:

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

Akcja przycisku ustawia kolor t�a. Dopóki procedura obs�ugi zdarze� sk�ada si� z tylkokilku instrukcji, wydaje si�, �e z odczytem nie powinno by problemów, zw�aszcza je�liw sferze naszych zainteresowa� nie le�� mechanizmy klas wewn�trznych.

S�uchaczem przycisku mo�e by obiekt ka�dej klasy, która implementuje interfejs ActionListener. My wolimy u�ywa obiektów nowej klasy, która zosta�a utworzona

specjalnie z my�l� o wykonywaniu akcji przycisku. Jednak niektórzy programi�ci nie czuj�si� pewnie w stosowaniu klas wewn�trznych i wybieraj� inne podej�cie. Implementuj�interfejs ActionListener w kontenerze róde� zdarze�. Nast�pnie kontener ten ustawiasam siebie jako s�uchacza w nast�puj�cy sposób:

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

W tej sytuacji �aden z trzech przycisków nie ma osobnego s�uchacza. Dysponuj� onewspólnym obiektem, którym jest ramka przycisku. W zwi�zku z tym metoda action-Performed musi sprawdzi, który przycisk zosta� klikni�ty.

class ButtonFrame extends JFrame implements ActionListener { . . . public void actionPerformed(ActionEvent event) { Object source = event.getSource(); if (source == yellowButton) . . . else if (source == blueButton) . . . else if (source == redButton ) . . . else . . . } }

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

java.util.EventObject 1.1

� Object setSource()

Zwraca referencj� do obiektu, w którym wyst�pi�o zdarzenie.

Rozdzia� 8. � Obs�uga zdarze� 365

java.awt.event.ActionEvent 1.1

� String getActionCommand()

Zwraca �acuch polecenia skojarzonego z danym zdarzeniem akcji. Je�li zdarzeniepochodzi od przycisku, �acuch polecenia jest taki sam jak etykieta przycisku,chyba �e zosta� zmieniony za pomoc� metody setActionCommand.

java.beans.EventHandler 1.4

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

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

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

Tworzy obiekt klasy po�rednicz�cej implementuj�cej dany interfejs. Albo podanametoda, albo wszystkie metody interfejsu wykonuj� dane akcje na rzecz obiektudocelowego.

Akcj� mo�e by metoda lub w�asno� obiektu docelowego. Je�li jest to w�asno�,wykonywana jest jej metoda ustawiaj�ca. Na przyk�ad akcja text jest zamienianana wywo�anie metody setText.

W�asno� zdarzenia sk�ada si� z jednej lub wi�kszej liczby nazw w�asno�cioddzielonych kropkami. Pierwsza w�asno� jest wczytywana z parametru metodynas�uchuj�cej. Druga w�asno� pochodzi od powsta�ego obiektu itd. Wynik kocowystaje si� parametrem akcji. Na przyk�ad w�asno� source.text jest zamienianana wywo�ania metod getSource i getText.

Tworzenie s�uchaczy zawieraj�cych jedno wywo�anie metody

W Java SE 1.4 wprowadzono mechanizm umo�liwiaj�cy okre�lanie prostych s�uchaczy zda-rze bez tworzenia klas wewn�trznych. Wyobra�my sobie na przyk�ad, �e mamy przyciskz etykiet� Load, którego procedura obs�ugi zdarze zawiera tylko jedn� metod�:

frame.loadData();

Oczywi�cie mo�na u�y anonimowej klasy wewn�trznej:loadButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event) { frame.loadData(); }});

Ale klasa EventHandler mo�e utworzy takiego s�uchacza automatycznie, za pomoc� nast�-puj�cego wywo�ania:

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

366 Java. Podstawy

Oczywi�cie nadal konieczne jest zainstalowanie procedury obs�ugi:loadButton.addActionListener( EventHandler.create(ActionListener.class, frame, "loadData"));

Je�li s�uchacz wywo�uje metod� z jednym parametrem, który mo�na uzyska z parametruzdarzenia, mo�na u�y innego rodzaju metody create. Na przyk�ad wywo�anie:

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

jest równoznaczne z:new ActionListener() { public void actionPerformed(ActionEvent event) { frame.loadData(((JTextField) event.getSource()).getText()); } }

Nazwy w�asno�ci source i text zamieniaj� si� w wywo�ania metod getSource i getText.

Przyk�ad — zmiana stylu

Domy�lnym stylem programów pisanych przy u�yciu Swinga jest Metal. Istniej� dwa spo-soby na zmian� stylu. Pierwszy z nich polega na utworzeniu pliku swing.properties w katalogujre/lib w miejscu instalacji Javy. W pliku tym nale�y ustawi w�asno� swing.defaultlafna nazw� klasy stylu, który chcemy zastosowa. Na przyk�ad:

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

Zauwa�my, �e styl Metal jest zlokalizowany w pakiecie javax.swing. Pozosta�e style znaj-duj� si� w pakiecie com.sun.java i nie musz� by obecne w ka�dej implementacji Javy. Obec-nie ze wzgl�du na prawa autorskie pakiety stylów systemów Windows i Macintosh s� dost�pnewy��cznie z wersjami �rodowiska uruchomieniowego Javy przeznaczonymi dla tych systemów.

Poniewa� w plikach w�asno�ci linie zaczynaj�ce si� od znaku # s� ignorowane, mo�na w takim pliku umie�ci kilka stylów i wybiera je wedle upodobania, odpo-

wiednio zmieniaj�c po�o�enie znaku #:

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

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

Drugi sposób polega na dynamicznej zmianie stylu. Nale�y wywo�a statyczn� metod�UIManager.setLookAndFeel oraz przekaza do niej nazw� klasy wybranego stylu. Nast�pniewywo�ujemy statyczn� metod� SwingUtilities.updateComponentTreeUI w celu od�wie�eniaca�ego zbioru komponentów. Metodzie tej wystarczy przekaza tylko jeden komponent, a po-zosta�e znajdzie ona samodzielnie. Metoda UIManager.setLookAndFeel mo�e spowodowa

Rozdzia� 8. � Obs�uga zdarze� 367

kilka wyj�tków, je�li nie znajdzie ��danego stylu lub je�li wyst�pi b��d podczas �adowaniastylu. Jak zwykle nie zg��biamy kodu obs�uguj�cego wyj�tki, poniewa� szczegó�owo zajmie-my si� tym w rozdziale 11.

Poni�szy przyk�adowy fragment programu przedstawia sposób prze��czenia na styl Motif:String plaf = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";try{ UIManager.setLookAndFeel(plaf); SwingUtilities.updateComponentTreeUI(panel);}catch(Exception e) { e.printStackTrace(); }

Aby odnale� wszystkie zainstalowane style, nale�y u�y wywo�ania:

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

W takiej sytuacji nazw� ka�dego stylu i jego klasy mo�na uzyska nast�puj�co:String name = infos[i].getName();String className = infos[i].getClassName();

Listing 8.2 przedstawia pe�ny kod programu demonstruj�cego prze��czanie stylów (zobaczrysunek 8.4). Program ten jest podobny do programu z listingu 8.1. Id�c za rad� z poprzed-niej sekcji, akcj� przycisku, polegaj�c� na zmianie stylu, okre�lili�my za pomoc� metodypomocniczej makeButton i anonimowej klasy wewn�trznej.

Listing 8.2. PlafTest.java

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

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

368 Java. Podstawy

/** * Ramka z panelem zawieraj�cym przyciski zmieniaj�ce styl. */class PlafFrame extends JFrame{ public PlafFrame() { setTitle("PlafTest"); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

buttonPanel = new JPanel();

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

add(buttonPanel); }

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

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

// Ustawienie akcji przycisku.

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

private JPanel buttonPanel;

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

Rozdzia� 8. � Obs�uga zdarze� 369

Rysunek 8.4.Zmienianie stylu

Jedna rzecz w niniejszym programie jest godna szczególnej uwagi. Metoda actionPerformedwewn�trznej klasy nas�uchuj�cej akcji musi przekaza referencj� this klasy zewn�trznejPlafFrame do metody updateComponentTreeUI. Przypomnijmy sobie z rozdzia�u 6., �e przedwska�nikiem this obiektu klasy zewn�trznej musi znajdowa si� przedrostek w postaci na-zwy klasy zewn�trznej:

SwingUtilities.updateComponentTreeUI(PlafPanel.this);

javax.swing.UIManager 1.2

� static UIManager.LookAndFeelInfo[] getInstalledLookAndFeels()

Tworzy tablic� obiektów reprezentuj�cych zainstalowane style.

� static setLookAndFeel(String className)

Ustawia aktualny styl, wykorzystuj�c do tego podan� nazw� klasy(np. javax.swing.plaf.metal.MetalLookAndFeel).

javax.swing.UIManager.LookAndFeelInfo 1.2

� String getName()

Zwraca nazw� stylu.

� String getClassName()

Zwraca nazw� klasy implementuj�cej dany styl.

370 Java. Podstawy

Klasy adaptacyjne

Nie wszystkie zdarzenia s� tak �atwe w obs�udze jak klikni�cie przycisku. W profesjonalnymprogramie nale�y stale sprawdza, czy u�ytkownik nie zamyka g�ównej ramki, aby zapo-biec ewentualnej utracie jego danych. Gdy u�ytkownik zamyka ramk�, powinno wy�wietlasi� okno dialogowe monituj�ce o potwierdzenie niniejszego zamiaru.

Kiedy u�ytkownik zamyka okno, obiekt klasy JFrame jest �ród�em zdarzenia WindowEvent.Aby przechwyci to zdarzenie, konieczny jest odpowiedni obiekt nas�uchuj�cy, który nale�ydoda do listy s�uchaczy okna ramki.

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

Obiekt nas�uchuj�cy okna musi nale�e do klasy implementuj�cej interfejs WindowListener.Interfejs ten zawiera siedem metod. Ramka wywo�uje jedn� z nich w odpowiedzi na jednoz siedmiu zdarze, które mog� mie miejsce w przypadku okna. Nazwy tych metod mówi�same za siebie. Nale�y tylko wyja�ni, �e iconfied w systemie Windows oznacza to samoco minimized. Poni�ej wida ca�y interfejs WindowListener:

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

Aby sprawdzi, czy okno zosta�o zmaksymalizowane, nale�y zainstalowa obiekt WindowStateListener. Zobacz wyci�g z API na stronie 373.

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

Oczywi�cie nic nie stoi na przeszkodzie, aby zaimplementowa niniejszy interfejs, wstawiwywo�anie System.exit(0) do metody windowClosing i napisa sze� nicnierobi�cych funkcjidla pozosta�ych metod:

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

Rozdzia� 8. � Obs�uga zdarze� 371

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

Pisanie sze�ciu metod, które nic nie robi�, jest tym rodzajem pracy, której nikt nie lubi. Za-danie to u�atwiaj� klasy adaptacyjne (ang. adapter class) dost�pne z ka�dym interfejsemnas�uchuj�cym w bibliotece AWT, który ma wi�cej ni� jedn� metod�. Klasy te implementuj�wszystkie metody interfejsów, którym odpowiadaj�, ale metody te nic nie robi�. Na przyk�adklasa WindowAdapter zawiera definicje siedmiu nicnierobi�cych metod. Oznacza to, �e klasaadaptacyjna automatycznie spe�nia wymagania techniczne stawiane przez Jav�, a dotycz�ceimplementacji odpowiadaj�cego jej interfejsu nas�uchuj�cego. Klas� adaptacyjn� mo�na roz-szerzy, definiuj�c w podklasie metody odpowiadaj�ce niektórym, ale nie wszystkim typomzdarze interfejsu (interfejsy, które maj� tylko jedn� metod�, np. ActionListener, nie po-trzebuj� metod adaptacyjnych).

Rozszerzymy klas� WindowAdapter. Odziedziczymy po niej sze� nicnierobi�cych metod,a metod� windowClossing przes�onimy:

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

Teraz mo�emy zarejestrowa obiekt typu Terminator jako s�uchacza zdarze:WindowListener listener = new Terminator();frame.addWindowListener(listener);

Ka�de zdarzenie okna wygenerowane przez ramk� jest przekazywane do obiektu listenerza pomoc� wywo�ania jednej z jego siedmiu metod (zobacz rysunek 8.5). Sze� z nich nierobi nic, a metoda windowClosing wywo�uje metod� System.exit(0), zamykaj�c tym samymaplikacj�.

Je�li w nazwie metody rozszerzanej klasy adaptacyjnej znajdzie si� b��d, kompi- lator go nie wykryje. Je�li na przyk�ad w klasie rozszerzaj�cej WindowAdapter zo-

stanie zdefiniowana metoda windowIsClosing, nowa klasa b�dzie zawiera�a osiem me-tod, a metoda windowClosing nic nie b�dzie robi�a.

Utworzenie klasy rozszerzaj�cej klas� adaptacyjn� WindowAdapter jest krokiem naprzód, alemo�na posun� si� jeszcze dalej. Nie ma potrzeby nadawa obiektowi listener nazwy.Wystarczy napisa:

frame.addWindowListener(new Terminator());

Ale czemu poprzestawa na tym? Klasa nas�uchuj�ca mo�e by anonimow� klas� we-wn�trzn� ramki.

372 Java. Podstawy

Rysunek 8.5.Obiektnas�uchuj�cyzdarze�dotycz�cych okna

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

Powy�szy fragment programu ma nast�puj�ce dzia�anie:

� Definiuje klas� bez nazwy, rozszerzaj�c� klas� WindowAdapter.

� Do utworzonej anonimowej klasy dodaje metod� windowClosing (podobnie jakwcze�niej, metoda ta zamyka program).

� Dziedziczy sze� pozosta�ych nicnierobi�cych metod po klasie WindowAdapter.

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

� Przekazuje niniejszy obiekt do metody addWindowListener.

Powtarzamy jeszcze raz, �e do sk�adni wewn�trznych klas anonimowych trzeba si� przy-zwyczai. Dzi�ki nim mo�na pisa tak zwi�z�y kod, jak to tylko mo�liwe.

Rozdzia� 8. � Obs�uga zdarze� 373

java.awt.event.WindowListener 1.1

� void windowOpened(WindowEvent e)

Jest wywo�ywana po otwarciu okna.

� void windowClosing(WindowEvent e)

Jest wywo�ywana, kiedy u�ytkownik wyda polecenie mened�era okien,aby zamkn� okno. Okno zostanie zamkni�te tylko wtedy, gdy zostanie wywo�anajego metoda hide lub dispose.

� void windowClosed(WindowEvent e)

Jest wywo�ywana po zamkni�ciu okna.

� void windowIconified(WindowEvent e)

Jest wywo�ywana po zminimalizowaniu okna.

� void windowDeiconified(WindowEvent e)

Jest wywo�ywana po przywróceniu okna.

� void windowActivated(WindowEvent e)

Jest wywo�ywana po uaktywnieniu okna. Aktywna mo�e by tylko ramka lub oknodialogowe. Z regu�y mened�er okien zaznacza w jaki� sposób aktywne okno— np. pod�wietlaj�c pasek tytu�u.

� void WindowDeactivated(WindowEvent e)

Jest wywo�ywana po dezaktywowaniu okna.

java.awt.event.WindowStateListener 1.4

� void windowStateChanged(WindowEvent event)

Jest wywo�ywana po zmaksymalizowaniu, zminimalizowaniu lub przywróceniudo normalnego rozmiaru okna.

java.awt.event.WindowEvent 1.1

� int getNewState() 1.4

� int getOldState() 1.4

Zwraca nowy i stary stan okna w zdarzeniu zmiany stanu okna. Zwracana liczbaca�kowita jest jedn� z nast�puj�cych warto�ci:

Frame.NORMALFrame.ICONIFIEDFrame.MAXIMIZED_HORIZFrame.MAXIMIZED_VERTFrame.MAXIMIZED_BOTH

374 Java. Podstawy

AkcjeCz�sto jedn� opcj� mo�na wybra na kilka ró�nych sposobów. U�ytkownik mo�e wybraodpowiedni� funkcj� w menu, nacisn� okre�lony klawisz lub przycisk na pasku narz�dzi.Zaprogramowanie takiej funkcjonalno�ci w modelu zdarze AWT jest proste — nale�ywszystkie zdarzenia zwi�za z tym samym obiektem nas�uchuj�cym. Wyobra�my sobie, �eblueAction jest obiektem nas�uchuj�cym akcji, którego metoda actionPerformed zmienia ko-lor t�a na niebieski. Jeden obiekt mo�na zwi�za jako s�uchacza z kilkoma �ród�ami zdarze:

� przyciskiem paska narz�dzi z etykiet� Niebieski;

� elementem menu z etykiet� Niebieski;

� skrótem klawiszowym Ctrl+N.

Dzi�ki temu zmiana koloru b�dzie wykonywana zawsze w taki sam sposób, bez znaczenia,czy wywo�a j� klikni�cie przycisku, wybór elementu menu, czy naci�ni�cie klawisza.

W pakiecie Swing dost�pna jest niezwykle przydatna struktura opakowuj�ca polecenia i wi�-��ca je z ró�nymi �ród�ami zdarze — interfejs Action. Akcja to obiekt, który opakowuje:

� opis polecenia (�acuch tekstowy i opcjonalna ikona),

� parametry niezb�dne do wykonania polecenia (w naszym przypadkuwymagany kolor).

Interfejs Action zawiera nast�puj�ce metody:void actionPerformed(ActionEvent event)void setEnabled(boolean b)boolean isEnabled()void putValue(String key, Object value)Object getValue(String key)void addPropertyChangeListener(PropertyChangeListener listener)void removePropertyChangeListener(PropertyChangeListener listener)

Pierwsza z tych metod jest ju� nam znana z interfejsu ActionListener. Nale�y doda, �e inter-fejs Action rozszerza interfejs ActionListener. W zwi�zku z tym wsz�dzie, gdzie powinienznale� si� obiekt ActionListener, mo�na u�y obiektu Action.

Dwie kolejne metody w��czaj� i wy��czaj� akcj� oraz sprawdzaj�, czy akcja jest aktualniew��czona. Kiedy akcja jest zwi�zana z menu lub paskiem narz�dzi i jest wy��czona, odpo-wiadaj�ca jej opcja ma kolor szary.

Metody putValue i getValue zapisuj� i pobieraj� pary nazwa – warto� z obiektu akcji. Nazwyakcji i ikony s� zapisywane w obiektach akcji za pomoc� dwóch predefiniowanych �acu-chów: Action.NAME i Action.SMALL_ICON:

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

Tabela 8.1 przedstawia zestawienie wszystkich predefiniowanych nazw tablicowych akcji.

Rozdzia� 8. � Obs�uga zdarze� 375

Tabela 8.1. Predefiniowane sta�e interfejsu Action

Nazwa Warto�

NAME Nazwa akcji — wy�wietlana na przyciskach i elementach menu.

SMALL_ICON Ma�a ikona — mo�e by wy�wietlana na przyciskach, pasku narz�dzilub elementach menu.

SHORT_DESCRIPTION Krótki opis ikony — wy�wietlany w etykiecie narz�dzia.

LONG_DESCRIPTION D�ugi opis ikony — do u�ytku w pomocy internetowej. �aden komponentSwinga nie u�ywa tej warto�ci.

MNEMONIC_KEY Skrót akcji — wy�wietlany na elementach menu (zobacz rozdzia� 9.).

ACCELERATOR_KEY Skrót klawiaturowy. �aden komponent Swinga nie u�ywa tej warto�ci.

ACTION_COMMAND_KEY U�ywana w przestarza�ej ju� metodzie registerKeyboardAction.

DEFAULT W�asno� pasuj�ca do wszystkiego. �aden komponent Swinga nie u�ywatej warto�ci.

Je�li obiekt akcji jest dodawany do menu lub paska narz�dzi, jego nazwa i ikona s� auto-matycznie pobierane i wy�wietlane w menu lub na pasku narz�dzi. Warto� w�asno�ciSHORT_DESCRIPTION zamienia si� w dymek opisuj�cy narz�dzie.

Pozosta�e dwie metody interfejsu Action umo�liwiaj� powiadamianie innych obiektów, zw�asz-cza menu i pasków narz�dzi, które s� �ród�em akcji, o zmianach w�asno�ci obiektu akcji.Je�li na przyk�ad menu jest dodawane jako obiekt nas�uchuj�cy zmian w�asno�ci obiektu akcjii obiekt ten zostanie nast�pnie wy��czony, menu zostanie wywo�ane, a nazwa akcji b�dzieszara. Obiekty nas�uchu zmian w�asno�ci s� ogóln� konstrukcj� stanowi�c� cz�� modelukomponentów JavaBean. Wi�cej informacji na temat Beanów i ich w�asno�ci znajduje si�w drugim tomie.

Nie nale�y zapomina, �e Action to interfejs, a nie klasa. Ka�da klasa implementuj�ca gomusi definiowa wszystkie siedem metod, które opisali�my. Na szcz��cie jaki� dobry cz�owieknapisa� klas� o nazwie AbstractAction, która implementuje wszystkie niniejsze metodyz wyj�tkiem actionPerformed. Klasa ta zajmuje si� zapisywaniem par nazwa – warto�i zarz�dzaniem obiektami nas�uchuj�cymi zmian w�asno�ci. Wystarczy rozszerzy klas�AbstractAction i zdefiniowa metod� actionPerformed.

Utworzymy obiekt wykonuj�cy polecenia zmiany koloru. Zapiszemy nazw� polecenia, iko-n� i ��dany kolor. Kolor zapiszemy w tablicy par nazwa – warto� dostarczanej przez klas�AbstractAction. Poni�ej znajduje si� kod �ród�owy klasy ColorAction. Konstruktor ustawiapary nazwa – warto�, a metoda actionPerformed wykonuje akcj� zmiany koloru.

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

376 Java. Podstawy

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

Nasz przyk�adowy program tworzy trzy obiekty niniejszej klasy, np.:Action blueAction = new ColorAction("Niebieski", new ImageIcon("blue-ball.gif"),�Color.BLUE);

Teraz konieczne jest zwi�zanie akcji z przyciskiem. Jest to �atwe, poniewa� mo�emy u�ykonstruktora 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 ustawiaakcj� jako s�uchacza. Ikony i etykiet� przedstawia rysunek 8.6.

Rysunek 8.6.Przyciskizawieraj� ikonyz obiektów akcji

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

Na koniec przypiszemy obiekty akcji do klawiszy, dzi�ki czemu akcje te b�d� wykonywane,kiedy u�ytkownik wpisze polecenia z klawiatury. Kojarzenie akcji z klawiszami nale�y za-cz� od wygenerowania obiektu klasy KeyStroke. Klasa ta opakowuje opis klawisza.Do utworzenia obiektu typu KeyStroke nie u�ywa si� konstruktora, ale statycznej metodygetKeyStroke klasy KeyStroke.

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

Do zrozumienia nast�pnego etapu potrzebna jest znajomo� poj�cia aktywno�ci komponentu(ang. keyboard focus). Interfejs u�ytkownika mo�e sk�ada si� z wielu przycisków, menu,pasków przewijania i innych komponentów. Kiedy zostanie naci�ni�ty klawisz, zdarzenie tozostaje wys�ane do aktywnego komponentu. Komponent ten jest z regu�y (cho nie zawsze)w jaki� sposób wizualnie wyró�niony. Na przyk�ad w stylu Javy tekst na aktywnym przyciskuma cienk� obwódk�. Fokus (aktywno� komponentu) mo�na przenosi na ró�ne kompo-nenty za pomoc� klawisza Tab. Naci�ni�cie klawisza spacji powoduje klikni�cie aktywnegoprzycisku. Inne klawisze wywo�uj� inne dzia�ania. Na przyk�ad klawisze strza�ek mog� ste-rowa paskiem przewijania.

Jednak my nie chcemy wysy�a zdarzenia naci�ni�cia klawisza do aktywnego komponentu.W przeciwnym razie ka�dy przycisk musia�by zna procedur� obs�ugi kombinacji klawiszyCtrl+Y, Ctrl+B i Ctrl+R.

Rozdzia� 8. � Obs�uga zdarze� 377

Jest to bardzo powszechny problem. Jednak projektanci biblioteki Swing znale�li dla niegoproste rozwi�zanie. Ka�dy JComponent posiada trzy mapy wej�cia (ang. input maps), z którychka�da odwzorowuje obiekty KeyStroke na zwi�zane z nimi akcje. Mapy te odpowiadaj� trzemró�nym sytuacjom (zobacz tabela 8.2).

Tabela 8.2. Mapy klawiaturowe

Znacznik Wywo�uje dzia�anie, gdy

WHEN_FOCUSED komponent jest aktywny;

WHEN_ANCESTOR_OF_FOCUSED_COMPONENT komponent zawiera komponent aktywny;

WHEN_IN_FOCUSED_WINDOW komponent znajduje si� w tym samym oknie co komponentaktywny.

Niniejsze mapy s� sprawdzane w nast�puj�cej kolejno�ci w wyniku naci�ni�cia klawisza:

1. Sprawdzenie mapy WHEN_FOCUSED aktywnego komponentu. Je�li dany skrótklawiaturowy istnieje, nast�puje wykonanie powi�zanego z nim dzia�ania.Je�li dzia�anie zostaje wykonane, nast�puje zatrzymanie sprawdzania warunków.

2. Nast�puje sprawdzenie map WHEN_ANCESTOR_OF_FOCUSED_COMPONENT aktywnegokomponentu, a nast�pnie jego komponentów nadrz�dnych. Gdy zostanie znalezionamapa z danym skrótem klawiaturowym, nast�puje wykonanie dzia�ania.Je�li dzia�anie zostaje wykonane, nast�puje zatrzymanie sprawdzania warunków.

3. Odszukanie wszystkich widocznych i w��czonych komponentów w aktywnym oknie,w których mapie WHEN_IN_FOCUSED_WINDOW znajduje si� dany skrót klawiaturowy.Umo�liwienie tym komponentom (w kolejno�ci zgodnej z rejestracj� zdarzenaci�ni�cia klawisza) wykonania odpowiednich dzia�a. Po wykonaniu pierwszegodzia�ania nast�puje zatrzymanie przetwarzania. Ta cz�� procesu mo�e by �ród�emproblemów, je�li dany skrót klawiaturowy pojawia si� w wi�cej ni� jednej mapieWHEN_IN_FOCUSED_WINDOW.

Map� wej�cia komponentu tworzy si� za pomoc� metody getInputMap. Na przyk�ad:InputMap imap = panel.getInputMap(JComponent.WHEN_FOCUSED);

Warunek WHEN_FOCUSED powoduje, �e ta mapa b�dzie sprawdzana, gdy komponent jest ak-tywny. Nam potrzebna jest inna mapa. Aktywny jest jeden z przycisków, nie panel. Do wsta-wienia skrótów klawiszy zmieniaj�cych kolor nadaje si� jedna z pozosta�ych dwóch map.W naszym przyk�adowym programie u�yjemy mapy WHEN_ANCESTOR_OF_FOCUSED_COMPONENT.

Klasa InputMap nie odwzorowuje bezpo�rednio obiektów KeyStroke w postaci obiektówAction. W zamian odwzorowuje w postaci dowolnych obiektów, a druga mapa, zaimple-mentowana w klasie ActionMap, mapuje obiekty na akcje. Dzi�ki temu �atwiej jest wspó�dzie-li te same akcje przez skróty klawiaturowe pochodz�ce z ró�nych map wej�cia.

A zatem ka�dy komponent posiada trzy mapy wej�cia i jedn� map� akcji (ang. action map).Aby je powi�za, trzeba wymy�li nazwy dla akcji. Klawisz mo�na powi�za z akcj� w na-st�puj�cy sposób:

378 Java. Podstawy

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

W przypadku akcji niewykonuj�cej �adnych dzia�a zwyczajowo stosuje si� �acuch none.W ten sposób mo�na �atwo dezaktywowa klawisz:

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

Dokumentacja JDK zaleca stosowanie jako klucza akcji jej nazwy. Naszym zdaniem nie jest to dobre rozwi�zanie. Nazwa akcji jest wy�wietlana na przyciskach i ele-

mentach menu, w zwi�zku z czym mo�e si� zmienia w zale�no�ci od kaprysu projek-tanta interfejsu oraz mo�e by przet�umaczona na wiele j�zyków. Takie niesta�e �a�cu-chy nie s� dobrym wyborem w przypadku klawiszy wyszukiwania. Zalecamy wymy�lenienazw akcji niezale�nych od wy�wietlanych nazw.

Poni�ej znajduje si� zestawienie dzia�a, które trzeba wykona, aby wywo�a to samo dzia�a-nie w odpowiedzi na zdarzenie naci�ni�cia przycisku, wyboru elementu z menu lub naci�ni�-cia klawisza:

1. Utwórz podklas� klasy AbstractAction. Mo�na u�y tej samej klasy dla wieluspokrewnionych akcji.

2. Utwórz obiekt powy�szej klasy akcji.

3. Utwórz przycisk lub element menu z obiektu powy�szej klasy akcji. Konstruktorodczyta etykiet� i ikon� z tego obiektu.

4. W przypadku akcji uruchamianych przez naci�ni�cie klawisza konieczne jestwykonanie dodatkowych czynno�ci. Najpierw nale�y zlokalizowa komponentnajwy�szego poziomu w oknie, np. panel zawieraj�cy wszystkie pozosta�e elementy.

5. Pobierz map� WHEN_ANCESTOR_OF_FOCUSED_COMPONENT komponentu najwy�szegopoziomu. Utwórz obiekt klasy KeyStroke reprezentuj�cy odpowiedni skrótklawiaturowy. Utwórz obiekt b�d�cy kluczem dzia�ania, np. �acuch opisuj�cyakcj�. Wstaw niniejsz� par� danych (klawisz, klucz dzia�ania) do mapy wej�cia.

6. Pobierz map� akcji komponentu najwy�szego poziomu. Dodaj par� klucz akcji– obiekt akcji do tej mapy.

Listing 8.3 przedstawia kompletny kod programu mapuj�cego przyciski i klawisze na obiektyakcji. Mo�na go wypróbowa — klikni�cie jednego z przycisków lub naci�ni�cie kombinacjiklawiszy Ctrl+Z, Ctrl+N lub Ctrl+C spowoduje zmian� koloru panelu.

Listing 8.3. ActionTest.java

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

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

Rozdzia� 8. � Obs�uga zdarze� 379

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

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

buttonPanel = new JPanel();

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

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

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

// Powi�zanie klawiszy Z, N i C z nazwami. InputMap imap = buttonPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_ �COMPONENT); imap.put(KeyStroke.getKeyStroke("ctrl Z"), "panel.yellow"); imap.put(KeyStroke.getKeyStroke("ctrl N"), "panel.blue"); imap.put(KeyStroke.getKeyStroke("ctrl C"), "panel.red");

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

380 Java. Podstawy

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

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

private JPanel buttonPanel;

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

javax.swing.Action 1.2

� boolean isEnabled()

� void setEnabled(boolean b)

Pobiera lub ustawia w�asno� enabled akcji.

� void putValue(String key, Object value)

Wstawia par� nazwa – warto� do obiektu akcji.

Parametry: key Nazwa w�asno�ci, która ma zosta zapisana z obiektemakcji. Mo�e to by dowolny �acuch, ale jest kilka nazwo z góry zdefiniowanym znaczeniu — zobacz tabel� 8.1na stronie 375.

value Obiekt powi�zany z nazw�.

� Object getValue(String key)

Zwraca warto� z zapisanej pary nazwa – warto�.

Rozdzia� 8. � Obs�uga zdarze� 381

javax.swing.KeyStroke 1.2

� static KeyStroke getKeyStroke(String description)

Tworzy skrót klawiaturowy z czytelnego dla cz�owieka opisu (ci�gu �acuchówrozdzielonych spacjami). Opis zaczyna si� od zera lub wi�kszej liczbymodyfikatorów shift control ctrl meta alt altGraph, a koczy si� �acuchemtyped i �acuchem sk�adaj�cym si� z jednego znaku (na przyk�ad typed a)lub opcjonalnym specyfikatorem zdarzenia (pressed — domy�lny lub released)i kodem klawisza. Kod klawisza, je�li ma przedrostek VK_, powinien odpowiadasta�ej KeyEvent, na przyk�ad INSERT odpowiada KeyEvent.VK_INSERT.

javax.swing.JComponent 1.2

� ActionMap getActionMap() 1.3

Zwraca map� wi���c� klucze mapy akcji (które mog� by dowolnymi obiektami)z obiektami klasy Action.

� InputMap getInputMap(int flag) 1.3

Pobiera map� wej�cia, która odwzorowuje klawisze w postaci kluczy mapy akcji.

Parametry: flag Warunek okre�laj�cy, kiedy element aktywny ma wywo�aakcj� — jedna z warto�ci z tabeli 8.2 na stronie 377.

Zdarzenia generowane przez myszTakie zdarzenia jak klikni�cie przycisku lub elementu w menu za pomoc� myszy nie wyma-gaj� pisania procedur obs�ugi. Niniejsze zdarzenia s� obs�ugiwane automatycznie przezró�ne elementy interfejsu u�ytkownika. Aby jednak umo�liwi rysowanie za pomoc� myszy,konieczne jest przechwycenie zdarze ruchu, klikni�cia i przeci�gania myszy.

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

Rysunek 8.7.Programobs�uguj�cyzdarzenia myszy

382 Java. Podstawy

Kiedy u�ytkownik naci�nie przycisk myszy, wywo�ywane s� trzy metody nas�uchuj�ce:mousePressed po naci�ni�ciu przycisku, mouseReleased po zwolnieniu przycisku myszyi mouseClicked. Je�li w sferze zainteresowa le�� wy��cznie pe�ne klikni�cia, pierwsze dwiez wymienionych metod mo�na pomin�. Wywo�uj�c metody getX i getY na rzecz obiektuklasy MouseEvent, mo�na sprawdzi wspó�rz�dne x i y wska�nika myszy w chwili klik-ni�cia. Do rozró�nienia pojedynczych, podwójnych i potrójnych (!) klikni� s�u�y metodagetClickCount.

Niektórzy projektanci interfejsów tworz� kombinacje klawiszy po��czone z klikni�ciamimyszk�, np. Ctrl+Shift+klikni�cie. Naszym zdaniem jest to post�powanie niegodne na�la-dowania. Osoby, które nie zgadzaj� si� z nasz� opini�, mo�e przekona fakt, �e sprawdzanieprzycisków myszy i klawiszy specjalnych jest niezwykle zagmatwanym zadaniem — nieba-wem si� o tym przekonamy.

Aby sprawdzi, które modyfikatory zosta�y ustawione, nale�y u�y maski bitowej. W ory-ginalnym API dwie maski przycisków s� równowa�ne z maskami klawiszy specjalnych,mianowicie:

BUTTON2_MASK == ALT_MASKBUTTON3_MASK == META_MASK

Zrobiono tak, aby u�ytkownicy posiadaj�cy myszk� z jednym przyciskiem mogli na�lado-wa pozosta�e przyciski za pomoc� klawiszy specjalnych (ang. modifier keys). Od Java SE 1.4zaproponowano jednak inn� metod�. Od tej pory istniej� nast�puj�ce maski:

BUTTON1_DOWN_MASKBUTTON2_DOWN_MASKBUTTON3_DOWN_MASKSHIFT_DOWN_MASKCTRL_DOWN_MASKALT_DOWN_MASKALT_GRAPH_DOWN_MASKMETA_DOWN_MASK

Metoda getModifiersEx zwraca dok�adne informacje o przyciskach myszy i klawiszach spe-cjalnych u�ytych w zdarzeniu myszy.

Pami�tajmy, �e maska BUTTON3_DOWN_MASK w systemie Windows sprawdza prawy (nie g�ówny)przycisk myszy. Na przyk�ad poni�szy fragment programu sprawdza, czy prawy przyciskmyszy jest wci�ni�ty:

if ((event.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) != 0) . . . // procedury obs�ugi zdarzenia klikni�cia prawym przyciskiem myszy

W przyk�adowym programie definiujemy zarówno metod� mousePressed, jak i mouseClicked.Je�li u�ytkownik kliknie piksel nieznajduj�cy si� w obr�bie �adnego z narysowanych kwa-dratów, zostanie dodany nowy kwadrat. Dzia�anie to zosta�o zaimplementowane w metodziemousePressed, a wi�c kwadrat pojawia si� natychmiast po klikni�ciu, przed zwolnieniemprzycisku myszy. Dwukrotne klikni�cie przyciskiem myszy w obr�bie narysowanego kwa-dratu powoduje jego usuni�cie. Implementacja tej funkcji zosta�a umieszczona w metodziemouseClicked, poniewa� konieczne jest sprawdzenie liczby klikni�:

Rozdzia� 8. � Obs�uga zdarze� 383

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

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

Kiedy kursor myszy przesuwa si� nad oknem, odbiera ono sta�y strumie zdarze ruchumyszy. Zauwa�my, �e s� osobne interfejsy MouseListener i MouseMotionListener. Wyró�nio-no je z ch�ci zwi�kszenia efektywno�ci. Kiedy u�ytkownik przesuwa mysz, powstaje ca�amasa zdarze dotycz�cych tej czynno�ci. Obiekt nas�uchuj�cy, który oczekuje na klikni�cia,nie jest zajmowany przez nieinteresuj�ce go zdarzenia ruchu.

Nasz testowy program przechwytuje zdarzenia ruchu i w odpowiedzi na nie zmienia wygl�dkursora (na krzy�yk). Odpowiedzialna jest za to metoda getPredefinedCursor z klasy Cursor.Tabela 8.3 przedstawia sta�e podawane jako argument wspomnianej funkcji oraz reprezento-wane przez nie kursory w systemie Windows.

Tabela 8.3. Przyk�adowe kursory

Ikona Sta�a Ikona Sta�a

DEFAULT_CURSOR NE_RESIZE_CURSOR

CROSSHAIR_CURSOR E_RESIZE_CURSOR

HAND_CURSOR SE_RESIZE_CURSOR

MOVE_CURSOR S_RESIZE_CURSOR

TEXT_CURSOR SW_RESIZE_CURSOR

WAIT_CURSOR W_RESIZE_CURSOR

N_RESIZE_CURSOR NW_RESIZE_CURSOR

Poni�ej znajduje si� kod �ród�owy metody mouseMoved z klasy MouseMotionListener zdefi-niowanej w naszym przyk�adowym programie:

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

384 Java. Podstawy

Mo�na zdefiniowa w�asne typy kursorów. S�u�y do tego metoda createCustom- �Cursor z klasy Toolkit:

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

�stick");

Pierwszy argument niniejszej metody okre�la plik graficzny przedstawiaj�cy kursor. Drugiwyznacza przesuni�cie punktu aktywnego kursora. Trzeci jest �a�cuchem opisuj�cymkursor. �a�cuch ten mo�e s�u�y zwi�kszeniu dost�pno�ci. Na przyk�ad program czytaj�cyz ekranu u�ywany przez osob� niedowidz�c� mo�e przeczyta opis takiego kursora.

Je�li w czasie przesuwania myszy u�ytkownik kliknie jej przycisk, generowane s� wywo�aniametody mouseDragged zamiast mouseMoved. Nasz przyk�adowy program zezwala na przeci�ga-nie kwadratów pod kursorem. Efekt ten uzyskali�my, aktualizuj�c po�o�enie przeci�ganegokwadratu, tak aby jego �rodek znajdowa� si� w tym samym miejscu co punkt centralny myszki.Nast�pnie ponownie rysujemy obszar roboczy, aby ukaza nowe po�o�enie kursora myszy.

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

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

Metoda mouseMoved jest wywo�ywana tylko wtedy, gdy kursor znajduje si� w ob- r�bie komponentu. Natomiast metoda mouseDragged jest wywo�ywana nawet wtedy,

gdy kursor opu�ci komponent.

Istniej� jeszcze dwie inne metody obs�uguj�ce zdarzenia myszy: mouseEntered i mouseExited.S� one wywo�ywane, gdy kursor myszy wchodzi do komponentu lub go opuszcza.

Na zakoczenie wyja�nimy sposób nas�uchiwania zdarze generowanych przez mysz. Klik-ni�cia przyciskiem myszy s� raportowane przez metod� mouseClicked nale��c� do interfejsuMouseListener. Poniewa� wiele aplikacji korzysta wy��cznie z klikni� myszk� i wyst�puj�one bardzo cz�sto, zdarzenia ruchu myszy i przeci�gania zosta�y zdefiniowane w osobnyminterfejsie o nazwie MouseMotionListener.

W naszym programie interesuj� nas oba rodzaje zdarze generowanych przez mysz. Zdefi-niowali�my dwie klasy wewn�trzne o nazwach MouseHandler i MouseMotionHandler. Pierwszaz nich jest podklas� klasy MouseAdapter, poniewa� definiuje tylko dwie z pi�ciu metod interfej-su MouseListener. Klasa MouseMotionHandler implementuje interfejs MouseMotionListener,co znaczy, �e zawiera definicje obu jego metod. Listing 8.4 przedstawia kod �ród�owy oma-wianego programu.

Rozdzia� 8. � Obs�uga zdarze� 385

Listing 8.4. MouseTest.java

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

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

/** * Ramka zawieraj�ca panel testuj�cy dzia�ania myszy. */class MouseFrame extends JFrame{ public MouseFrame() { setTitle("MouseTest"); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

// Dodanie komponentu do ramki.

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

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

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

386 Java. Podstawy

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

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

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

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

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

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

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

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

Rozdzia� 8. � Obs�uga zdarze� 387

// Kwadrat zawieraj�cy kursor myszy.

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

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

private class MouseMotionHandler implements MouseMotionListener { public void mouseMoved(MouseEvent event) { // Ustawienie kursora na krzy�yk, je�li znajduje si� wewn�trz // kwadratu.

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

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

// Przeci�gni�cie aktualnego kwadratu w celu wycentrowania go w punkcie (x, y). current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, �SIDELENGTH); repaint(); } } }}

java.awt.event.MouseEvent 1.1

� int getX()

� int getY()

� Point getPoint()

Zwraca wspó�rz�dne x (pozioma) i y (pionowa) lub punkt, w którym mia�o miejscezdarzenie, mierz�c od lewego górnego rogu komponentu b�d�cego �ród�emzdarzenia.

388 Java. Podstawy

� int getClickCount()

Zwraca liczb� kolejnych klikni� przyciskiem myszy zwi�zanych z danymzdarzeniem (odst�p czasu oddzielaj�cy zdarzenia okre�lane jako kolejne zale�yod systemu).

java.awt.event.InputEvent 1.1

� int getModifiersEx() 1.4

Zwraca rozszerzone modyfikatory zdarzenia. Do sprawdzania zwróconychwarto�ci s�u�� nast�puj�ce maski:

BUTTON1_DOWN_MASKBUTTON2_DOWN_MASKBUTTON3_DOWN_MASKSHIFT_DOWN_MASKCTRL_DOWN_MASKALT_DOWN_MASKALT_GRAPH_DOWN_MASKMETA_DOWN_MASK

� static String getModifiersExText(int modifiers) 1.4

Zwraca �acuch typu Shift+Button1 opisuj�cy rozszerzone modyfikatory wdanym zbiorze znaczników.

java.awt.Toolkit 1.0

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

Tworzy nowy obiekt niestandardowego kursora.

Parametry: image Obraz reprezentuj�cy kursor

hotSpot Punkt centralny kursora (na przyk�ad kocówka strza�kilub �rodek krzy�yka)

name Opis kursora wspomagaj�cy dost�pno� w specjalnych�rodowiskach

java.awt.Component 1.0

� public void setCursor(Cursor cursor) 1.1

Ustawia obraz kursora na okre�lony kursor.

Hierarchia zdarze� w bibliotece AWTMaj�c ju� pewne rozeznanie w temacie obs�ugi zdarze, na zakoczenie niniejszego rozdzia�uzrobimy krótki przegl�d architektury obs�ugi zdarze biblioteki AWT.

Rozdzia� 8. � Obs�uga zdarze� 389

Jak wspominali�my wcze�niej, zdarzenia w Javie s� obs�ugiwane w metodologii obiektowej,a wszystkie zdarzenia pochodz� od klasy EventObject z pakietu java.util (nazw� wspólnejnadklasy nie jest Event, poniewa� tak� nazw� nosi klasa zdarze w starym modelu zdarze— mimo �e model ten jest obecnie odradzany, jego klasy nadal wchodz� w sk�ad biblio-teki Javy).

Klasa EventObject posiada podklas� AWTEvent b�d�c� nadklas� wszystkich klas zdarzenio-wych AWT. Rysunek 8.8 przedstawia diagram dziedziczenia zdarze AWT.

Rysunek 8.8. Diagram dziedziczenia klas zdarzeniowych AWT

Niektóre komponenty Swing generuj� obiekty zdarzeniowe jeszcze innych typów zdarze.Rozszerzaj� one bezpo�rednio klas� EventObject, a nie AWTEvent.

390 Java. Podstawy

Obiekty zdarzeniowe zawieraj� informacje o zdarzeniach przesy�anych przez �ród�o zda-rze do swoich s�uchaczy. W razie potrzeby mo�na przeanalizowa obiekty zdarzeniowe,które zosta�y przekazane do obiektów nas�uchuj�cych, co zrobili�my w przyk�adzie z przy-ciskiem za pomoc� metod getSource i getActionCommands.

Niektóre klasy zdarzeniowe AWT s� dla programisty Javy bezu�yteczne. Na przyk�ad biblio-teka AWT wstawia do kolejki zdarze obiekty PaintEvent, ale obiekty te nie s� dostarczanedo s�uchaczy. Programi�ci Javy nie nas�uchuj� zdarze rysowania. Przes�aniaj� oni metod�paintComponent, aby móc kontrolowa ponowne rysowanie. Ponadto AWT generuje pewnezdarzenia, 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. Zdarzeniesemantyczne jest dzie�em u�ytkownika ( jest to np. klikni�cie przycisku). Dlatego zdarzenieActionEvent jest zdarzeniem semantycznym. Zdarzenia niskiego poziomu to takie zdarze-nia, które umo�liwiaj� zaistnienie zdarze semantycznych. W przypadku klikni�cia przyci-sku jest to jego naci�ni�cie, szereg ruchów mysz� i zwolnienie (ale tylko je�li zwolnienienast�pi w obr�bie przycisku). Mo�e to by naci�ni�cie klawisza maj�ce miejsce po wybra-niu przycisku przez u�ytkownika za pomoc� klawisza Tab i naci�ni�cia go za pomoc� spa-cji. Podobnie semantycznym zdarzeniem jest przesuni�cie paska przewijania, a ruch mysz�jest zdarzeniem niskiego poziomu.

Poni�ej znajduje si� lista najcz��ciej u�ywanych klas zdarze semantycznych pakietujava.awt.event:

� ActionEvent — klikni�cie przycisku, wybór elementu z menu, wybór elementulisty, naci�ni�cie klawisza Enter w polu tekstowym.

� AdjustmentEvent — przesuni�cie paska przewijania.

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

Do najcz��ciej u�ywanych klas zdarze niskiego poziomu zaliczaj� si�:

� KeyEvent — naci�ni�cie lub zwolnienie klawisza.

� MouseEvent — naci�ni�cie lub zwolnienie przycisku myszy, poruszenielub przeci�gni�cie mysz�.

� MouseWheelEvent — pokr�cenie kó�kiem myszy.

� FocusEvent — uaktywnienie lub dezaktywacja elementu.

� WindowEvent— zmiana stanu okna.

Niniejszych zdarze nas�uchuj� nast�puj�ce interfejsy:ActionListenerAdjustmentListenerFocusListenerItemListener

Rozdzia� 8. � Obs�uga zdarze� 391

KeyListenerMouseListenerMouseMotionListenerMouseWheelListenerWindowListenerWindowFocusListenerWindowStateListener

Niektóre interfejsy nas�uchuj�ce AWT, te zawieraj�ce wi�cej ni� jedn� metod�, posiadaj� od-powiadaj�ce im klasy adaptacyjne, które implementuj� wszystkie ich metody (pozosta�e inter-fejsy maj� tylko jedn� metod�, a wi�c utworzenie dla nich klas adaptacyjnych nie da�oby�adnych korzy�ci). Poni�sze klasy adaptacyjne s� cz�sto u�ywane:

FocusAdapterKeyAdapterMouseAdapterMouseMotionAdapterWindowAdapter

Tabela 8.4 przedstawia najwa�niejsze interfejsy nas�uchowe, zdarzenia i �ród�a zdarze bi-blioteki AWT.

Tabela 8.4. Obs�uga zdarze�

Interfejs Metody Parametry/metody dost�pu

Zdarzeniagenerowane przez

ActionListener actionPerformed ActionEvent

getActionCommand

getModifiers

AbstractButton

JComboBox

JTextField

Timer

AdjustmentListener adjustmentValueChanged AdjustmentEvent

getAdjustable

getAdjustmentType

getValue

JScrollbar

ItemListener itemStateChanged ItemEvent

getItem

getItemSelectable

getStateChange

AbstractButton

JComboBox

FocusListener focusGained

focusLost

FocusEvent

isTemporary

Component

KeyListener keyPressed

keyReleased

keyTyped

KeyEvent

getKeyChar

getKeyCode

getKeyModifiersText

getKeyText

isActionText

Component

392 Java. Podstawy

Tabela 8.4. Obs�uga zdarze� (ci�g dalszy)

Interfejs Metody Parametry/metody dost�pu

Zdarzeniagenerowane 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 nast�pnym rozdziale.

Na tym zakoczymy opis technik obs�ugi zdarze AWT. W nast�pnym rozdziale nauczymysi� wykorzystywa najpopularniejsze komponenty Swinga oraz szczegó�owo przeanalizu-jemy generowane przez nie zdarzenia.