Darmowy fragment publikacji:
Tytuł oryginału: Core Java, Volume II - Advanced Features (9th Edition)
Tłumaczenie: Jaromir Senczyk
ISBN: 978-83-246-7762-7
Authorized translation from the English language edition, entitled CORE JAVA, VOLUME II –
ADVANCED FEATURES, Ninth Edition; ISBN 013708160X; by Cay S. Horstmann; and Gary
Cornell; published by Pearson Education, Inc, publishing as Prentice Hall.
Copyright © 2013 by Oracle and/or its affiliates, 500 Oracle Parkway, Redwood Shores, CA 94065.
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any
means, electronic or mechanical, including photocopying, recording or by any information storage
retrieval system, without permission from Pearson Education Inc.
Polish language edition published by HELION S.A. Copyright © 2013.
Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej
publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną,
fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje
naruszenie praw autorskich niniejszej publikacji.
Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi
ich właścicieli.
Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje
były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani
za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo
HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe
z wykorzystania informacji zawartych w książce.
Wydawnictwo HELION
ul. Kościuszki 1c, 44-100 GLIWICE
tel. 032 231 22 19, 032 230 98 63
e-mail: helion@helion.pl
WWW: http://helion.pl (księgarnia internetowa, katalog książek)
Pliki z przykładami omawianymi w książce można znaleźć pod adresem:
ftp://ftp.helion.pl/przyklady/javtz9.zip
Drogi Czytelniku!
Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http://helion.pl/user/opinie/javtz9
Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.
Printed in Poland.
• Kup książkę
• Poleć książkę
• Oceń książkę
• Księgarnia internetowa
• Lubię to! » Nasza społeczność
Spis tre(cid:202)ci
Przedmowa ..............................................................................................................................................11
Podzi(cid:194)kowania .........................................................................................................................................15
Rozdzia(cid:196) 1. Strumienie i pliki ...................................................................................................................17
1.1. Strumienie .................................................................................................... 17
1.1.1. Odczyt i zapis bajtów .......................................................................... 18
1.1.2. Zoo pe(cid:228)ne strumieni ........................................................................... 20
1.1.3. (cid:227)(cid:241)czenie filtrów strumieni ................................................................... 24
1.2. Strumienie tekstowe ....................................................................................... 28
1.2.1. Zapisywanie tekstu ............................................................................ 28
1.2.2. Wczytywanie tekstu ............................................................................ 31
1.2.3. Zapis obiektów w formacie tekstowym ................................................. 31
1.2.4. Zbiory znaków .................................................................................... 34
1.3. Odczyt i zapis danych binarnych ....................................................................... 39
1.3.1. Strumienie plików o swobodnym dost(cid:246)pie ............................................ 42
1.4.
Archiwa ZIP .................................................................................................... 46
1.5. Strumienie obiektów i serializacja .................................................................... 49
1.5.1. Format pliku serializacji obiektów ........................................................ 54
1.5.2. Modyfikowanie domy(cid:264)lnego mechanizmu serializacji ............................. 60
1.5.3. Serializacja singletonów i wylicze(cid:254) ....................................................... 62
1.5.4. Wersje .............................................................................................. 63
1.5.5. Serializacja w roli klonowania .............................................................. 65
Zarz(cid:241)dzanie plikami ........................................................................................ 68
1.6.1. (cid:263)cie(cid:276)ki dost(cid:246)pu ................................................................................. 68
1.6.2. Odczyt i zapis plików .......................................................................... 70
1.6.3. Kopiowanie, przenoszenie i usuwanie plików ........................................ 72
1.6.4. Tworzenie plików i katalogów .............................................................. 72
1.6.5.
Informacje o plikach ........................................................................... 74
1.6.6. Przegl(cid:241)danie plików w katalogu ........................................................... 75
1.6.7. Systemy plików ZIP ............................................................................ 78
1.7. Mapowanie plików w pami(cid:246)ci ........................................................................... 79
1.7.1. Struktura bufora danych ..................................................................... 86
1.7.2. Blokowanie plików .............................................................................. 88
1.8. Wyra(cid:276)enia regularne ........................................................................................ 90
1.6.
Kup książkęPoleć książkę4
Java. Techniki zaawansowane
2.7.
Rozdzia(cid:196) 2. J(cid:194)zyk XML ............................................................................................................................101
2.1. Wprowadzenie do j(cid:246)zyka XML ........................................................................ 102
2.1.1. Struktura dokumentu XML ................................................................ 104
2.2.
Parsowanie dokumentów XML ....................................................................... 107
2.3. Kontrola poprawno(cid:264)ci dokumentów XML ......................................................... 118
2.3.1. Definicje typów dokumentów ............................................................. 119
2.3.2. XML Schema ................................................................................... 126
2.3.3. Praktyczny przyk(cid:228)ad .......................................................................... 129
2.4. Wyszukiwanie informacji i XPath ..................................................................... 142
2.5.
Przestrzenie nazw ......................................................................................... 148
Parsery strumieniowe .................................................................................... 150
2.6.
2.6.1. Wykorzystanie parsera SAX ............................................................... 151
2.6.2. Wykorzystanie parsera StAX .............................................................. 156
Tworzenie dokumentów XML .......................................................................... 160
2.7.1. Dokumenty bez przestrzeni nazw ....................................................... 160
2.7.2. Dokumenty z przestrzeni(cid:241) nazw ......................................................... 160
2.7.3. Zapisywanie dokumentu ................................................................... 161
2.7.4. Przyk(cid:228)ad: tworzenie pliku SVG ............................................................ 162
2.7.5. Tworzenie dokumentu XML za pomoc(cid:241) parsera StAX ........................... 165
Przekszta(cid:228)cenia XSL ...................................................................................... 172
Rozdzia(cid:196) 3. Programowanie aplikacji sieciowych ...............................................................................183
Po(cid:228)(cid:241)czenia z serwerem .................................................................................. 183
3.1.1. Limity czasu gniazd .......................................................................... 187
3.1.2. Adresy internetowe .......................................................................... 189
Implementacja serwerów ............................................................................... 191
3.2.1. Obs(cid:228)uga wielu klientów ..................................................................... 194
3.2.2. Po(cid:228)(cid:241)czenia cz(cid:246)(cid:264)ciowo zamkni(cid:246)te ....................................................... 196
Przerywanie dzia(cid:228)ania gniazd sieciowych ......................................................... 198
Po(cid:228)(cid:241)czenia wykorzystuj(cid:241)ce URL ...................................................................... 204
3.4.1. URL i URI ........................................................................................ 205
3.4.2. Zastosowanie klasy URLConnection do pobierania informacji .............. 207
3.4.3. Wysy(cid:228)anie danych do formularzy ........................................................ 216
3.5. Wysy(cid:228)anie poczty elektronicznej ..................................................................... 222
Rozdzia(cid:196) 4. Programowanie baz danych: JDBC ...................................................................................227
Architektura JDBC ......................................................................................... 228
4.1.1. Typy sterowników JDBC .................................................................... 228
4.1.2. Typowe zastosowania JDBC .............................................................. 229
J(cid:246)zyk SQL .................................................................................................... 231
Instalacja JDBC ............................................................................................ 235
4.3.1. Adresy URL baz danych .................................................................... 237
4.3.2. Pliki JAR zawieraj(cid:241)ce sterownik ......................................................... 237
4.3.3. Uruchamianie bazy danych ................................................................ 237
4.3.4. Rejestracja klasy sterownika ............................................................. 238
4.3.5. Nawi(cid:241)zywanie po(cid:228)(cid:241)czenia z baz(cid:241) danych ............................................ 239
4.4. Wykonywanie polece(cid:254) j(cid:246)zyka SQL .................................................................. 242
4.4.1. Zarz(cid:241)dzanie po(cid:228)(cid:241)czeniami, poleceniami i zbiorami wyników .................. 245
4.4.2. Analiza wyj(cid:241)tków SQL ....................................................................... 246
4.4.3. Wype(cid:228)nianie bazy danych .................................................................. 248
3.3.
3.4.
4.2.
4.3.
2.8.
3.1.
3.2.
4.1.
Kup książkęPoleć książkę
Spis tre(cid:202)ci
5
4.6.
5.1.
5.2.
4.5. Wykonywanie zapyta(cid:254) ................................................................................... 252
4.5.1. Polecenia przygotowane ................................................................... 252
4.5.2. Odczyt i zapis du(cid:276)ych obiektów .......................................................... 258
4.5.3. Sekwencje steruj(cid:241)ce ........................................................................ 260
4.5.4. Zapytania o wielu zbiorach wyników ................................................... 261
4.5.5. Pobieranie warto(cid:264)ci kluczy wygenerowanych automatycznie ................. 262
Przewijalne i aktualizowalne zbiory wyników zapyta(cid:254) ........................................ 263
4.6.1. Przewijalne zbiory wyników ................................................................ 263
4.6.2. Aktualizowalne zbiory rekordów ......................................................... 265
Zbiory rekordów ............................................................................................ 270
4.7.1. Tworzenie zbiorów rekordów .............................................................. 270
4.7.2. Buforowane zbiory rekordów .............................................................. 271
4.8. Metadane .................................................................................................... 274
Transakcje ................................................................................................... 283
4.9.
4.9.1. Punkty kontrolne .............................................................................. 284
4.9.2. Aktualizacje wsadowe ....................................................................... 284
4.9.3. Zaawansowane typy j(cid:246)zyka SQL ........................................................ 287
4.10. Zaawansowane zarz(cid:241)dzanie po(cid:228)(cid:241)czeniami ....................................................... 288
Rozdzia(cid:196) 5. Internacjonalizacja .............................................................................................................291
Lokalizatory .................................................................................................. 292
Formaty liczb ................................................................................................ 297
5.2.1. Waluty ............................................................................................... 302
5.3. Data i czas ................................................................................................... 304
Porz(cid:241)dek alfabetyczny ................................................................................... 311
5.4.
5.4.1. Moc uporz(cid:241)dkowania ........................................................................ 312
5.4.2. Rozk(cid:228)ad ........................................................................................... 313
Formatowanie komunikatów .......................................................................... 318
5.5.1. Formatowanie z wariantami ............................................................... 320
Pliki tekstowe i zbiory znaków ........................................................................ 322
5.6.1.
Internacjonalizacja a pliki (cid:274)ród(cid:228)owe programów ................................... 322
5.7. Komplety zasobów ........................................................................................ 324
5.7.1. Wyszukiwanie kompletów zasobów .................................................... 324
5.7.2. Pliki w(cid:228)a(cid:264)ciwo(cid:264)ci .............................................................................. 325
5.7.3. Klasy kompletów zasobów ................................................................ 326
5.8. Kompletny przyk(cid:228)ad ....................................................................................... 328
Rozdzia(cid:196) 6. Zaawansowane mo(cid:209)liwo(cid:202)ci pakietu Swing ......................................................................343
Listy ............................................................................................................ 343
6.1.1. Komponent JList .............................................................................. 344
6.1.2. Modele list ...................................................................................... 349
6.1.3. Wstawianie i usuwanie ..................................................................... 354
6.1.4. Odrysowywanie zawarto(cid:264)ci listy ......................................................... 355
Tabele ......................................................................................................... 359
6.2.1. Najprostsze tabele ........................................................................... 359
6.2.2. Modele tabel ................................................................................... 363
6.2.3. Wiersze i kolumny ............................................................................ 367
6.2.4. Rysowanie i edycja komórek ............................................................. 383
6.3. Drzewa ........................................................................................................ 394
6.3.1. Najprostsze drzewa .......................................................................... 395
6.3.2. Przegl(cid:241)danie w(cid:246)z(cid:228)ów ......................................................................... 410
5.5.
5.6.
4.7.
6.1.
6.2.
Kup książkęPoleć książkę6
Java. Techniki zaawansowane
7.1.
7.2.
6.3.3. Rysowanie w(cid:246)z(cid:228)ów ............................................................................ 412
6.3.4. Nas(cid:228)uchiwanie zdarze(cid:254) w drzewach ................................................... 415
6.3.5. W(cid:228)asne modele drzew ...................................................................... 421
6.4. Komponenty tekstowe ................................................................................... 429
6.4.1. (cid:263)ledzenie zmian zawarto(cid:264)ci komponentów tekstowych ........................ 430
6.4.2. Sformatowane pola wej(cid:264)ciowe .......................................................... 433
6.4.3. Komponent JSpinner ........................................................................ 449
6.4.4. Prezentacja HTML za pomoc(cid:241) JEditorPane ......................................... 457
6.5. Wska(cid:274)niki post(cid:246)pu ........................................................................................ 463
6.5.1. Paski post(cid:246)pu ................................................................................. 463
6.5.2. Monitory post(cid:246)pu ............................................................................. 466
6.5.3. Monitorowanie post(cid:246)pu strumieni wej(cid:264)cia .......................................... 469
6.6. Organizatory komponentów i dekoratory .......................................................... 474
6.6.1. Panele dzielone ............................................................................... 475
6.6.2. Panele z zak(cid:228)adkami ......................................................................... 478
6.6.3. Panele pulpitu i ramki wewn(cid:246)trzne ..................................................... 483
6.6.4. Rozmieszczenie kaskadowe i s(cid:241)siaduj(cid:241)ce .......................................... 487
6.6.5. Zg(cid:228)aszanie weta do zmiany w(cid:228)a(cid:264)ciwo(cid:264)ci ............................................. 495
Rozdzia(cid:196) 7. Zaawansowane mo(cid:209)liwo(cid:202)ci biblioteki AWT ......................................................................505
Potokowe tworzenie grafiki ............................................................................ 506
Figury .......................................................................................................... 508
7.2.1. Wykorzystanie klas obiektów graficznych ............................................ 511
Pola ............................................................................................................ 523
7.3.
7.4. (cid:263)lad p(cid:246)dzla .................................................................................................. 524
7.5. Wype(cid:228)nienia ................................................................................................. 532
Przekszta(cid:228)cenia uk(cid:228)adu wspó(cid:228)rz(cid:246)dnych ............................................................ 534
7.6.
7.7.
Przycinanie ................................................................................................... 539
7.8.
Przezroczysto(cid:264)(cid:232) i sk(cid:228)adanie obrazów .............................................................. 541
7.9. Wskazówki operacji graficznych ...................................................................... 549
7.10. Czytanie i zapisywanie plików graficznych ........................................................ 555
7.10.1. Wykorzystanie obiektów zapisu i odczytu plików graficznych ................. 555
7.10.2. Odczyt i zapis plików zawieraj(cid:241)cych sekwencje obrazów ....................... 560
7.11. Operacje na obrazach ................................................................................... 565
7.11.1. Dost(cid:246)p do danych obrazu ................................................................. 565
7.11.2. Filtrowanie obrazów .......................................................................... 571
7.12. Drukowanie .................................................................................................. 580
7.12.1. Drukowanie grafiki ........................................................................... 580
7.12.2. Drukowanie wielu stron .................................................................... 589
7.12.3. Podgl(cid:241)d wydruku .............................................................................. 591
7.12.4. Us(cid:228)ugi drukowania ............................................................................ 599
7.12.5. Us(cid:228)ugi drukowania za po(cid:264)rednictwem strumieni .................................. 603
7.12.6. Atrybuty drukowania ......................................................................... 604
7.13. Schowek ...................................................................................................... 610
7.13.1. Klasy i interfejsy umo(cid:276)liwiaj(cid:241)ce przekazywanie danych ........................ 611
7.13.2. Przekazywanie tekstu ....................................................................... 612
7.13.3. Interfejs Transferable i formaty danych .............................................. 615
7.13.4. Przekazywanie obrazów za pomoc(cid:241) schowka ...................................... 617
7.13.5. Wykorzystanie schowka systemowego do przekazywania obiektów Java ..... 621
7.13.6. Zastosowanie lokalnego schowka do przekazywania
referencji obiektów ........................................................................... 624
Kup książkęPoleć książkę
Spis tre(cid:202)ci
7
7.15.
7.14. Mechanizm „przeci(cid:241)gnij i upu(cid:264)(cid:232)” ................................................................... 625
7.14.1. Przekazywanie danych pomi(cid:246)dzy komponentami Swing ........................ 627
7.14.2. (cid:273)ród(cid:228)a przeci(cid:241)ganych danych ............................................................. 631
7.14.3. Cele upuszczanych danych ................................................................ 633
Integracja z macierzyst(cid:241) platform(cid:241) ................................................................. 641
7.15.1. Ekran powitalny ............................................................................... 641
7.15.2. Uruchamianie macierzystych aplikacji pulpitu ..................................... 646
7.15.3. Zasobnik systemowy ........................................................................ 651
Rozdzia(cid:196) 8. JavaBeans ..........................................................................................................................657
8.1. Dlaczego ziarnka? ......................................................................................... 658
8.2.
Proces tworzenia ziarnek JavaBeans .............................................................. 660
8.3. Wykorzystanie ziarnek do tworzenia aplikacji ................................................... 662
8.3.1. Umieszczanie ziarnek w plikach JAR .................................................. 663
8.3.2. Korzystanie z ziarnek ........................................................................ 664
8.4. Wzorce nazw w(cid:228)a(cid:264)ciwo(cid:264)ci ziarnek i zdarze(cid:254) ..................................................... 669
Typy w(cid:228)a(cid:264)ciwo(cid:264)ci ziarnek ............................................................................... 673
8.5.
8.5.1. W(cid:228)a(cid:264)ciwo(cid:264)ci proste .......................................................................... 673
8.5.2. W(cid:228)a(cid:264)ciwo(cid:264)ci indeksowane ................................................................. 674
8.5.3. W(cid:228)a(cid:264)ciwo(cid:264)ci powi(cid:241)zane .................................................................... 674
8.5.4. W(cid:228)a(cid:264)ciwo(cid:264)ci ograniczone .................................................................. 676
8.6. Klasa informacyjna ziarnka ............................................................................ 683
Edytory w(cid:228)a(cid:264)ciwo(cid:264)ci ...................................................................................... 687
8.7.
8.7.1.
Implementacja edytora w(cid:228)a(cid:264)ciwo(cid:264)ci ................................................... 690
Indywidualizacja ziarnka ................................................................................ 697
8.8.1.
Implementacja klasy indywidualizacji ................................................. 699
Trwa(cid:228)o(cid:264)(cid:232) ziarnek JavaBeans .......................................................................... 705
8.9.1. Zastosowanie mechanizmu trwa(cid:228)o(cid:264)ci JavaBeans dla dowolnych danych ..... 709
8.9.2. Kompletny przyk(cid:228)ad zastosowania trwa(cid:228)o(cid:264)ci JavaBeans ....................... 715
Rozdzia(cid:196) 9. Bezpiecze(cid:198)stwo .................................................................................................................727
(cid:227)adowanie klas ............................................................................................ 728
9.1.1. Hierarchia klas (cid:228)adowania ................................................................. 730
9.1.2. Zastosowanie procedur (cid:228)aduj(cid:241)cych w roli przestrzeni nazw ................... 732
9.1.3.
Implementacja w(cid:228)asnej procedury (cid:228)aduj(cid:241)cej ........................................ 733
9.2. Weryfikacja kodu maszyny wirtualnej .............................................................. 738
9.3. Mened(cid:276)ery bezpiecze(cid:254)stwa i pozwolenia ......................................................... 742
9.3.1. Bezpiecze(cid:254)stwo na platformie Java ................................................... 744
9.3.2. Pliki polityki bezpiecze(cid:254)stwa ............................................................. 747
9.3.3. Tworzenie w(cid:228)asnych klas pozwole(cid:254) .................................................... 755
9.3.4.
Implementacja klasy pozwole(cid:254) .......................................................... 756
9.4. Uwierzytelnianie u(cid:276)ytkowników ....................................................................... 762
9.4.1. Modu(cid:228)y JAAS .................................................................................... 767
Podpis cyfrowy ............................................................................................. 776
9.5.1. Skróty wiadomo(cid:264)ci ........................................................................... 777
9.5.2. Podpisywanie wiadomo(cid:264)ci ................................................................ 779
9.5.3. Weryfikacja podpisu ......................................................................... 781
9.5.4. Problem uwierzytelniania .................................................................. 784
9.5.5. Podpisywanie certyfikatów ................................................................ 786
9.5.6. (cid:275)(cid:241)dania certyfikatu .......................................................................... 787
9.1.
8.8.
8.9.
9.5.
Kup książkęPoleć książkę8
Java. Techniki zaawansowane
9.6.
10.2.
Podpisywanie kodu ....................................................................................... 788
9.6.1. Podpisywanie plików JAR .................................................................. 789
9.6.2. Certyfikaty twórców oprogramowania ................................................. 793
9.7. Szyfrowanie .................................................................................................. 795
9.7.1. Szyfrowanie symetryczne .................................................................. 795
9.7.2. Generowanie klucza ......................................................................... 797
9.7.3. Strumienie szyfruj(cid:241)ce ....................................................................... 801
9.7.4. Szyfrowanie kluczem publicznym ....................................................... 803
Rozdzia(cid:196) 10. Skrypty, kompilacja i adnotacje ......................................................................................807
10.1. Skrypty na platformie Java ............................................................................. 807
10.1.1. Wybór silnika skryptów ..................................................................... 808
10.1.2. Wykonywanie skryptów i wi(cid:241)zania zmiennych ...................................... 809
10.1.3. Przekierowanie wej(cid:264)cia i wyj(cid:264)cia ........................................................ 811
10.1.4. Wywo(cid:228)ywanie funkcji i metod skryptów ............................................... 812
10.1.5. Kompilacja skryptu ........................................................................... 814
10.1.6. Przyk(cid:228)ad: skrypty i graficzny interfejs u(cid:276)ytkownika ................................ 815
Interfejs kompilatora ..................................................................................... 819
10.2.1. Kompilacja w najprostszy sposób ...................................................... 820
10.2.2. Stosowanie zada(cid:254) kompilacji ............................................................ 820
10.2.3. Przyk(cid:228)ad: dynamiczne tworzenie kodu w j(cid:246)zyku Java ............................ 826
10.3. Stosowanie adnotacji .................................................................................... 830
10.3.1. Przyk(cid:228)ad: adnotacje obs(cid:228)ugi zdarze(cid:254) ................................................... 832
10.4. Sk(cid:228)adnia adnotacji ........................................................................................ 837
10.5. Adnotacje standardowe ................................................................................. 841
10.5.1. Adnotacje kompilacji ........................................................................ 842
10.5.2. Adnotacje zarz(cid:241)dzania zasobami ....................................................... 842
10.5.3. Metaadnotacje ................................................................................. 843
10.6. Przetwarzanie adnotacji w kodzie (cid:274)ród(cid:228)owym ................................................... 845
10.7. In(cid:276)ynieria kodu bajtowego ............................................................................. 851
10.7.1. Modyfikacja kodu bajtowego podczas (cid:228)adowania ................................. 857
Rozdzia(cid:196) 11. Obiekty rozproszone ..........................................................................................................861
11.1. Role klienta i serwera ................................................................................... 862
11.2. Wywo(cid:228)ania zdalnych metod ............................................................................ 864
11.2.1. Namiastka i szeregowanie parametrów .............................................. 864
11.3. Model programowania RMI ............................................................................ 866
11.3.1. Interfejsy i implementacje ................................................................. 866
11.3.2. Rejestr RMI ..................................................................................... 868
11.3.3. Przygotowanie wdro(cid:276)enia .................................................................. 871
11.3.4. Rejestrowanie aktywno(cid:264)ci RMI .......................................................... 874
11.4. Parametry zdalnych metod i warto(cid:264)ci zwracane ............................................... 876
11.4.1. Przekazywanie obiektów zdalnych ...................................................... 876
11.4.2. Przekazywanie obiektów, które nie s(cid:241) zdalne ...................................... 876
11.4.3. Dynamiczne (cid:228)adowanie klas .............................................................. 878
11.4.4. Zdalne referencje obiektów o wielu interfejsach .................................. 883
11.4.5. Zdalne obiekty i metody equals, hashCode oraz clone ........................ 884
11.5. Aktywacja zdalnych obiektów ......................................................................... 884
Kup książkęPoleć książkę
Spis tre(cid:202)ci
9
Rozdzia(cid:196) 12. Metody macierzyste ..........................................................................................................891
12.1. Wywo(cid:228)ania funkcji j(cid:246)zyka C z programów w j(cid:246)zyku Java ..................................... 892
12.2. Numeryczne parametry metod i warto(cid:264)ci zwracane .......................................... 898
12.2.1. Wykorzystanie funkcji printf do formatowania liczb .............................. 899
12.3. (cid:227)a(cid:254)cuchy znaków jako parametry ................................................................... 900
12.4. Dost(cid:246)p do sk(cid:228)adowych obiektu ...................................................................... 906
12.4.1. Dost(cid:246)p do pól instancji ..................................................................... 906
12.4.2. Dost(cid:246)p do pól statycznych ................................................................ 910
12.5. Sygnatury ..................................................................................................... 911
12.6. Wywo(cid:228)ywanie metod j(cid:246)zyka Java ..................................................................... 912
12.6.1. Wywo(cid:228)ywanie metod obiektów ........................................................... 912
12.6.2. Wywo(cid:228)ywanie metod statycznych ........................................................ 916
12.6.3. Konstruktory .................................................................................... 917
12.6.4. Alternatywne sposoby wywo(cid:228)ywania metod ......................................... 917
12.7. Tablice ........................................................................................................ 919
12.8. Obs(cid:228)uga b(cid:228)(cid:246)dów ............................................................................................ 923
12.9.
Interfejs programowy wywo(cid:228)a(cid:254) j(cid:246)zyka Java ...................................................... 927
12.10. Kompletny przyk(cid:228)ad: dost(cid:246)p do rejestru systemu Windows ............................... 932
12.10.1. Rejestr systemu Windows ............................................................... 933
12.10.2. Interfejs dost(cid:246)pu do rejestru na platformie Java ................................ 934
12.10.3. Implementacja dost(cid:246)pu do rejestru za pomoc(cid:241) metod macierzystych .... 935
Skorowidz .............................................................................................................................................949
Kup książkęPoleć książkę10
Java. Techniki zaawansowane
Kup książkęPoleć książkę7
Zaawansowane mo(cid:209)liwo(cid:202)ci
biblioteki AWT
W tym rozdziale:
(cid:81) Potokowe tworzenie grafiki.
(cid:81) Figury.
(cid:81) Pola.
(cid:81) (cid:285)lad p(cid:266)dzla.
(cid:81) Wype(cid:225)nianie.
(cid:81) Przekszta(cid:225)cenia uk(cid:225)adu wspó(cid:225)rz(cid:266)dnych.
(cid:81) Przycinanie.
(cid:81) Przezroczysto(cid:286)(cid:252) i sk(cid:225)adanie obrazów.
(cid:81) Wskazówki operacji graficznych.
(cid:81) Czytanie i zapisywanie plików graficznych.
(cid:81) Operacje na obrazach.
(cid:81) Drukowanie.
(cid:81) Schowek.
(cid:81) Mechanizm „przeci(cid:261)gnij i upu(cid:286)(cid:252)”.
(cid:81) Integracja z macierzyst(cid:261) platform(cid:261).
Do tworzenia prostych rysunków mo(cid:298)emy wykorzysta(cid:252) metody klasy Graphics. Metody te
s(cid:261) wystarczaj(cid:261)ce w przypadku podstawowych apletów i aplikacji, ale nie nadaj(cid:261) si(cid:266) do zasto-
sowa(cid:276) wymagaj(cid:261)cych tworzenia skomplikowanych rysunków lub potrzebuj(cid:261)cych daleko id(cid:261)-
cej kontroli nad tworzon(cid:261) grafik(cid:261). Do takich zastosowa(cid:276) przeznaczona jest biblioteka Java 2D,
której mo(cid:298)liwo(cid:286)ci przedstawimy w bie(cid:298)(cid:261)cym rozdziale.
Kup książkęPoleć książkę506
Java. Techniki zaawansowane
Zajmiemy si(cid:266) tak(cid:298)e omówieniem implementacji drukowania w aplikacjach Java.
Omówimy te(cid:298) dwa sposoby przekazywania danych pomi(cid:266)dzy programami: schowek syste-
mowy oraz mechanizm „przeci(cid:261)gnij i upu(cid:286)(cid:252)”. Mog(cid:261) one by(cid:252) wykorzystywane do przekazy-
wania danych mi(cid:266)dzy dwiema aplikacjami Java lub pomi(cid:266)dzy aplikacj(cid:261) Java i programem
rodzimym danej platformy. Na koniec przedstawimy techniki pozwalaj(cid:261)ce zbli(cid:298)y(cid:252) zacho-
wanie aplikacji tworzonych w j(cid:266)zyku Java do aplikacji macierzystych platformy: tworzenie
ekranu powitania i korzystanie z zasobnika systemowego.
7.1. Potokowe tworzenie grafiki
JDK 1.0 dysponowa(cid:225) bardzo prostym mechanizmem tworzenia grafiki. Wystarczy(cid:225)o wybra(cid:252)
jedynie kolor i tryb rysowania, a nast(cid:266)pnie wywo(cid:225)a(cid:252) odpowiedni(cid:261) metod(cid:266) klasy Graphics,
na przyk(cid:225)ad drawRect lub fillOval. Tworzenie grafiki za pomoc(cid:261) Java 2D udost(cid:266)pnia wiele
wi(cid:266)cej mo(cid:298)liwo(cid:286)ci:
tworzenie ró(cid:298)norodnych figur,
(cid:81)
(cid:81) kontrol(cid:266) nad sposobem tworzenia obrysu figur,
(cid:81) wype(cid:225)nianie figur ró(cid:298)nymi kolorami i ich odcieniami, a tak(cid:298)e wzorami wype(cid:225)nie(cid:276),
(cid:81) metody przekszta(cid:225)ce(cid:276) figur — przesuni(cid:266)cia, skalowania, obrotu i zmian proporcji,
(cid:81) przycinanie figur do dowolnie wybranych obszarów,
(cid:81) wybór zasad sk(cid:225)adania obrazów opisuj(cid:261)cych sposób tworzenia kombinacji pikseli
nowej figury z istniej(cid:261)cymi ju(cid:298) pikselami t(cid:225)a,
(cid:81) wskazówki tworzenia grafiki umo(cid:298)liwiaj(cid:261)ce uzyskanie kompromisu pomi(cid:266)dzy
szybko(cid:286)ci(cid:261) tworzenia grafiki a jej jako(cid:286)ci(cid:261).
Aby narysowa(cid:252) figur(cid:266), nale(cid:298)y kolejno wykona(cid:252) nast(cid:266)puj(cid:261)ce kroki.
1. Musimy uzyska(cid:252) obiekt klasy Graphics2D, która jest klas(cid:261) pochodn(cid:261) klasy
Graphics. Pocz(cid:261)wszy od Java SE 1.2 metody, takie jak paint czy paintComponent,
automatycznie otrzymuj(cid:261) jako parametr obiekty klasy Graphics2D. Wystarczy
wi(cid:266)c wykona(cid:252) nast(cid:266)puj(cid:261)ce rzutowanie:
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D)g;
. . .
}
2. Korzystamy z metody setRenderingHints w celu ustalenia kompromisu mi(cid:266)dzy
szybko(cid:286)ci(cid:261) tworzenia grafiki a jej jako(cid:286)ci(cid:261).
RenderingHints hints = . . . ;
g2.setRenderingHints(hints);
Kup książkęPoleć książkęRozdzia(cid:196) 7. (cid:81) Zaawansowane mo(cid:209)liwo(cid:202)ci biblioteki AWT
507
3. Wywo(cid:225)ujemy metod(cid:266) setStroke w celu okre(cid:286)lenia rodzaju (cid:286)ladu p(cid:266)dzla, który
zostanie u(cid:298)yty do narysowania obrysu figury. Musimy wybra(cid:252) odpowiedni(cid:261)
grubo(cid:286)(cid:252) (cid:286)ladu p(cid:266)dzla oraz sposób jego pozostawiania (ci(cid:261)g(cid:225)y, przerywany).
Stroke stroke = . . . ;
g2.setStroke(stroke);
4. Wywo(cid:225)ujemy metod(cid:266) setPaint w celu okre(cid:286)lenia sposobu wype(cid:225)nienia obszaru
ograniczonego obrysem. Nale(cid:298)y wybra(cid:252) wype(cid:225)nienie sta(cid:225)ym kolorem, kolorem
o zmieniaj(cid:261)cych si(cid:266) odcieniach lub wzorem wype(cid:225)nienia.
Paint paint = . . . ;
g2.setPaint(paint);
5. Korzystamy z metody clip w celu okre(cid:286)lenia obszaru przyci(cid:266)cia.
Shape clip = . . . ;
g2.clip(clip);
6. Wywo(cid:225)ujemy metod(cid:266) transform, aby przekszta(cid:225)ci(cid:252) wspó(cid:225)rz(cid:266)dne u(cid:298)ytkownika
na wspó(cid:225)rz(cid:266)dne urz(cid:261)dzenia. Przekszta(cid:225)cenie takie stosujemy, je(cid:286)li w programie
(cid:225)atwiej nam pos(cid:225)ugiwa(cid:252) si(cid:266) w(cid:225)asnym uk(cid:225)adem wspó(cid:225)rz(cid:266)dnych ni(cid:298) wspó(cid:225)rz(cid:266)dnymi
pikseli.
AffineTransform transform = . . . ;
g2.transform(transform);
7. Wywo(cid:225)ujemy metod(cid:266) setComposite dla okre(cid:286)lenia zasady sk(cid:225)adania obrazów
opisuj(cid:261)cej tworzenie kombinacji nowych pikseli z ju(cid:298) istniej(cid:261)cymi.
Composite composite = . . . ;
g2.setComposite(composite);
8. Tworzymy figur(cid:266). Java 2D udost(cid:266)pnia w tym celu wiele obiektów i metod
umo(cid:298)liwiaj(cid:261)cych tworzenie kombinacji figur.
Shape shape = . . . ;
9. Rysujemy i (lub) wype(cid:225)niamy figur(cid:266). Je(cid:286)li narysujemy figur(cid:266), to powstanie
jedynie jej obrys, który nast(cid:266)pnie mo(cid:298)emy wype(cid:225)ni(cid:252).
g2.draw(shape);
g2.fill(shape);
Oczywi(cid:286)cie nie zawsze musimy realizowa(cid:252) wszystkie wymienione etapy. Parametry kontekstu
graficznego posiadaj(cid:261) warto(cid:286)ci domy(cid:286)lne wystarczaj(cid:261)ce w wielu przypadkach.
W kolejnych podrozdzia(cid:225)ach przedstawimy sposób tworzenia figur, definiowania (cid:286)ladów p(cid:266)dzla
i wype(cid:225)nie(cid:276), przekszta(cid:225)cenia i zasady sk(cid:225)adania obrazów.
Metody set nie wywo(cid:225)uj(cid:261) (cid:298)adnych operacji graficznych, a powoduj(cid:261) jedynie zmiany stanu
kontekstu graficznego. Podobnie utworzenie obiektu reprezentuj(cid:261)cego figur(cid:266) nie powoduje na-
rysowania jej reprezentacji. Operacje graficzne wykonywane s(cid:261) jedynie na skutek wywo(cid:225)ania
metod draw lub fill. W ich rezultacie reprezentacja graficzna figury tworzona jest w potoku
rysowania (patrz rysunek 7.1).
Kup książkęPoleć książkę508
Java. Techniki zaawansowane
Rysunek 7.1.
Potok rysowania
W potoku tym wykonywane s(cid:261) nast(cid:266)puj(cid:261)ce operacje prowadz(cid:261)ce do utworzenia reprezenta-
cji graficznej obiektu.
1. Tworzony jest obrys figury.
2. Obrys figury jest przekszta(cid:225)cany.
3. Obrys figury jest przycinany. Je(cid:286)li figura i obszar przyci(cid:266)cia nie maj(cid:261) cz(cid:266)(cid:286)ci wspólnej,
to przetwarzanie w potoku ko(cid:276)czy si(cid:266) na tym etapie.
4. Wype(cid:225)niany jest obszar figury powsta(cid:225)y po przyci(cid:266)ciu.
5. Piksele wype(cid:225)nionej figury sk(cid:225)adane s(cid:261) z istniej(cid:261)cymi pikselami t(cid:225)a. (Na rysunku 7.1
ko(cid:225)o stanowi fragment t(cid:225)a, na które nak(cid:225)adana jest figura fili(cid:298)anki).
W kolejnym podrozdziale przedstawimy sposób definiowania figur, a nast(cid:266)pnie przejdziemy
do omówienia kontekstów graficznych.
java.awt.Graphics2D 1.2
(cid:81) void draw(Shape s) rysuje obrys figury zgodnie z bie(cid:298)(cid:261)cymi parametrami
kontekstu graficznego.
(cid:81) void fill(Shape s) wype(cid:225)nia obrys figury zgodnie z bie(cid:298)(cid:261)cymi parametrami
kontekstu graficznego.
7.2. Figury
Klasa Graphics udost(cid:266)pnia szereg metod umo(cid:298)liwiaj(cid:261)cych rysowanie figur:
drawLine
drawRectangle
drawRoundRect
draw3DRect
drawPolygon
drawPolyline
drawOval
drawArc
Posiada tak(cid:298)e odpowiadaj(cid:261)ce im metody fill tworzenia wype(cid:225)nie(cid:276) figur. Wszystkie te metody
dost(cid:266)pne s(cid:261) w klasie Graphics ju(cid:298) od wersji JDK 1.0. Natomiast Java 2D proponuje inne, bar-
dziej obiektowe podej(cid:286)cie. Zamiast metod udost(cid:266)pnia odpowiednie klasy:
Line2D
Rectangle2D
RoundRectangle2D
Kup książkęPoleć książkęRozdzia(cid:196) 7. (cid:81) Zaawansowane mo(cid:209)liwo(cid:202)ci biblioteki AWT
509
Ellipse2D
Arc2D
QuadCurve2D
CubicCurve2D
GeneralPath
Wszystkie wymienione klasy implementuj(cid:261) interfejs Shape.
Zdefiniowana jest tak(cid:298)e klasa Point2D, która cho(cid:252) reprezentuje punkt o wspó(cid:225)rz(cid:266)dnych x i y,
a nie figur(cid:266), to u(cid:298)ywana jest podczas definiowania figur.
Aby uzyska(cid:252) reprezentacj(cid:266) graficzn(cid:261) figury, musimy wi(cid:266)c najpierw utworzy(cid:252) obiekt klasy
implementuj(cid:261)cej interfejs Shape, a nast(cid:266)pnie wywo(cid:225)a(cid:252) metod(cid:266) draw klasy Graphics2D.
Jak (cid:225)atwo zauwa(cid:298)y(cid:252), klasy Line2D, Rectangle2D, RoundRectangle2D, Ellipse2D i Arc2D odpo-
wiadaj(cid:261) metodom drawLine, drawRectangle, drawRoundRectangle, drawOval i drawArc klasy
Graphics. (Koncept „prostok(cid:261)ta w trzech wymiarach” zarzucono i dlatego metoda draw3DRect
nie posiada swego odpowiednika w postaci klasy). Java 2D udost(cid:266)pnia dodatkowo klasy
QuadCurve2D i CubicCurve2D reprezentuj(cid:261)ce krzywe drugiego i trzeciego stopnia. Omówimy je
w dalszej cz(cid:266)(cid:286)ci tego podrozdzia(cid:225)u. Nie istnieje natomiast bezpo(cid:286)redni odpowiednik metody
drawPolygon. Mo(cid:298)emy jednak do tworzenia wielok(cid:261)tów wykorzysta(cid:252) klas(cid:266) GeneralPath, która
opisuje (cid:286)cie(cid:298)ki z(cid:225)o(cid:298)one z odcinków, a tak(cid:298)e krzywych drugiego i trzeciego stopnia.
Klasy
Rectangle2D
RoundRectangle2D
Ellipse2D
Arc2D
s(cid:261) pochodnymi klasy RectangularShape. Cho(cid:252) elipsy i (cid:225)uki nie s(cid:261) prostok(cid:261)tami, to jednak
podczas ich definiowania wykorzystywany jest prostok(cid:261)t ograniczaj(cid:261)cy (patrz rysunek 7.2).
Rysunek 7.2.
Prostok(cid:241)t
ograniczaj(cid:241)cy
elips(cid:246) i (cid:228)uk
Ka(cid:298)da z klas, której nazwa zako(cid:276)czona jest przyrostkiem 2D, posiada dwie klasy pochodne
umo(cid:298)liwiaj(cid:261)ce okre(cid:286)lanie wspó(cid:225)rz(cid:266)dnych za pomoc(cid:261) warto(cid:286)ci typu float lub double. W ksi(cid:261)(cid:298)ce
Java. Podstawy spotkali(cid:286)my ju(cid:298) klasy Rectangle2D.Float i Rectangle2D.Double.
Ten sam schemat stosowany jest w przypadku pozosta(cid:225)ych klas, na przyk(cid:225)ad Arc2D.Float
i Arc2D.Double.
Implementacja wszystkich klas graficznych wykorzystuje w rzeczywisto(cid:286)ci wspó(cid:225)rz(cid:266)dne typu
float, poniewa(cid:298) reprezentacja tego typu zajmuje mniej miejsca i posiada wystarczaj(cid:261)c(cid:261) do-
k(cid:225)adno(cid:286)(cid:252) dla operacji graficznych. Poniewa(cid:298) jednak operowanie warto(cid:286)ciami typu float jest
w j(cid:266)zyku Java ma(cid:225)o wygodne, to wi(cid:266)kszo(cid:286)(cid:252) metod klas graficznych posiada parametry i zwraca
warto(cid:286)ci typu double. Zwykle wi(cid:266)c jedynie podczas tworzenia obiektu klasy graficznej wy-
biera(cid:252) mo(cid:298)emy pomi(cid:266)dzy konstruktorem o parametrach typu float i konstruktorem o para-
metrach typu double, na przyk(cid:225)ad:
Kup książkęPoleć książkę510
Java. Techniki zaawansowane
Rectangle2D floatRect
= new Rectangle2D.Float(5F, 10F, 7.5F, 15F);
Rectangle2D doubleRect
= new Rectangle2D.Double(5, 10, 7.5, 15);
Klasy Xxx2D.Float i Xxx2D.Double s(cid:261) klasami pochodnymi klas Xxx2D. Po utworzeniu obiektu
nie ma ju(cid:298) znaczenia, do której z klas pochodnych on nale(cid:298)y. Do przechowywania referen-
cji obiektu mo(cid:298)emy wtedy u(cid:298)ywa(cid:252) zmiennej o typie klasy bazowej, tak jak pokazali(cid:286)my to
w powy(cid:298)szym przyk(cid:225)adzie.
Jak (cid:225)atwo domy(cid:286)li(cid:252) si(cid:266) na podstawie nazw klas Xxx2D.Float i Xxx2D.Double, s(cid:261) one klasa-
mi wewn(cid:266)trznymi klas Xxx2D. Rozwi(cid:261)zanie takie ma na celu unikni(cid:266)cie nadmiaru nazw
klas zewn(cid:266)trznych.
Rysunek 7.3 przedstawia zale(cid:298)no(cid:286)ci pomi(cid:266)dzy klasami reprezentuj(cid:261)cymi figury. Pomini(cid:266)to
na nim podklasy Xxx2D.Float i Xxx2D.Double. Tradycyjne klasy dost(cid:266)pne zanim pojawi(cid:225)a
si(cid:266) Java 2D zaznaczono na nim za pomoc(cid:261) prostok(cid:261)tów wype(cid:225)nionych kolorem szarym.
Rysunek 7.3.
Zale(cid:276)no(cid:264)ci
pomi(cid:246)dzy klasami
reprezentuj(cid:241)cymi
figury
Kup książkęPoleć książkęRozdzia(cid:196) 7. (cid:81) Zaawansowane mo(cid:209)liwo(cid:202)ci biblioteki AWT
511
7.2.1. Wykorzystanie klas obiektów graficznych
W rozdziale 7. ksi(cid:261)(cid:298)ki Java. Podstawy pokazali(cid:286)my ju(cid:298) sposób wykorzystania klas Rec
(cid:180)tangle2D, Ellipse2D i Line2D. Teraz zajmiemy si(cid:266) wi(cid:266)c pozosta(cid:225)ymi klasami.
W przypadku klasy RoundRectangle2D musimy okre(cid:286)li(cid:252) wspó(cid:225)rz(cid:266)dne lewego górnego wierz-
cho(cid:225)ka figury, jej szeroko(cid:286)(cid:252) i wysoko(cid:286)(cid:252), a tak(cid:298)e szeroko(cid:286)(cid:252) i wysoko(cid:286)(cid:252) obszaru naro(cid:298)nika, który
powinien zosta(cid:252) zaokr(cid:261)glony (patrz rysunek 7.4). Na przyk(cid:225)ad wywo(cid:225)anie
RoundRectangle2D r = new RoundRectangle2D.Double(150, 200, 100, 50, 20, 20)
utworzy obiekt reprezentuj(cid:261)cy prostok(cid:261)t, którego naro(cid:298)niki b(cid:266)d(cid:261) zaokr(cid:261)glone za pomoc(cid:261) (cid:225)uków
okr(cid:266)gu o promieniu 20 pikseli.
Rysunek 7.4.
Parametry
prostok(cid:241)tów klasy
RoundRectangle2D
Tworz(cid:261)c (cid:225)uk, musimy okre(cid:286)li(cid:252) ograniczaj(cid:261)cy go prostok(cid:261)t, k(cid:261)t pocz(cid:261)tkowy, k(cid:261)t rozpinaj(cid:261)cy
(cid:225)uku (patrz rysunek 7.5) oraz sposób jego zamkni(cid:266)cia jako jedn(cid:261) z warto(cid:286)ci Arc2D.OPEN,
Arc2D.PIE, Arc2D.CHORD.
Arc2D a = new Arc2D(x, y, width, height, startAngle, arcAngle, closureType);
Rysunek 7.5.
Parametry (cid:228)uku
klasy Arc2D
Rysunek 7.6 pokazuje ró(cid:298)ne rodzaje zamkni(cid:266)cia (cid:225)uku.
Kup książkęPoleć książkę512
Java. Techniki zaawansowane
Rysunek 7.6.
Rodzaje (cid:228)uków
Je(cid:264)li (cid:228)uk jest eliptyczny, to wyznaczenie k(cid:241)tów (cid:228)uku nie jest trywialne. Dokumentacja
mówi na ten temat: „K(cid:241)ty podaje si(cid:246) wzgl(cid:246)dem prostok(cid:241)ta ograniczaj(cid:241)cego w taki
sposób, (cid:276)e k(cid:241)t 45 stopni zawsze wypada na linii biegn(cid:241)cej ze (cid:264)rodka elipsy do prawego
górnego wierzcho(cid:228)ka prostok(cid:241)ta ograniczaj(cid:241)cego. W rezultacie, je(cid:264)li prostok(cid:241)t ograni-
czaj(cid:241)cy jest wyra(cid:274)nie d(cid:228)u(cid:276)szy wzd(cid:228)u(cid:276) jednej osi, k(cid:241)ty do pocz(cid:241)tku i ko(cid:254)ca segmentu (cid:228)uku
b(cid:246)d(cid:241) zniekszta(cid:228)cone wzd(cid:228)u(cid:276) d(cid:228)u(cid:276)szej osi ograniczenia”. Niestety dokumentacja milczy
na temat sposobu wyznaczenia tego zniekszta(cid:228)cenia. A oto szczegó(cid:228)y:
Za(cid:228)ó(cid:276)my, (cid:276)e (cid:264)rodkiem (cid:228)uku jest pocz(cid:241)tek uk(cid:228)adu wspó(cid:228)rz(cid:246)dnych, a punkt (x, y) le(cid:276)y na
(cid:228)uku. Warto(cid:264)(cid:232) k(cid:241)ta zniekszta(cid:228)conego wyznaczymy wtedy w sposób podany poni(cid:276)ej.
skewedAngle = Math.toDegrees(Math.atan2(-y * height, x * width));
Otrzymana warto(cid:264)(cid:232) b(cid:246)dzie nale(cid:276)e(cid:232) do przedzia(cid:228)u od –180 do 180 stopni. W ten sposób
musimy obliczy(cid:232) warto(cid:264)(cid:232) pocz(cid:241)tkow(cid:241) i ko(cid:254)cow(cid:241) zniekszta(cid:228)conego k(cid:241)ta (cid:228)uku, a nast(cid:246)p-
nie wyznaczy(cid:232) ich ró(cid:276)nic(cid:246). Je(cid:264)li pocz(cid:241)tkowa warto(cid:264)(cid:232) k(cid:241)ta b(cid:241)d(cid:274) ró(cid:276)nica warto(cid:264)ci k(cid:241)ta
jest ujemna, to nale(cid:276)y doda(cid:232) do niej 360. Uzyskan(cid:241) warto(cid:264)(cid:232) pocz(cid:241)tkow(cid:241) k(cid:241)ta oraz
ró(cid:276)nic(cid:246) warto(cid:264)ci k(cid:241)ta przekazujemy konstruktorowi (cid:228)uku.
Uruchamiaj(cid:241)c przyk(cid:228)adowy program zamieszczony na ko(cid:254)cu tego podrozdzia(cid:228)u, mo(cid:276)emy
przekona(cid:232) si(cid:246), (cid:276)e opisana powy(cid:276)ej metoda daje w(cid:228)a(cid:264)ciwe wyniki (patrz rysunek 7.9).
Java 2D udost(cid:266)pnia krzywe drugiego i trzeciego stopnia. W rozdziale tym nie b(cid:266)dziemy zaj-
mowa(cid:252) si(cid:266) matematycznymi podstawami ich dzia(cid:225)ania. Sugerujemy praktyczne zapoznanie
si(cid:266) z ich mo(cid:298)liwo(cid:286)ciami za pomoc(cid:261) programu z listingu 7.1. Rysunki 7.7 i 7.8 przedstawiaj(cid:261)
krzywe drugiego i trzeciego stopnia, które tworzone s(cid:261) przez okre(cid:286)lenie ich ko(cid:276)ców oraz
jednego lub dwu punktów kontrolnych. Zmiana po(cid:225)o(cid:298)enia punktów kontrolnych umo(cid:298)liwia
zmian(cid:266) kszta(cid:225)tu krzywych.
Kup książkęPoleć książkęRozdzia(cid:196) 7. (cid:81) Zaawansowane mo(cid:209)liwo(cid:202)ci biblioteki AWT
513
Rysunek 7.7.
Krzywa drugiego
stopnia
Rysunek 7.8.
Krzywa trzeciego
stopnia
Parametrami konstruktorów krzywych drugiego i trzeciego stopnia s(cid:261) wspó(cid:225)rz(cid:266)dne ich ko(cid:276)ców
i punktów kontrolnych:
QuadCurve2D q = new QuadCurve2D.Double(startX, startY,
controlX, controlY, endX, endY);
CubicCurve2D c = new CubicCurve2D.Double(startX, startY,
control1X, control1Y, control2X, control2Y, endX, endY);
Krzywe drugiego stopnia nie s(cid:261) zbyt uniwersalne i dlatego w praktyce stosowane s(cid:261) rzadko.
Natomiast krzywe trzeciego stopnia (takie jak krzywe Beziera reprezentowane przez klas(cid:266)
CubicCurve2D) wykorzystywane s(cid:261) powszechnie. (cid:224)(cid:261)cz(cid:261)c je w (cid:225)a(cid:276)cuchy, w których koniec jed-
nej krzywej jest pocz(cid:261)tkiem nast(cid:266)pnej, mo(cid:298)emy tworzy(cid:252) skomplikowane kszta(cid:225)ty o dowol-
nym obrysie. Wi(cid:266)cej informacji na ten temat zawiera ksi(cid:261)(cid:298)ka Computer Graphics: Principles
and Practice, Second Edition in C autorstwa Jamesa D. Foleya, Andriesa van Dama, Stevena K.
Feinera i in. (Addison-Wesley, 1995).
Klasa GeneralPath umo(cid:298)liwia tworzenie dowolnych sekwencji z(cid:225)o(cid:298)onych z odcinków pro-
stych oraz krzywych drugiego i trzeciego stopnia. Wspó(cid:225)rz(cid:266)dne pocz(cid:261)tku takiego obiektu
okre(cid:286)lamy za pomoc(cid:261) metody moveTo, co pokazano poni(cid:298)ej.
GeneralPath path = new GeneralPath();
path.moveTo(10, 20);
Nast(cid:266)pnie rozbudowujemy sekwencj(cid:266) o odcinek linii prostej, krzywej drugiego lub trzeciego
stopnia, korzystaj(cid:261)c odpowiednio z metod lineTo, quadTo b(cid:261)d(cid:296) curveTo. W przypadku metody
lineTo musimy okre(cid:286)li(cid:252) jedynie koniec odcinka. W pozosta(cid:225)ych wypadkach najpierw przeka-
zujemy metodom wspó(cid:225)rz(cid:266)dne punktów kontrolnych, a nast(cid:266)pnie wspó(cid:225)rz(cid:266)dne ko(cid:276)ca seg-
mentu, na przyk(cid:225)ad:
Kup książkęPoleć książkę514
Java. Techniki zaawansowane
path.lineTo(20, 30);
path.curveTo(control1X, control1Y, control2X, control2Y, endX, endY);
Tworzon(cid:261) sekwencj(cid:266) mo(cid:298)emy zamkn(cid:261)(cid:252), korzystaj(cid:261)c z metody closePath. Rysuje ona odcinek
do punktu, którego wspó(cid:225)rz(cid:266)dne zawiera(cid:225)o ostatnie wywo(cid:225)anie metody moveTo.
Aby, korzystaj(cid:261)c z obiektu klasy GeneralPath, utworzy(cid:252) wielok(cid:261)t, nale(cid:298)y wywo(cid:225)a(cid:252) metod(cid:266)
moveTo, przekazuj(cid:261)c jej wspó(cid:225)rz(cid:266)dne pierwszego wierzcho(cid:225)ka, a nast(cid:266)pnie wywo(cid:225)ywa(cid:252) metod(cid:266)
lineTo, podaj(cid:261)c wspó(cid:225)rz(cid:266)dne kolejnych wierzcho(cid:225)ków. Wywo(cid:225)anie metody closePath spo-
woduje po(cid:225)(cid:261)czenie ostatniego z wierzcho(cid:225)ków z pierwszym. Tekst (cid:296)ród(cid:225)owy programu z lis-
tingu 7.1 pokazuje szczegó(cid:225)y tych operacji.
Listing 7.1. shape/ShapeTest.java
package shape;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
/**
* Program demonstruj(cid:261)cy tworzenie figur za pomoc(cid:261) Java 2D.
* @version 1.02 2007-08-16
* @author Cay Horstmann
*/
public class ShapeTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new ShapeTestFrame();
frame.setTitle( ShapeTest );
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
/**
* Ramka zawieraj(cid:261)ca list(cid:266) rozwijaln(cid:261) wyboru figury
* oraz panel, na którym rysowana jest jej reprezentacja.
*/
class ShapeTestFrame extends JFrame
{
public ShapeTestFrame()
{
final ShapeComponent comp = new ShapeComponent();
add(comp, BorderLayout.CENTER);
final JComboBox ShapeMaker comboBox = new JComboBox ();
comboBox.addItem(new LineMaker());
comboBox.addItem(new RectangleMaker());
Kup książkęPoleć książkęRozdzia(cid:196) 7. (cid:81) Zaawansowane mo(cid:209)liwo(cid:202)ci biblioteki AWT
515
comboBox.addItem(new RoundRectangleMaker());
comboBox.addItem(new EllipseMaker());
comboBox.addItem(new ArcMaker());
comboBox.addItem(new PolygonMaker());
comboBox.addItem(new QuadCurveMaker());
comboBox.addItem(new CubicCurveMaker());
comboBox.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
ShapeMaker shapeMaker = comboBox.getItemAt(comboBox.getSelectedIndex());
comp.setShapeMaker(shapeMaker);
}
});
add(comboBox, BorderLayout.NORTH);
comp.setShapeMaker((ShapeMaker) comboBox.getItemAt(0));
pack();
}
}
/**
* Komponent rysuj(cid:261)cy figur(cid:266)
* i umo(cid:298)liwiaj(cid:261)cy przesuwanie definiuj(cid:261)cych j(cid:261) punktów.
*/
class ShapeComponent extends JComponent
{
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200;
private Point2D[] points;
private static Random generator = new Random();
private static int SIZE = 10;
private int current;
private ShapeMaker shapeMaker;
public ShapeComponent()
{
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent event)
{
Point p = event.getPoint();
for (int i = 0; i points.length; i++)
{
double x = points[i].getX() - SIZE / 2;
double y = points[i].getY() - SIZE / 2;
Rectangle2D r = new Rectangle2D.Double(x, y, SIZE, SIZE);
if (r.contains(p))
{
current = i;
return;
}
}
}
public void mouseReleased(MouseEvent event)
{
Kup książkęPoleć książkę516
Java. Techniki zaawansowane
current = -1;
}
});
addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent event)
{
if (current == -1) return;
points[current] = event.getPoint();
repaint();
}
});
current = -1;
}
/**
* Inicjuje obiekt ShapeMaker losowo wybranym zbiorem punktów kontrolnych.
* @param aShapeMaker obiekt klasy ShapeMaker definiuj(cid:261)cy figur(cid:266)
* za pomoc(cid:261) zbioru punktów kontrolnych.
*/
public void setShapeMaker(ShapeMaker aShapeMaker)
{
shapeMaker = aShapeMaker;
int n = shapeMaker.getPointCount();
points = new Point2D[n];
for (int i = 0; i n; i++)
{
double x = generator.nextDouble() * getWidth();
double y = generator.nextDouble() * getHeight();
points[i] = new Point2D.Double(x, y);
}
repaint();
}
public void paintComponent(Graphics g)
{
if (points == null) return;
Graphics2D g2 = (Graphics2D) g;
for (int i = 0; i points.length; i++)
{
double x = points[i].getX() - SIZE / 2;
double y = points[i].getY() - SIZE / 2;
g2.fill(new Rectangle2D.Double(x, y, SIZE, SIZE));
}
g2.draw(shapeMaker.makeShape(points));
}
public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH,
(cid:180)DEFAULT_HEIGHT); }
}
/**
* Klasa abstrakcyjna reprezentuj(cid:261)ca figur(cid:266)
* za pomoc(cid:261) zbioru punktów kontrolnych.
* Jej konkretne klasy pochodne musz(cid:261) implementowa(cid:252)
* metod(cid:266) makeShape zwracaj(cid:261)c(cid:261) dany rodzaj figury.
*/
Kup książkęPoleć książkęRozdzia(cid:196) 7. (cid:81) Zaawansowane mo(cid:209)liwo(cid:202)ci biblioteki AWT
517
abstract class ShapeMaker
{
public abstract Shape makeShape(Point2D[] p);
private int pointCount;
/**
* Tworzy obiekt klasy ShapeMaker.
* @param aPointCount liczba punktów kontrolnych definiuj(cid:261)cych figur(cid:266).
*/
public ShapeMaker(int aPointCount)
{
pointCount = aPointCount;
}
/**
* Zwraca liczb(cid:266) punktów kontrolnych definiuj(cid:261)cych figur(cid:266).
* @return liczba punktów kontrolnych
*/
public int getPointCount()
{
return pointCount;
}
/**
* Tworzy figur(cid:266) na podstawie zbioru punktów.
* @param p punkty definiuj(cid:261)ce figur(cid:266)
* @return zdefiniowana figura
*/
public String toString()
{
return getClass().getName();
}
}
/**
* Tworzy odcinek linii prostej (cid:225)(cid:261)cz(cid:261)cy dwa punkty.
*/
class LineMaker extends ShapeMaker
{
public LineMaker()
{
super(2);
}
public Shape makeShape(Point2D[] p)
{
return new Line2D.Double(p[0], p[1]);
}
}
/**
* Tworzy prostok(cid:261)t rozpi(cid:266)ty za pomoc(cid:261) dwu naro(cid:298)ników.
*/
class RectangleMaker extends ShapeMaker
{
public RectangleMaker()
{
Kup książkęPoleć książkę518
Java. Techniki zaawansowane
super(2);
}
public Shape makeShape(Point2D[] p)
{
Rectangle2D s = new Rectangle2D.Double();
s.setFrameFromDiagonal(p[0], p[1]);
return s;
}
}
/**
* Tworzy zaokr(cid:261)glony prostok(cid:261)t rozpi(cid:266)ty za pomoc(cid:261) dwu naro(cid:298)ników.
*/
class RoundRectangleMaker extends ShapeMaker
{
public RoundRectangleMaker()
{
super(2);
}
public Shape makeShape(Point2D[] p)
{
RoundRectangle2D s = new RoundRectangle2D.Double(0, 0, 0, 0, 20, 20);
s.setFrameFromDiagonal(p[0], p[1]);
return s;
}
}
/**
* Tworzy elips(cid:266) zawart(cid:261) w prostok(cid:261)cie ograniczaj(cid:261)cym
* rozpi(cid:266)tym za pomoc(cid:261) dwu naro(cid:298)ników.
*/
class EllipseMaker extends ShapeMaker
{
public EllipseMaker()
{
super(2);
}
public Shape makeShape(Point2D[] p)
{
Ellipse2D s = new Ellipse2D.Do
Pobierz darmowy fragment (pdf)